Java1.6中的Runtime.availableProcessors()的javadoc是令人愉快的非特定的。它是只看硬件配置,还是也看负载?它是否足够聪明,可以避免被超线程愚弄?它是否通过linux taskset命令尊重有限的处理器集?
我可以添加一个我自己的数据点:在这里有12个核心和超线程的计算机上,Runtime.availableProcessors()确实返回24,这不是一个用来决定尝试运行多少线程的好数字。这台机器显然不是空闲的,所以它也不可能以任何有效的方式查看负载。
发布于 2012-02-24 07:03:48
AFAIK,它总是为您提供可用CPU的总数,即使那些不可用于调度的CPU也是如此。我有一个库,它使用这个事实来查找保留的cpus。我读取了/proc/cpuinfo和该进程的默认线程亲和性,以确定可用的线程。
发布于 2012-02-24 08:17:25
在Windows上,使用GetSystemInfo,并从返回的SYSTEM_INFO结构中使用dwNumberOfProcessors。
这可以从void os::win32::initialize_system_info()和int os::active_processor_count()中的os_windows.cpp的OpenJDK源代码中看出。
MSDN文档中的dwNumberOfProcessors表示,它报告“当前组中逻辑处理器的数量”,这意味着超线程将增加报告的CPU数量。
在Linux上,os::active_processor_count()使用sysconf
int os::active_processor_count() {
// Linux doesn't yet have a (official) notion of processor sets,
// so just return the number of online processors.
int online_cpus = ::sysconf(_SC_NPROCESSORS_ONLN);
assert(online_cpus > 0 && online_cpus <= processor_count(), "sanity check");
return online_cpus;
}其中_SC_NPROCESSORS_ONLN文档显示“当前在线(可用)的处理器数量”。这不受进程亲和力的影响,也受超线程的影响。
发布于 2012-02-24 07:10:28
根据Sun Bug 6673124的说法
Runtime.availableProcessors()使用的active_processor_count代码如下:
int os::active_processor_count() { int online_cpus = sysconf(_SC_NPROCESSORS_ONLN);pid_t pid = getpid();psetid_t pset = PS_NONE;//我们是在处理器集中运行吗?if (pset_bind(PS_QUERY,P_PID,pid,&pset) == 0) { if (pset != PS_NONE) { uint_t pset_cpus;//查询处理器集中cpus个数if (pset_info(pset,NULL,&pset_cpus,NULL) == 0) { assert(pset_cpus >0 && pset_cpus <= online_cpus,"sanity check");_processors_online = pset_cpus;返回pset_cpus;} //否则返回在线cpus数返回online_cpus;}
此特定代码可能是特定于Solaris的。但我可以想象,在其他平台上,这种行为至少会有些类似。
https://stackoverflow.com/questions/9422404
复制相似问题