Frage

ich habe ein Problem auf einer Testmaschine mit Red Hat Linux (Kernel-Version ist 2.4.21-37.ELsmp) mit Java 1.6 (1.6.0_02 oder 1.6.0_04). Das Problem ist, wenn eine bestimmte Anzahl von Fäden in einer einzigen Fadengruppe erstellt wird, ist das Betriebssystem nicht in der Lage oder nicht bereit, mehr zu schaffen.

Dies scheint spezifisch zu sein, um Java-Threads zu schaffen, da das C-Thread-Limit Programm in der Lage war, über 1,5k Threads zu erstellen. Darüber hinaus bedeutet dies nicht mit Java 1.4 JVM passiert ... kann es über 1.4k Threads erstellen, obwohl sie offensichtlich anders in Bezug auf das Betriebssystem behandelt werden.

In diesem Fall wird die Anzahl der Threads an ihm ist das Abschneiden ist nur 29 Threads. Dies ist prüfbar mit einem einfachen Java-Programm, das nur Threads erstellt, bis er einen Fehler bekommt und druckt dann die Anzahl der Threads es erstellt. Der Fehler ist ein

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

Dies scheint durch Dinge wie die Anzahl der Threads in Verwendung durch andere Prozesse oder Benutzer oder die Gesamtmenge des Speichers nicht betroffen zu sein, das System zu der Zeit verwendet. JVM-Einstellungen wie Xms, Xmx und Xss auch nicht scheinen, etwas zu ändern (was zu erwarten ist, scheint das Problem unter Berücksichtigung mit nativen OS Thread-Erzeugung zu sein).

Der Ausgang 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

Der Benutzer Prozess Grenze scheint nicht das Problem zu sein. Die Suche nach Informationen darüber, was falsch sein könnte hat sich nicht viel, aufgedreht, aber diesen Beitrag scheint darauf hinzudeuten, dass zumindest einig Red Hat-Kernel einen Prozess zu 300 MB Speicher für Stapel reserviert begrenzen und bei 10 MB pro Thread für Stapel, wie es scheint, das Problem dort zu sein könnte (obwohl es seltsam und unwahrscheinlich scheint, als gut).

Ich habe versucht, die Stapelgröße zu ändern mit „ulimit es“, dies zu testen, aber einem anderen Wert als 10240 und die JVM startet nicht mit einem Fehler von:

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

Ich kann in der Regel rund um Linux, aber ich weiß wirklich nicht viel über die Systemkonfiguration, und ich habe nicht in der Lage gewesen, etwas spezifisch zu finden, diese Art von Situation darstellt. Irgendwelche Ideen auf, welches System oder JVM-Einstellungen verursachen könnte dies würde geschätzt.

Edits : Das Ausführen des Thread-Limit Programm erwähnt von Sockel , gibt es keinen Ausfall, bis er den 1529. Thread zu erstellen versucht.

Das Problem auch nicht auftreten, eine 1.4 JVM (tritt mit 1.6.0_02 und 1.6.0_04 JVMs, kann nicht mit einem 1.5 JVM zur Zeit testen).

Der 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 dies mit einem 1.4 JVM läuft es hängen, wenn es keine weiteren Threads erstellen und eine Abtötung erfordern -9 (zumindest ist es für mich getan hat).

Mehr Edit:

Es stellt sich heraus, dass das System, das das Problem mit den Linuxthreads verwendet Threading-Modell, während ein anderes System, das gut funktioniert ist das NPTL Modell.

War es hilfreich?

Lösung 2

Aktualisieren der Kernel auf eine neuere Version (2.6.something) mit NPTL Threading dies behoben.

Andere Tipps

Haben Sie sich dieser Ressource ? Darin heißt es, dass Sie in der Lage Lauf fade Grenze sein sollten, die maximale Anzahl von Threads zu finden und durch Kompilieren glibc optimieren können.

Dies ist mit Ubuntu Linux (1 GB RAM)

dsm@localhost:~$ javac ThreadTest.java 
dsm@localhost:~$ java ThreadTest 
8113
dsm@localhost:~$ java -version
java version "1.6.0_07"
Java(TM) SE Runtime Environment (build 1.6.0_07-b06)
Java HotSpot(TM) Client VM (build 10.0-b23, mixed mode, sharing)
dsm@localhost:~$ 

Können Sie versuchen, es mit der JRockit JVM? IIRC, hatte es ein anderes Threading-Modell als das Lager Sun JVM.

Die Einstellungen in /etc/security/limits.d/90-nproc.conf können Ihre /etc/security/limits.conf Einstellungen werden überschrieben. Das kann das System wirkt auf eine andere Weise in ulimit -u gezeigt führen.

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top