GNU/Linux >> Znalost Linux >  >> Linux

Jak zvýšit maximální počet vláken JVM (Linux 64bit)

Ke zjištění aktuálního limitu vláken můžete použít ukázkový program.

Pokud narazíte na Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread , zkontrolujte tyto:

  1. V malých paměťových strojích

    Každé vlákno Java spotřebovává svou vlastní zásobníkovou paměť. Výchozí velikost zásobníku je 1024k (=1M). Velikost zásobníku můžete zmenšit jako java -Xss512k ... . JVM nelze spustit, pokud je velikost zásobníku příliš malá.

    A pozor na konfigurace haldy paměti:(počáteční) -Xms a (maximálně) -Xmx . Čím více paměti je přiděleno haldě, tím méně dostupné paměti pro zásobník.

  2. Systémové limity

    Některé hodnoty v ulimit -a může ovlivnit limit vlákna.

    • max memory size - neomezeně na většině 64bitových počítačů
    • max user processes - linux zachází s vlákny jako s procesy
    • virtual memory - neomezeně na většině 64bitových strojů. využití virtuální paměti je zvýšeno o konfiguraci -Xss (výchozí 1024k)

    Tyto hodnoty můžete změnit (dočasným) spuštěním ulimit příkaz nebo (trvalá) úprava /etc/security/limits.conf .

  3. sys.kernel.threads-max

    Tato hodnota je systémově globální (včetně procesů jiných než JVM) maximální počet vláken. Zkontrolujte cat /proc/sys/kernel/threads-max a v případě potřeby zvyšte.

    echo 999999 > /proc/sys/kernel/threads-max
    nebo
    sys.kernel.threads-max = 999999 v /etc/sysctl.conf trvale změnit.

  4. sys.kernel.pid_max

    Pokud cat /proc/sys/kernel/pid_max je podobný aktuálnímu limitu, zvyšte jej. Linux zachází s vlákny jako s procesy.

    echo 999999 > /proc/sys/kernel/pid_max
    nebo
    sys.kernel.pid_max = 999999 v /etc/sysctl.conf trvale změnit.

    A možná budete muset zvýšit sys.vm.max_map_count .

  5. sys.vm.max_map_count

    cat /proc/sys/vm/max_map_count by mělo být alespoň (2 x počet vláken).

    Attempt to protect stack guard pages failed. a OpenJDK 64-Bit Server VM warning: Attempt to deallocate stack guard pages failed. chybové zprávy vysílá JavaThread::create_stack_guard_pages() a volá os::guard_memory(). V Linuxu je tato funkce mprotect().

    echo 1999999 > /proc/sys/vm/max_map_count
    nebo
    sys.vm.max_map_count = 1999999 v /etc/sysctl.conf trvale změnit.


Další informace pro moderní (systemd) linuxové systémy.

Existuje mnoho zdrojů o těchto hodnotách, které mohou vyžadovat ladění (druhá odpověď je pro většinu z nich dobrým zdrojem); nicméně je zaveden nový limit prostřednictvím systemd limitu "TasksMax", který nastavuje pids.max na cgroup.

Pro přihlašovací relace je výchozí hodnota UserTasksMax 33 % limitu jádra pids_max (obvykle 12 288) a lze ji přepsat v /etc/systemd/logind.conf.

Pro služby je výchozí hodnota DefaultTasksMax 15 % limitu jádra pids_max (obvykle 4 915). Můžete jej pro službu přepsat nastavením TasksMax v "systemctl edit" nebo aktualizací DefaultTasksMax v /etc/systemd/system.conf


Narazil jsem na podobný problém v programu Python a fungovalo mi následující. Toto je založeno na maczniakově odpovědi výše a 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

Také jsem musel nastavit DefaultTasksMax v /etc/systemd/system.conf (nebo /etc/systemd/user.conf pro uživatelem provozované služby) na DefaultTasksMax=unlimited .

Systemd také uplatňuje limit pro programy spouštěné z přihlašovacího prostředí. Tyto výchozí hodnoty jsou 4096 na uživatele (bude zvýšeny na 12288) a jsou nakonfigurovány jako UserTasksMax v sekci [Login] /etc/systemd/logind.conf .

To je z této otázky StackExchange. Nastavení mého UserTasksMax na UserTasksMax=999999 pracoval pro mě.


Linux
  1. Linux – jak vytvořit připojení ad-hoc?

  2. Linux – Jak sledovat program Java?

  3. Jak zvýšit velikost swapu na Ubuntu Linux

  1. Jak zvětšit odkládací prostor v Linuxu

  2. Maximální počet vláken na proces v Linuxu?

  3. Maximální počet souborů/adresářů na Linuxu?

  1. Jak zvýšit počet diskových inodů v Linuxu

  2. Jak vytvořit nebo zvětšit swapový prostor v Linuxu

  3. Jak zakázat automatickou konfiguraci na IPv6 v Linuxu?