Java 1.6中Runtime.availableProcessors()
的javadoc非常不明确。它只关注硬件配置,还是负载?它是否足够智能以避免被超线程所愚弄?它是否通过linux taskset
命令尊重一组有限的处理器?
我可以添加一个我自己的数据点:在这里有12个内核和超线程的计算机上,Runtime.availableProcessors()确实返回24,这不是一个很好的数字,用于决定尝试运行多少个线程。机器显然没有死机,因此它也无法以任何有效的方式查看负载。
答案 0 :(得分:8)
在Windows上,使用GetSystemInfo并从返回的dwNumberOfProcessors
结构中SYSTEM_INFO
。
这可以从OpenJDK源代码的void os::win32::initialize_system_info()
中的int os::active_processor_count()
和os_windows.cpp
看出。
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
文档说明&#39;当前在线(可用)的处理器数量。&#39;这不受过程亲和力的影响,也受超线程的影响。
答案 1 :(得分:2)
active_processor_count
使用的Runtime.availableProcessors()
代码如下:int os::active_processor_count() { int online_cpus = sysconf(_SC_NPROCESSORS_ONLN); pid_t pid = getpid(); psetid_t pset = PS_NONE; // Are we running in a processor set? if (pset_bind(PS_QUERY, P_PID, pid, &pset) == 0) { if (pset != PS_NONE) { uint_t pset_cpus; // Query number of cpus in processor set if (pset_info(pset, NULL, &pset_cpus, NULL) == 0) { assert(pset_cpus > 0 && pset_cpus <= online_cpus, "sanity check"); _processors_online = pset_cpus; return pset_cpus; } } } // Otherwise return number of online cpus return online_cpus; }
此特定代码可能是特定于Solaris的。但我认为这种行为在其他平台上至少会有些相似。
答案 2 :(得分:1)
AFAIK,它总是为您提供可用CPU的总数,即使那些不可用于调度的CPU也是如此。我有一个库,使用这个事实来找到保留的cpus。我读取了/ proc / cpuinfo和进程的默认线程关联,以确定可用的内容。