web-dev-qa-db-ja.com

JVMスレッドの最大数を増やす方法(Linux 64ビット)

15GメモリのLinuxマシンでは、32k以上のスレッドを作成できませんJavaスレッド。

15
maczniak

サンプルプログラム を使用して、現在のスレッド制限を確認できます。

Exception in thread "main" Java.lang.OutOfMemoryError: unable to create new native threadが発生した場合は、次を確認してください。

  1. 小さなメモリマシンで

    すべてのJavaスレッドは独自のスタックメモリを消費します。デフォルトのスタックサイズは1024k(= 1M)です。Java -Xss512k ...のようにスタックサイズを減らすことができます。スタックサイズが低すぎる。

    そして、ヒープメモリ構成に注意してください:(初期)-Xmsおよび(最大)-Xmx。より多くのメモリがヒープに割り当てられるほど、スタックで使用可能なメモリは少なくなります。

  2. システム制限

    ulimit -aの一部の値は、スレッド制限に影響を与える可能性があります。

    • max memory size-ほとんどの64ビットマシンで無制限
    • max user processes-Linuxはスレッドをプロセスのように扱います
    • virtual memory-ほとんどの64ビットマシンで無制限。 -Xss構成により仮想メモリの使用量が増加します(デフォルトは1024k)

    これらの値を変更するには、(一時的)ulimitコマンドを実行するか、(永久)/etc/security/limits.confを編集します。

  3. sys.kernel.threads-max

    この値は、システムグローバル(非JVMプロセスを含む)のスレッドの最大数です。 cat /proc/sys/kernel/threads-maxを確認し、必要に応じて増やします。

    echo 999999 > /proc/sys/kernel/threads-max
    または
    sys.kernel.threads-max = 999999 in /etc/sysctl.confは永続的に変更します。

  4. sys.kernel.pid_max

    cat /proc/sys/kernel/pid_maxが現在の制限に類似している場合、これを増やします。 Linuxはスレッドをプロセスのように扱います。

    echo 999999 > /proc/sys/kernel/pid_max
    または
    sys.kernel.pid_max = 999999 in /etc/sysctl.confは永続的に変更します。

    また、sys.vm.max_map_countも増やす必要があるかもしれません。

  5. sys.vm.max_map_count

    cat /proc/sys/vm/max_map_countは少なくとも(2 xスレッドカウント)でなければなりません。

    Attempt to protect stack guard pages failed.およびOpenJDK 64-Bit Server VM warning: Attempt to deallocate stack guard pages failed.エラーメッセージはJavaThread :: create_stack_guard_pages()によって発行され、os :: guard_memory()を呼び出します。 Linuxでは、この関数はmprotect()です。

    echo 1999999 > /proc/sys/vm/max_map_count
    または
    sys.vm.max_map_count = 1999999 in /etc/sysctl.confは永続的に変更します。

41
maczniak

最新の(systemd)Linuxシステムの追加情報。

調整が必要な可能性のある値のリソースについては、多くのリソースがあります(他の答えは、それらのほとんどの適切なソースです)。ただし、cgroupにpids.maxを設定するsystemdの「TasksMax」制限により、新しい制限が課せられます。

ログインセッションの場合、 serTasksMax デフォルトはカーネル制限pids_maxの33%(通常12,288)であり、/ etc/systemd/logind.confでオーバーライドできます。

サービスの場合、 DefaultTasksMax デフォルトは、カーネルの制限pids_maxの15%(通常4,915)です。 「systemctl edit」でTasksMaxを設定するか、/ etc/systemd/system.confでDefaultTasksMaxを更新することにより、サービスに対してこれをオーバーライドできます。

10
Trent Lloyd

Pythonプログラムで同様の問題に遭遇しましたが、以下は私のために働きました。これは上記のmaczniakの答えと 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

/etc/systemd/system.confDefaultTasksMax(またはユーザー実行サービスの場合は/etc/systemd/user.conf)をDefaultTasksMax=unlimitedに設定する必要もありました。

Systemdは、ログインシェルから実行されるプログラムにも制限を適用します。これらはユーザーあたり4096にデフォルト設定され(12288に増加されます)、/etc/systemd/logind.confの[Login]セクションでUserTasksMaxとして設定されます。

このStackExchangeの質問 からです。 UserTasksMaxUserTasksMax=999999に設定するとうまくいきました。

1
Jonathan