java - termino - para que sirven los nucleos de un procesador
Hilos por procesador (7)
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 utiliza grupos de subprocesos , eso significa que el grupo de subprocesos administra la cantidad 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 tiene que tener en cuenta el número de subprocesos , sino que los gestiona mediante los algoritmos del grupo de subprocesos. Los grupos de subprocesos eligen diferentes algoritmos para servidores y máquinas de escritorio (SO).
Editar1: puede utilizar subprocesos explícitos si cree que el grupo de subprocesos no utiliza los recursos que tiene. Puede administrar el número de subprocesos explícitamente en ese caso.
En Java, ¿hay una forma programática de averiguar cuántos subprocesos concurrentes son compatibles con una CPU?
Actualizar
Para aclarar, no estoy tratando de martillar la CPU con hilos y soy consciente de la función Runtime.getRuntime (). AvailableProcessors (), que me proporciona parte de la información que estoy buscando.
Quiero averiguar si hay una forma de ajustar automáticamente el tamaño del grupo de subprocesos para que:
- si estoy ejecutando en un servidor de 1 año, obtengo 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 multiplicador arbitrario de 2).
- si, en cambio, utilizo un servidor Ultrasparc T2 de ocho núcleos (que admite 8 hilos por núcleo), obtengo 128 hilos (8 hilos por CPU x 8 CPU x el multiplicador arbitrario de 2)
- si despliego 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.
Cada procesador, o núcleo del 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 existe 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.
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.
Vea esta discusión .
No hay 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
Una CPU normalmente no plantea 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?
Runtime.availableProcessors devuelve la cantidad de procesadores lógicos (es decir, subprocesos de hardware) y no núcleos físicos. Ver CR 5048379 .
Un único núcleo de CPU no 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.
Te sugiero que hagas algunas pruebas de cómo el rendimiento en tu situación se amplía con el número de subprocesos por núcleo de CPU y decides en función de eso. Luego, cuando se ejecuta la aplicación, puede comprobar losProcesadores availableProcessors()
y decidir cuántos hilos debe engendrar. Hyperthreading hará que el núcleo único aparezca para el sistema operativo y todas las aplicaciones, incluidos 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.