2012-02-23 9 views
8

El javadoc para Runtime.availableProcessors() en Java 1.6 es deliciosamente inespecífico. ¿Está mirando solo a la configuración del hardware, o también a la carga? ¿Es lo suficientemente inteligente como para evitar ser engañado por hyperthreading? ¿Respeta un conjunto limitado de procesadores a través del comando linux taskset?Runtime.availableProcessors: ¿qué va a devolver?

Puedo agregar un punto de datos propio: en una computadora aquí con 12 núcleos e hyperthreading, Runtime.availableProcessors() de hecho devuelve 24, que no es un buen número para decidir cuántos hilos tratar de ejecutar. La máquina claramente no estaba inactiva, por lo que tampoco pudo haber estado mirando la carga de ninguna manera efectiva.

+0

El hecho de que la documentación mencione explícitamente que su valor puede cambiar hace que sea poco probable que solo esté mirando la configuración del hardware. Supongo que devuelve el número de subprocesos de Java que se pueden ejecutar en paralelo. – biziclop

+0

Oracle/Sun ha escrito documentos 'optimistas' en el pasado. Estoy de acuerdo con la implicación, pero estoy buscando hechos. – bmargulies

Respuesta

1

AFAIK, siempre le da la cantidad total de CPU disponibles, incluso aquellas que no están disponibles para la programación. Tengo una biblioteca que usa este hecho para encontrar cpus reservados. Leí el/proc/cpuinfo y la afinidad predeterminada del subproceso del proceso para determinar qué está disponible.

2

Según Sun Bug 6673124:

El código para active_processor_count, utilizado por Runtime.availableProcessors() es como sigue:

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

Este código particular puede ser Solaris-específico. Pero me imagino que el comportamiento sería al menos similar en otras plataformas.

7

En Windows, se utiliza GetSystemInfo y dwNumberOfProcessors de la estructura SYSTEM_INFO devuelta.

Esto puede verse desde void os::win32::initialize_system_info() y int os::active_processor_count() en os_windows.cpp del código fuente de OpenJDK.

dwNumberOfProcessors, de la documentación de MSDN dice que informa 'El número de procesadores lógicos en el grupo actual', lo que significa que hyperthreading aumentará la cantidad de CPU informadas.

En Linux, os::active_processor_count() utiliza 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; 
} 

Dónde _SC_NPROCESSORS_ONLN documentación dice 'El número de procesadores en línea (disponible).' Esto no se ve afectado por la afinidad del proceso, y también se ve afectado por hyperthreading.

Cuestiones relacionadas