2012-02-23 57 views
8

Java 1.6中用于Runtime.availableProcessors()的javadoc是令人愉快的无关紧要的。它只看硬件配置还是负载?它足够聪明,可以避免被超线程欺骗吗?它是否通过linux taskset命令尊重一组有限的处理器?Runtime.availableProcessors:它将返回什么?

我可以添加一个我自己的数据点:在这里有12个内核和超线程的计算机上,Runtime.availableProcessors()的确返回24,这在决定运行多少个线程时不是一个好数字。这台机器显然不是空闲的,所以它也不能以任何有效的方式来查看负载。

+0

文档明确指出其值可能会更改的事实使得它不太可能仅查看硬件配置。我的猜测是它返回可以并行运行的Java线程的数量。 – biziclop 2012-02-23 22:33:07

+0

Oracle/Sun过去曾撰写过“乐观”文档。我同意这个意思,但我正在捕鱼。 – bmargulies 2012-02-23 22:33:44

回答

1

AFAIK,它总是给你可用的CPU总数,即使那些不可用于调度的CPU。我有一个使用这个事实来查找保留的cpus的库。我读取/ proc/cpuinfo以及进程的默认线程关联性来确定可用的内容。

2

根据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; 
    // 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的特定。但我会想象在其他平台上这种行为至少会有点类似。

7

在Windows上,使用GetSystemInfo并且从返回的SYSTEM_INFO结构中使用dwNumberOfProcessors

这可以从OpenJDK源代码的void os::win32::initialize_system_info()int os::active_processor_count()os_windows.cpp中看到。

dwNumberOfProcessors,从MSDN文档说它报告“当前组中的逻辑处理器的数量”,这意味着超线程会增加报告的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文件说, '处理器的数量目前在线(可用)。'这不受流程的亲和力影响,并且也受超线程的影响。