Niedrige Java-Einzel-Prozess-thread-limit in Red Hat Linux

Ich bin ein Problem auf einer test-Maschine unter Red Hat Linux (kernel-version 2.4.21-37.ELsmp) mit Java 1.6 (1.6.0_02 oder 1.6.0_04). Das problem ist, sobald eine bestimmte Anzahl von threads erstellt werden, in einem einzigen thread-Gruppe, das Betriebssystem ist nicht Willens oder nicht in der Lage zu erstellen.

Dies scheint spezifisch für Java-erstellen von threads, wie dem C-thread-limit Programm war in der Lage zu schaffen, etwa 1,5 k-threads. Zusätzlich, dies geschieht nicht mit Java-1.4 JVM... man kann es schaffen, über 1.4 k-threads, obwohl Sie offensichtlich anders behandelt, mit Bezug auf das OS.

In diesem Fall die Anzahl der threads abschalten, ist eine bloße 29 threads. Dies ist überprüfbar mit einem einfachen Java-Programm, das erstellt nur threads, bis es zu einem Fehler kommt, und dann druckt die Anzahl der threads, die er erstellt. Der Fehler ist ein

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

Scheint unberührt zu sein durch Dinge wie die Anzahl der threads in Verwendung durch andere Prozesse oder Benutzer oder die Gesamtmenge des Speichers wird das system mit der Zeit. JVM-Einstellungen wie Xms, Xmx und Xss scheinen nicht, etwas zu ändern, entweder (was wird erwartet, wenn man bedenkt das Problem scheint zu sein, mit nativen OS thread-Erstellung).

Die Ausgabe von "ulimit-a" ist wie folgt:

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 

Den Benutzer-Prozess-Grenze scheint nicht das Problem sein. Suche nach Informationen darüber, was falsch sein könnte, hat sich nicht viel, aber dieser Beitrag scheint darauf hinzudeuten, dass zumindest einige Red-Hat-Kernel beschränken, einen Prozess zu 300 MB an Speicher für den stack, und bei 10 MB pro thread für stack, wie es scheint, das Problem könnte sein, dass es (obwohl es scheint seltsam und unwahrscheinlich auch).

Ich habe versucht, die änderung der stack-Größe mit "ulimit -s", um dies zu testen, aber einen anderen Wert als 10240 und die JVM startet nicht mit einem Fehler von:

Fehler während der Initialisierung aufgetreten ist der VM 
Kann nicht erstellen Sie VM-thread. Aus system-Ressourcen.

Kann ich in der Regel bekommen, um Linux, aber ich weiß wirklich nicht viel über die system-Konfiguration, und ich habe nicht in der Lage, etwas zu finden, die ganz spezifisch auf diese Art von situation. Irgendwelche Ideen auf, was system-oder JVM-Einstellungen könnte die Ursache sein würde geschätzt.

Bearbeitungen: Läuft der thread-limit Programm erwähnt sockel, es war kein Fehler, bis es versuchte zu schaffen, die 1529th thread.

Das Problem auch nicht auftreten, mit einem 1.4 JVM (tritt mit 1.6.0_02 und 1.6.0_04 JVMs, kann das nicht testen mit einen 1.5 JVM im moment).

Den code für den thread-test ich verwende ist wie folgt:

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) {
         }
      }
   }
}

Wenn Sie diese mit einem 1.4 JVM wird es hängen, wenn Sie es nicht schaffen, mehr threads und erfordern ein kill -9 (zumindest kam es für mich).

Mehr Bearbeiten:

Es stellt sich heraus, dass das system, das problem ist die Verwendung der LinuxThreads-threading-Modell, während ein weiteres system, das funktioniert gut, ist mit der NPTL-Modell.

  • nur eine kleine sidenote, für alle neuen möchte-gern-Programmierer : verwenden Sie niemals while(true) überall, außer für die Schule Projekte und eigenes Experimentieren und erstellen Sie NIEMALS Tausende von threads, die Ihre app sehr wahrscheinlich gravierende Fehler, wenn es nicht -, oder aber Ihre Anwendung design ist fehlerhaft. Just sayin ..
InformationsquelleAutor ColinD | 2008-09-22
Schreibe einen Kommentar