2012-02-23 32 views
8

Jawadok dla Runtime.availableProcessors() w Javie 1.6 jest uroczo niespecyficzny. Czy chodzi tylko o konfigurację sprzętu, czy też o obciążenie? Czy jest wystarczająco inteligentny, aby nie dać się zwieść hiperwentylacji? Czy respektuje ograniczony zestaw procesorów za pomocą polecenia linux taskset?Runtime.availableProcessors: co zamierza powrócić?

Mogę dodać jeden punkt danych: na komputerze z 12 rdzeniami i hyperthreading, Runtime.availableProcessors() rzeczywiście zwraca 24, co nie jest dobrą liczbą do określenia liczby wątków, które mają zostać uruchomione. Maszyna najwyraźniej nie była martwa, więc nie mogła równie dobrze spoglądać na ładunek.

+0

Fakt, że dokumentacja wyraźnie mówi o tym, że jego wartość może ulec zmianie, sprawia, że ​​jest mało prawdopodobne, aby patrzył tylko na konfigurację sprzętową. Domyślam się, że zwraca liczbę wątków Java, które mogą być uruchomione równolegle. – biziclop

+0

Oracle/Sun napisało "optymistyczny" dokument w przeszłości. Zgadzam się co do implikacji, ale łowię fakty. – bmargulies

Odpowiedz

1

AFAIK, zawsze daje całkowitą liczbę dostępnych procesorów, nawet te niedostępne do planowania. Mam bibliotekę, która wykorzystuje ten fakt do znalezienia zarezerwowanego cpus. Przeczytałem/proc/cpuinfo i domyślne powinowactwo wątku do procesu, aby ustalić, co jest dostępne.

2

Według Sun Bug 6673124:

Kod dla active_processor_count stosowane przez Runtime.availableProcessors() jest następujący:

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; 
} 

Ten konkretny kod może być specyficzne Solaris. Ale wyobrażam sobie, że zachowanie to byłoby co najmniej nieco podobne na innych platformach.

7

W systemie Windows jest używana GetSystemInfo i dwNumberOfProcessors ze zwróconej struktury SYSTEM_INFO.

Można to zobaczyć z void os::win32::initialize_system_info() i int os::active_processor_count() w os_windows.cpp kodu źródłowego OpenJDK.

dwNumberOfProcessors, z dokumentacji MSDN mówi, że zgłasza "Liczba procesorów logicznych w bieżącej grupie", co oznacza, że ​​hyperthreading zwiększy liczbę zgłaszanych procesorów.

W systemie Linux os::active_processor_count() wykorzystuje 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; 
} 

Gdzie _SC_NPROCESSORS_ONLN dokumentacja mówi "Liczba procesorów aktualnie w trybie online (dostępny). Nie wpływa na to powinowactwo procesu, a także na hyperthreading.

Powiązane problemy