2008-10-18 13 views
23

En Java, ¿hay una forma programática de averiguar cuántos subprocesos concurrentes admite una CPU?Hilos por procesador

actualización

Para aclarar, yo no estoy tratando de clavar la CPU con hilos y estoy consciente de Runtime.getRuntime(). AvailableProcessors función(), que me proporciona parte de la información I' Estoy buscando.

quiero saber si hay una manera de sintonizar automáticamente el tamaño del grupo de subprocesos de manera que:

  • si estoy corriendo en un servidor de 1 año de edad, me sale 2 hilos (1 hilo por CPU x un multiplicador arbitrario de 2)
  • si cambio a un quad core Intel i7 dentro de dos años (que admite 2 hilos por núcleo), obtengo 16 hilos (2 hilos lógicos por CPU x 4 CPU x el arbitrario multiplicador de 2).
  • si, en lugar, utilizo un servidor UltraSPARC T2 ocho núcleo (que soporta 8 hilos por núcleo), consigo 128 hilos (8 hilos por CPU x 8 CPU x el multiplicador arbitrario de 2)
  • si desplegar el el mismo software en un clúster de 30 máquinas diferentes, potencialmente compradas en diferentes años, no necesito leer las especificaciones de la CPU y configurar las opciones de configuración para cada una de ellas.

Respuesta

1

Una CPU normalmente no supone un límite en el número de subprocesos, y no creo que Java tenga un límite en el número de subprocesos nativos (kernel) que generará.

Hay un método availableProcessors() en la clase Runtime. ¿Es eso lo que estás buscando?

+0

Leí en alguna parte que hay un límite estricto (que Java impone) en el rango de 32k. De manera realista, tu aplicación se detendrá mucho antes de eso. –

+0

Sí, probablemente. Java no está diseñado para usar hilos de miles. – JesperE

+0

Supongo que cuando dices límites, te refieres a concurrencia emulada (a diferencia de la concurrencia de hardware verdadero). No es ese el caso? – Leo

19

Un único núcleo de CPU que no requiere hyperthreading siempre puede ejecutar un hilo. Puede engendrar muchos hilos y la CPU cambiará entre ellos.

El mejor número depende de la tarea. Si se trata de una tarea que requerirá mucha potencia de la CPU y no requiere ninguna E/S (como el cálculo de pi, números primos, etc.), es probable que sea mejor 1 subproceso por CPU. Si la tarea está más vinculada a E/S. como procesar la información del disco, entonces probablemente obtendrá un mejor rendimiento al tener más de un hilo por CPU. En este caso, el acceso al disco puede tener lugar mientras la CPU está procesando la información de una lectura de disco anterior.

Le sugiero que realice algunas pruebas de cómo el rendimiento en su situación se amplía con el número de subprocesos por núcleo de CPU y decida en función de eso. Luego, cuando se ejecuta la aplicación, puede marcar availableProcessors() y decidir cuántos hilos debe engendrar. Hyperthreading hará que el núcleo único aparezca para el sistema operativo y todas las aplicaciones, incluyendo availableProcessors(), como 2 CPU, por lo que si su aplicación puede usar hyperthreading obtendrá el beneficio. Si no, entonces el rendimiento sufrirá un poco, pero probablemente no lo suficiente como para hacer que valga la pena el esfuerzo extra de la restauración.

+0

Ya estoy usando availableProcessors para obtener la cantidad de CPU. Lo que me gustaría hacer es afinar aún más el tamaño de mi grupo de subprocesos para que, si hay HT de Intel o alguna otra tecnología de subprocesamiento múltiple disponible, pueda aprovecharlo. – Leo

+5

Intel HT se mostrará en el valor devuelto por availableProcessors. Si tiene una CPU de doble núcleo con HT, entonces losProcesadores disponibles devolverán 4. – pipTheGeek

+0

Votación ascendente para los procesadores disponibles devolverá el número de rutas de subprocesamiento y no los núcleos.Incluso las herramientas del sistema operativo ven esto, por ejemplo, compruebe el administrador de tareas de Windows en el historial de uso y se le informará que tiene 4 CPU para 2 núcleos con hyperthreading. Se puede ver la misma información en Linux y dado que JVM usa subprocesos nativos (en casi todas las implementaciones), Java pensará lo mismo que su sistema operativo. – PSIXO

0

Esta es una función de la VM, no de la CPU. Tiene que ver con la cantidad de montón consumido por hilo. Cuando te quedes sin espacio en el montón, ya has terminado. Al igual que con otros carteles, sospecho que su aplicación queda inutilizable antes de este punto si supera el espacio de almacenamiento dinámico debido al conteo de hilos.

Ver esto discussion.

1

Conceptos básicos: La aplicación cargada en la memoria es un proceso .Un proceso tiene al menos 1 hilo. Si lo desea, puede crear tantos hilos como desee en un proceso (teóricamente). Por lo tanto, el número de subprocesos depende de usted y de los algoritmos que use.

Si usa subprocesos, eso significa que el grupo de subprocesos administra el número de subprocesos porque la creación de un subproceso consume recursos. Los grupos de subprocesos reciclan hilos. Esto significa que muchos hilos lógicos pueden ejecutarse dentro de un hilo físico uno tras otro.

No es necesario tener en cuenta el número de hilos , es administrado por los algoritmos del grupo de subprocesos. Los grupos de subprocesos eligen diferentes algoritmos para servidores y máquinas de escritorio (SO).

Edit1: Usted puede utilizar discusiones explícitas si usted piensa grupo de subprocesos no utiliza los recursos que tiene. Puede administrar el número de subprocesos explícitamente en ese caso.

+0

¿La afirmación de Intel i7 de 2 subprocesos lógicos por núcleo (u 8 subprocesos por núcleo en el caso de Sun T2) no proporciona ninguna ventaja adicional para las aplicaciones de subprocesos múltiples más allá de lo que proporciona el hardware multinúcleo? Si eso es cierto para todos los fabricantes de CPU, entonces availableProcessors() es todo lo que necesito. – Leo

+0

Me resulta difícil creer que mi aplicación se quede atascada con un simple grupo de 2 subprocesos por núcleo cuando se ejecute en una máquina de 8 subprocesos por núcleo. – Leo

+0

Tienes que considerar la cantidad de hilos. La mayoría de los grupos de subprocesos (muchos servidores de aplicaciones, Java ExecutorService integrado) requieren una configuración explícita del límite superior del subproceso. – erickson

1

Cada procesador, o núcleo de procesador, puede hacer exactamente 1 cosa a la vez. Con hyperthreading, las cosas cambian un poco, pero la mayor parte sigue siendo verdad, y por eso mi máquina HT en el trabajo casi nunca supera el 50%, e incluso cuando está al 100%, no está procesando el doble de una vez .

Probablemente solo deba realizar algunas pruebas en las arquitecturas comunes en las que planea implementar para determinar cuántos subprocesos desea ejecutar en cada CPU. Solo usar 1 hilo puede ser demasiado lento si está esperando muchas E/S. La ejecución de una gran cantidad de subprocesos ralentizará las cosas, ya que el procesador tendrá que cambiar los hilos más a menudo, lo que puede ser bastante costoso. No estoy seguro de si hay algún límite fijo para la cantidad de subprocesos que puede ejecutar, pero me aseguro de que su aplicación probablemente se desvanezca debido a demasiada conmutación de subprocesos antes de que alcance cualquier tipo de límite estricto. En última instancia, debe dejarlo como una opción en el archivo de configuración, para que pueda sintonizar su aplicación fácilmente en cualquier procesador en el que lo esté ejecutando.

+0

Encontraría un poco extraño si no pudiera ejecutar 2 subprocesos de Java al mismo tiempo en una CPU que dice que admite dos subprocesos por núcleo. ¿Está equivocado mi entendimiento de las afirmaciones de los fabricantes de CPU? – Leo

4

No existe una forma estándar de obtener el número de subprocesos admitidos por núcleo de CPU dentro de Java. Su mejor opción es obtener una utilidad Java CPUID que le proporcione la información del procesador y, a continuación, hacerla coincidir con una tabla que deberá generar que le proporciona los hilos por núcleo que el procesador administra sin un cambio de contexto "real".

-Adán

+0

De todos los Google que he estado haciendo, ese parece ser el caso :( Gracias por la idea de la utilidad CPUID. No es exactamente ideal, pero está lo suficientemente cerca de lo que deseo. – Leo

23

Runtime.availableProcessors devuelve el número de procesadores lógicos (es decir, hilos de hardware) no núcleos físicos. Ver CR 5048379.

+0

¡Ah perfecto! acaba de hacer mi día :) – Leo

+10

@Leo luego acepta su respuesta ... – rana

Cuestiones relacionadas