2012-02-23 15 views
8

Il javadoc per Runtime.availableProcessors() in Java 1.6 è deliziosamente non specifico. Sta guardando solo la configurazione hardware o anche il carico? È abbastanza intelligente da evitare di essere ingannato dall'iperthreading? Rispetta un insieme limitato di processori tramite il comando linux taskset?Runtime.availableProcessors: cosa restituirà?

Posso aggiungere un punto dati personale: su un computer con 12 core e hyperthreading, Runtime.availableProcessors() restituisce infatti 24, che non è un buon numero da utilizzare per decidere quanti thread provare a eseguire. La macchina non era chiaramente inattiva, quindi non avrebbe potuto nemmeno guardare il carico in modo efficace.

+0

Il fatto che la documentazione menzioni esplicitamente che il suo valore potrebbe cambiare rende improbabile che stia osservando solo la configurazione hardware. La mia ipotesi è che restituisce il numero di thread Java che possono essere eseguiti in parallelo. – biziclop

+0

Oracle/Sun hanno scritto documenti "ottimistici" in passato. Sono d'accordo sull'implicazione, ma sto cercando i fatti. – bmargulies

risposta

1

AFAIK, fornisce sempre il numero totale di CPU disponibili, anche quelle non disponibili per la pianificazione. Ho una libreria che usa questo fatto per trovare cpus riservati. Ho letto/proc/cpuinfo e l'affinità di thread predefinita del processo per capire cosa è disponibile.

2

Secondo Sun Bug 6673124:

Il codice per active_processor_count, utilizzato da Runtime.availableProcessors() è il seguente:

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

Questo codice particolare può essere Solaris-specifico. Ma immagino che il comportamento sarebbe almeno in qualche modo simile su altre piattaforme.

7

Su Windows, viene utilizzato GetSystemInfo e dalla struttura restituita SYSTEM_INFO.

Questo può essere visto da void os::win32::initialize_system_info() e int os::active_processor_count() in os_windows.cpp del codice sorgente OpenJDK.

dwNumberOfProcessors, dalla documentazione MSDN indica che riporta "Il numero di processori logici nel gruppo corrente", il che significa che l'hyperthreading aumenterà il numero di CPU segnalate.

Su Linux, utilizza 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; 
} 

Dove _SC_NPROCESSORS_ONLN documentazione dice 'Il numero di processori in linea attualmente (disponibile).' Questo non è influenzato dall'affinità del processo, ed è anche influenzato dall'hyperthreading.

Problemi correlati