2011-06-09 21 views
5

Estoy ejecutando algunas pruebas de rendimiento para determinar los tiempos de respuesta y la capacidad de manejar la concurrencia con varias configuraciones de cpu/ram/os. Un hallazgo interesante al que me he encontrado es que parece que un solo JVM tiene un mejor rendimiento con 4 núcleos que con 2 núcleos (no es sorprendente), pero agregar más núcleos más allá del 4º núcleo no da como resultado mejoras significativas . Pero luego, agregar otra instancia de jvm con un equilibrador de carga (mismo hardware) resultó en una mejora dramática.¿Cuántos núcleos de CPU puede utilizar un solo proceso de Java?

Parece que un proceso individual está limitado en la cantidad de núcleos que puede utilizar, tal vez debido a una limitación en la cantidad de hilos del sistema operativo que un proceso puede generar a la vez. Este es un entorno de 64 bits.

Im usando Tomcat y traté de cambiar el atributo "maxThreads", pero eso no hizo una diferencia para la cantidad de concurrencia que estoy tratando de manejar.

¿Alguna otra razón que podría explicarse?

+1

"Depende de lo que se está aprovechando de la moneda y cómo"? (¿O hay un problema más arraigado como solo poder engendrar hilos en 4 núcleos? ¿Alguna afinidad?) –

+0

¿Qué JVM estás usando? Parece poco probable que haya una limitación en la cantidad de núcleos que pueden utilizarse. –

+0

Tal vez estés obligado a algo más que CPU pura, p. un grupo de base de datos. O las sesiones de usuario de Tomcat. – nos

Respuesta

2

En general, una aplicación Java intentará programar cada hilo activo en un núcleo separado. Esto incluye los hilos de GC. Si la aplicación no estaba unida a la CPU en primer lugar, entonces agregar más núcleos no haría ninguna diferencia ya que los hilos están bloqueados por algo.

Para una aplicación web, las cosas se vuelven un poco más complicadas. Aumentar el tamaño del grupo de subprocesos no hará ninguna diferencia si hay algo más que los subprocesos están esperando, como una base de datos de un grupo de conexiones de base de datos, por ejemplo. Debe observar cuidadosamente su equilibrador de carga y las configuraciones de Tomcat. Si no se ajustan correctamente, es muy fácil tener el comportamiento que describes.

No me preocuparía demasiado que la JVM esté limitada en el número de subprocesos que puede tener. De forma rutinaria veo más de 600 subprocesos en cada JVM en nuestro sistema de producción. Usamos 8 máquinas centrales y las solicitudes son de corta duración, por lo que la mayoría de estos hilos están en un estado de espera de E/S.

+0

"una aplicación Java intentará programar cada hilo activo en un núcleo separado" ... JVMs no programe hilos, el planificador del sistema operativo decide qué hilos obtienen el tiempo de la CPU y en qué núcleos se ejecutan. – Matt

+0

Es cierto que yo podría ser un cuello de botella (aunque no es mi caso). Mi experimento indica que dos procesos de Java pueden usar una pieza de hardware de manera más efectiva que un solo proceso en el mismo hardware. Tengo curiosidad por saber si eso es de esperar y si es debido a las limitaciones impuestas por el sistema operativo sobre cuánto tiempo se puede dar un solo proceso. – Kailash

+0

@Matt Verdadero si está utilizando subprocesos nativos (¡lo que debería ser!). No necesariamente si estás usando hilos verdes. http://en.wikipedia.org/wiki/Green_threads –

Cuestiones relacionadas