论坛首页 Java企业应用论坛

JAVA 多核 和多线程小议

浏览 8663 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-10-11  

最近在论坛里看到有人讨论多核,那么,

多核和多线程有啥关联呢?

我做了个实验,
实现环境:
AMD Athlon(tm) 64 X2 Dual Core
Ubuntu i386/内核: linux 2.6.32-25
OpenJDK6

1.Main函数里启动一个线程时候, 一个CPU 100%

2.Main函数里启动两个线程的时候,2个CPU 100%

3.Main 函数里1个线程,但同时启动2次,和效果2类似


结论:系统会自动调配CPU,而且发现系统会自动使用 2个CPU中利用率较小的CPU。
即,多核CPU运行多线程程序,如果编程时候没有指定CPU信息,OS会负责CPU内核的调度和管理,不需要考虑OS的多核CPU调度的。但是如果自己想 均衡多核CPU的负载,在创建线程的时候,可以指定线程的CPU亲和性(CPU Affinity),使用如 linux c api:sched_setaffinity,windows c api:SetProcessAffinityMask、SetThreadAffinityMask函数,可以实现干预OS对线程的调度,均衡CPU负载。

附:

Java并发编程实践

在指定cpu的核心上执行线程(c/c++): http://www.cppblog.com/Khan/archive/2009/12/29/104384.html

利用多核多线程进行程序优化 :http://linux.net527.cn/Linuxwendang/xitongguanliyuan/3362.html
那么JAVA呢?

In the JRockit JVM Management API you can at least suggest the process affinity. Not sure if it is respected on the OS you're running. See http://e-docs.bea.com/jrockit/releases/R27/javadoc/manapi/docs/com/bea/jvm/JVM.html#suggestProcessAffinity(java.util.Collection) for more information. 

JVM jvm = JVMFactory.getJVM();
List cpus = new ArrayList();
for(Iterator it = JVMFactory.getJVM().getProcessAffinity().iterator();it.hasNext();)
{
CPU cpu = (CPU) it.next();
jvm.suggestProcessAffinity(cpus);
}

You can find JRockit here. 
http://www.oracle.com/technology/software/products/jrockit/index.html



===================================
I used taskset on my 4 cpu machine, and by using:
taskset -pc 0 java net.tilialacus.BusyThreads
I gbound all threads to cpu 0. (BusyThreads just runs a few threads with
while(true);

However, if I started the process first, then I have to bind all threads
manually to the CPU. Using ps -eLf I could list all threads (10 or so)
and I could bind each of them separately. I didn't find a way for
taskset to climb the process/thread tree automatically.

   发表时间:2010-10-11  
如果在NUMA结构的CPU中,采用了很多锁保护共享内存数据,可以尝试将这个进程taskset到一颗CPU上,将cpu中的cache数据访问固定在本地,会进一步提高性能。
0 请登录后投票
   发表时间:2010-10-11  
cauherk 写道
如果在NUMA结构的CPU中,采用了很多锁保护共享内存数据,可以尝试将这个进程taskset到一颗CPU上,将cpu中的cache数据访问固定在本地,会进一步提高性能。

谢谢。
刚刚查了下NUMA, 即 非一致存储访问结构: Non-Uniform Memory Access,具有独立的本地内存,每个 CPU 可以访问整个系统的内存,但访问本地内存的速度将远远高于访问远地内存 ( 系统内其它节点的内存 ) 的速度。

海量并行处理结构 (MPP : Massive Parallel Processing) 更适合数据仓库环境
0 请登录后投票
   发表时间:2010-10-11  
如果某个jvm实现不使用本地线程,可能就不会有这样的效果,java虚拟机规范貌似没有规定jvm实现一定要用本地线程

本地线程在不同的操作系统上效果也是不一样的



楼主的测试是否过于片面?!
0 请登录后投票
   发表时间:2010-10-11  
freish 写道
如果某个jvm实现不使用本地线程,可能就不会有这样的效果,java虚拟机规范貌似没有规定jvm实现一定要用本地线程

本地线程在不同的操作系统上效果也是不一样的



楼主的测试是否过于片面?!

恩,我也觉得测试是片面的,所以,欢迎指正和讨论。
0 请登录后投票
   发表时间:2010-10-12  
freish 写道
如果某个jvm实现不使用本地线程,可能就不会有这样的效果,java虚拟机规范貌似没有规定jvm实现一定要用本地线程

本地线程在不同的操作系统上效果也是不一样的



楼主的测试是否过于片面?!



jvm不使用本地线程 ? 那是在什么项目中才会有? 淘宝?  云计算? IBM ?
0 请登录后投票
   发表时间:2010-12-15  
楼主能否说说
多核 以及 多服务器的负载均衡 问题
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics