GNU/Linux >> Linux の 問題 >  >> Linux

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

サンプル プログラムを使用して、現在のスレッド制限を調べることができます。

Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread に遭遇した場合 、これらを確認してください:

<オール>
  • 小さなメモリマシンで

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

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

  • システム制限

    ulimit -a のいくつかの値 スレッド制限に影響を与える可能性があります。

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

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

  • sys.kernel.threads-max

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

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

  • sys.kernel.pid_max

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

    echo 999999 > /proc/sys/kernel/pid_max
    また
    sys.kernel.pid_max = 999999 /etc/sysctl.conf

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

  • 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 /etc/sysctl.conf


  • 最新の (systemd) Linux システムに関する追加情報。

    これについては、微調整が必​​要な可能性のある多くのリソースがあります (他の回答は、それらのほとんどの優れた情報源です)。ただし、cgroup に pids.max を設定する systemd の「TasksMax」制限によって、新しい制限が課されます。

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

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


    私は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
    

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

    <ブロック引用>

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

    これは、この StackExchange の質問からのものです。 UserTasksMax の設定 UserTasksMax=999999


    Linux
    1. Ext4ファイルシステムのiノードの数を増やす方法は?

    2. Linux – Maxsymlinksを増やす方法は?

    3. Linux – Vm Dnsサーバーをオーバーライドする方法は?

    1. Linuxで開くファイルの数の制限を増やす方法

    2. Linuxでスワップスペースを作成または増やす方法

    3. Linux で IPv6 の自動構成を無効にする方法は?

    1. Linuxでディスクiノード数を増やす方法

    2. Linux –アドホック接続を作成する方法は?

    3. Linux – Javaプログラムをトレースする方法は?