2008-09-22 14 views
7

que estoy experimentando un problema en una máquina de prueba que ejecuta Red Hat Linux (versión del núcleo es 2.4.21-37.ELsmp) usando Java 1.6 (1.6.0_02 o 1.6.0_04) El problema es que, una vez que se crea un cierto número de subprocesos en un solo grupo de subprocesos, el sistema operativo no quiere o no puede crear más.baja Java proceso único límite de la rosca en Red Hat Linux

Esto parece ser específica para Java creando hilos, como el programa de C thread-límite fue capaz de crear sobre 1.5k hilos. Además, esto no ocurre con Java 1.4 JVM ... puede crear más de 1.4k hilos, aunque obviamente se manejan de forma diferente con respecto al sistema operativo.

En este caso, el número de hilos que está cortando a es un mero 29 hilos. Esto se puede probar con un programa Java simple que solo crea subprocesos hasta que obtiene un error y luego imprime la cantidad de subprocesos que creó. El error es un

java.lang.OutOfMemoryError: unable to create new native thread

Esto parece ser afectada por cosas tales como el número de hilos en uso por otros procesos o usuarios o la cantidad total de memoria que el sistema está utilizando en ese momento. Las configuraciones de JVM como Xms, Xmx y Xss tampoco parecen cambiar nada (lo que se espera, considerando que el problema parece ser la creación de hilos del sistema operativo nativo).

La salida de "ulimit -a" es el siguiente: no parece límite proceso

 
core file size  (blocks, -c) 0 
data seg size   (kbytes, -d) unlimited 
file size    (blocks, -f) unlimited 
max locked memory  (kbytes, -l) 4 
max memory size  (kbytes, -m) unlimited 
open files     (-n) 1024 
pipe size   (512 bytes, -p) 8 
stack size   (kbytes, -s) 10240 
cpu time    (seconds, -t) unlimited 
max user processes   (-u) 7168 
virtual memory  (kbytes, -v) unlimited 

El usuario a ser el problema. La búsqueda de información sobre lo que podría estar equivocado no ha aparecido mucho, pero this post parece indicar que al menos algunos núcleos de Red Hat limitan un proceso de 300 MB de memoria asignada a la pila, y al 10 MB por hilo de pila, parece que el problema podría estar allí (aunque parece extraño y poco probable también).

He intentado cambiar el tamaño de la pila con "ulimit -s" para probar esto, pero cualquier valor distinto de 10240 y la JVM no comienza con un error de:

Error occurred during initialization of VM 
Cannot create VM thread. Out of system resources.

general puedo conseguir alrededor de Linux, pero realmente no sé mucho sobre la configuración del sistema, y ​​no he podido encontrar nada que aborde específicamente este tipo de situación. Cualquier idea sobre qué sistema o configuración de JVM podría estar causando esto sería apreciada.

Ediciones: Ejecutando el programa de límite de hilos mencionado por plinth, no hubo falla hasta que intentó crear el subproceso 1529th.

El problema tampoco ocurrió con una JVM 1.4 (ocurre con las JVM 1.6.0_02 y 1.6.0_04, no se puede probar con una JVM 1.5 en este momento).

El código para la prueba de hilo que estoy usando es el siguiente:

public class ThreadTest { 

    public static void main(String[] pArgs) throws Exception { 

     try { 
     // keep spawning new threads forever 
     while (true) { 
      new TestThread().start(); 
     } 
     } 
     // when out of memory error is reached, print out the number of 
     // successful threads spawned and exit 
     catch (OutOfMemoryError e) { 
     System.out.println(TestThread.CREATE_COUNT); 
     System.exit(-1); 
     } 
    } 

    static class TestThread extends Thread { 
     private static int CREATE_COUNT = 0; 
     public TestThread() { 
     CREATE_COUNT++; 
     } 
     // make the thread wait for eternity after being spawned 
     public void run() { 
     try { 
      sleep(Integer.MAX_VALUE); 
     } 
     // even if there is an interruption, dont do anything 
     catch (InterruptedException e) { 
     } 
     } 
    } 
} 

Si ejecuta esto con una JVM 1.4 ya que colgará cuando no puede crear más hilos y requieren una matanza - 9 (al menos lo hizo por mí).

Más Editar:

Resulta que el sistema que está teniendo el problema está utilizando los hilos de Linux Modelo de subprocesos mientras que otro sistema que funciona bien está utilizando el modelo NTPL.

+0

sólo una pequeña nota al margen de todos los nuevos querer-a-ser programadores: nunca utilice 'while (true)' en cualquier lugar excepto para proyectos escolares y la experimentación privada y _Nunca_ crear miles de hilos, su aplicación más probable es que tiene errores serios si lo hace, o si no, el diseño de su aplicación es defectuoso. Solo digo ... – specializt

Respuesta

4

Al actualizar el kernel a una versión más nueva (2.6.algo) con enrutamiento NPTL solucionado esto.

4

¿Has mirado en this resource? Indica que debe poder ejecutar thread-limit para encontrar la cantidad máxima de subprocesos y puede modificarlo compilando glibc.

+0

Por extraño que parezca, thread-limit fue capaz de crear 1528 hilos antes de fallar. Hmm. – ColinD

0

¿Se puede probar con el JRockit JVM? IIRC, tenía un modelo de subprocesamiento diferente al stock Sun JVM.

0

La configuración en /etc/security/limits.d/90-nproc.conf puede estar anulando la configuración de /etc/security/limits.conf. Eso puede hacer que el sistema actúe de una manera diferente que se muestra en ulimit -u.

https://bugzilla.redhat.com/show_bug.cgi?id=823030

Cuestiones relacionadas