Low Java einzigen Prozess Thread-Limit in Red Hat Linux
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.
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.