GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So erhöhen Sie die maximale Anzahl von JVM-Threads (Linux 64bit)

Sie können ein Beispielprogramm verwenden, um das aktuelle Thread-Limit herauszufinden.

Wenn Sie auf Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread stoßen , überprüfen Sie diese:

  1. In kleinen Speichermaschinen

    Jeder Java-Thread verbraucht seinen eigenen Stapelspeicher. Die Standardstapelgröße beträgt 1024 KB (=1 MB). Sie können die Stapelgröße wie java -Xss512k ... reduzieren . JVM kann nicht gestartet werden, wenn die Stapelgröße zu niedrig ist.

    Und Vorsicht bei Heap-Speicherkonfigurationen:(anfänglich) -Xms und (maximal) -Xmx . Je mehr Speicher dem Heap zugewiesen wird, desto weniger verfügbarer Speicher für den Stack.

  2. Systemgrenzen

    Einige Werte in ulimit -a kann ein Thread-Limit beeinflussen.

    • max memory size - unbegrenzt auf den meisten 64-Bit-Rechnern
    • max user processes - Linux behandelt Threads wie Prozesse
    • virtual memory - unbegrenzt auf den meisten 64-Bit-Rechnern. Die Nutzung des virtuellen Speichers wird durch die -Xss-Konfiguration erhöht (Standard 1024 KB)

    Sie können diese Werte ändern, indem Sie (zeitweise) ulimit ausführen Befehl oder (permanente) Bearbeitung /etc/security/limits.conf .

  3. sys.kernel.threads-max

    Dieser Wert ist die systemglobale (einschließlich Nicht-JVM-Prozesse) maximale Anzahl von Threads. Überprüfen Sie cat /proc/sys/kernel/threads-max , und erhöhen Sie ihn bei Bedarf.

    echo 999999 > /proc/sys/kernel/threads-max
    oder
    sys.kernel.threads-max = 999999 in /etc/sysctl.conf dauerhaft zu verändern.

  4. sys.kernel.pid_max

    Wenn cat /proc/sys/kernel/pid_max ähnlich der aktuellen Grenze ist, erhöhen Sie diese. Linux behandelt Threads wie Prozesse.

    echo 999999 > /proc/sys/kernel/pid_max
    oder
    sys.kernel.pid_max = 999999 in /etc/sysctl.conf dauerhaft ändern.

    Und Sie müssen möglicherweise sys.vm.max_map_count erhöhen , auch.

  5. sys.vm.max_map_count

    cat /proc/sys/vm/max_map_count sollte mindestens (2 x Thread-Anzahl) sein.

    Attempt to protect stack guard pages failed. und OpenJDK 64-Bit Server VM warning: Attempt to deallocate stack guard pages failed. Fehlermeldungen werden von JavaThread::create_stack_guard_pages() ausgegeben und es ruft os::guard_memory() auf. Unter Linux heißt diese Funktion mprotect().

    echo 1999999 > /proc/sys/vm/max_map_count
    oder
    sys.vm.max_map_count = 1999999 in /etc/sysctl.conf dauerhaft ändern.


Zusätzliche Informationen für moderne (systemd) Linux-Systeme.

Es gibt viele Ressourcen zu diesen Werten, die möglicherweise angepasst werden müssen (die andere Antwort ist eine gute Quelle für die meisten von ihnen); jedoch wird ein neues Limit über das Systemd-"TasksMax"-Limit auferlegt, das pids.max für die cgroup festlegt.

Für Anmeldesitzungen beträgt der Standardwert von UserTasksMax 33 % des Kernel-Limits pids_max (normalerweise 12.288) und kann in /etc/systemd/logind.conf überschrieben werden.

Für Dienste beträgt der DefaultTasksMax-Standardwert 15 % des Kernel-Limits pids_max (normalerweise 4.915). Sie können es für den Dienst überschreiben, indem Sie TasksMax in „systemctl edit“ festlegen oder DefaultTasksMax in /etc/systemd/system.conf

aktualisieren

Ich bin in einem Python-Programm auf ein ähnliches Problem gestoßen, und Folgendes hat bei mir funktioniert. Dies basiert auf der obigen Antwort von maczniak und https://superuser.com/questions/1219960/cannot-edit-proc-sys-kernel-threads-max.

echo kernel.threads-max = 1073741823 >> /etc/sysctl.conf && echo 1073741823 > /proc/sys/kernel/threads-max
echo kernel.pid_max = 999999 >> /etc/sysctl.conf && echo 999999 > /proc/sys/kernel/pid_max
echo vm.max_map_count = 2147483646 >> /etc/sysctl.conf && echo 2147483646 > /proc/sys/vm/max_map_count
echo vm.overcommit_memory = 1 >> /etc/sysctl.conf && echo 1 > /proc/sys/vm/overcommit_memory
echo fs.inotify.max_user_instances = 256 >> /etc/sysctl.conf && echo 256 > /proc/sys/fs/inotify/max_user_instances
sysctl -p

Ich musste auch DefaultTasksMax einstellen in /etc/systemd/system.conf (oder /etc/systemd/user.conf für vom Benutzer ausgeführte Dienste) auf DefaultTasksMax=unlimited .

Systemd wendet auch ein Limit für Programme an, die von einer Login-Shell ausgeführt werden. Diese sind standardmäßig auf 4096 pro Benutzer (wird auf 12288 erhöht) und werden als UserTasksMax im Abschnitt [Login] von /etc/systemd/logind.conf konfiguriert .

Das ist aus dieser StackExchange-Frage. Meinen UserTasksMax einstellen bis UserTasksMax=999999 hat bei mir funktioniert.


Linux
  1. Linux – Wie kann man Maxsymlinks erhöhen?

  2. Linux – Wie überschreibe ich einen VM-Dns-Server?

  3. So erhöhen Sie die Swap-Größe unter Ubuntu Linux

  4. So vergrößern Sie den Auslagerungsspeicher unter Linux

  5. Maximale Anzahl von Threads pro Prozess in Linux?

So finden Sie die Portnummer eines Dienstes in Linux

So verschieben Sie eine große Anzahl von Dateien in Linux

So kopieren Sie eine große Anzahl von Dateien unter Linux

So verwenden Sie den Echo-Befehl in Bash-Skripten unter Linux

So überprüfen Sie die Versionsnummer und den Codenamen von Linux Mint

So pingen Sie eine Portnummer in Linux an