15GメモリのLinuxマシンでは、32k以上のスレッドを作成できませんJavaスレッド。
サンプルプログラム を使用して、現在のスレッド制限を確認できます。
Exception in thread "main" Java.lang.OutOfMemoryError: unable to create new native thread
が発生した場合は、次を確認してください。
小さなメモリマシンで
すべてのJavaスレッドは独自のスタックメモリを消費します。デフォルトのスタックサイズは1024k(= 1M)です。Java -Xss512k ...
のようにスタックサイズを減らすことができます。スタックサイズが低すぎる。
そして、ヒープメモリ構成に注意してください:(初期)-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
in /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
in /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
in /etc/sysctl.conf
は永続的に変更します。
最新の(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を更新することにより、サービスに対してこれをオーバーライドできます。
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.conf
のDefaultTasksMax
(またはユーザー実行サービスの場合は/etc/systemd/user.conf
)をDefaultTasksMax=unlimited
に設定する必要もありました。
Systemdは、ログインシェルから実行されるプログラムにも制限を適用します。これらはユーザーあたり4096にデフォルト設定され(12288に増加されます)、
/etc/systemd/logind.conf
の[Login]セクションでUserTasksMaxとして設定されます。
このStackExchangeの質問 からです。 UserTasksMax
をUserTasksMax=999999
に設定するとうまくいきました。