前提・実現したいこと
現在以下のエラーの通りLinuxコマンドが実行できない状態です。
おそらくスレッド数が多すぎるため発生しているエラーと思いますが、どのようにすれば解決できるでしょうか。
- スレッド数が10,000を超えたあたりから
Resource temporarily unavailable
が発生します。 - スレッド数を10,000を超えないようにすると
Resource temporarily unavailable
は発生しません。 - 以上2点からアプリケーションでは無く、Linux側の問題かと考えています。
- スレッドを多く建てる必要があるアプリケーションの為、スレッド数を抑えて解決という事はできません。
発生している問題・エラーメッセージ
- touch に限らず他のコマンドcatやvimコマンドも失敗します。
- 恐らく全てのコマンドが実行できないです。
- エラー発生前から実行中のプロセスは終了する事なく、問題なく実行され続けます。(htop等)
bash
1# touch hoge 2-bash: fork: retry: Resource temporarily unavailable 3-bash: fork: retry: Resource temporarily unavailable 4-bash: fork: retry: Resource temporarily unavailable 5-bash: fork: retry: Resource temporarily unavailable 6-bash: fork: Resource temporarily unavailable
cdは成功しますがエラーが出る事があります。(絶対出るわけではない)
root@~# cd /etc -bash: wait_for: No record of process 21875 root@/etc#
試したこと
- 最大スレッド数等を増やす
→解決しなかった
参考 https://blogs.itmedia.co.jp/komata/2012/05/linux-3132.html
sysctl -w kernel.threads-max=600000 sysctl -w kernel.pid_max=600000 sysctl -w vm.max_map_count=600000
- 最大PID数を増やす
→解決しなかった
$ vim /sys/fs/cgroup/pids/user.slice/user-0.slice/pids.max 999999 $ reboot
再現方法
-
- プログラムを書く
Source.c
1#include <stdio.h> 2#include <pthread.h> 3#include <unistd.h> 4void *thread () 5{ 6 sleep(9999); 7} 8 9int main() 10{ 11 int err = 0, count = 0; 12 pthread_t tid; 13 14 while (err == 0) 15 { 16 err = pthread_create (&tid, NULL, thread, NULL); 17 count++; 18 } 19 printf("max thread: %d\n", count); 20 getchar(); 21}
-
- コンパイルする
gcc source.c -pthread
-
- 実行する
$ ./a.out max thread: 10800 $ touch a -bash: fork: retry: Resource temporarily unavailable
補足情報(FW/ツールのバージョンなど)
- Ubuntu 18.04
- CPU 32 Core
- RAM 64GB
$ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 257435 max locked memory (kbytes, -l) 16384 max memory size (kbytes, -m) unlimited open files (-n) 65536 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 257435 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
$ uname -a Linux localhost 4.15.0-50-generic #54-Ubuntu SMP Mon May 6 18:46:08 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
$ cat /proc/sys/kernel/threads-max 514870
https://tutorialmore.com/questions-37082.htm
これを読んで試してみてください。
情報ありがとうございます、しかしsystemdに関する解決方法のみが載っていたので解決に至りませんでした。
※スレッドを多く建てるアプリケーションでsystemdを利用していません。
念の為以下の手順でDefaultTasksMaxを変更しましたが同様のエラーが出ます。
vim /etc/systemd/system.conf
DefaultTasksMax=unlimited
reboot
※tutorialmore.comは機械翻訳しただけのWebサイトなのでオリジナルの記事はこちらかと思います。
https://unix.stackexchange.com/questions/253903/creating-threads-fails-with-resource-temporarily-unavailable-with-4-3-kernel
スコアの低い人の初心者マークの質問に英語のソースを貼るといじめだと言われるのでわざわざ日本語のものを探しました。
また質問する前、した後に調べたことがあるなら質問を編集してそれを記載してください。
また英語が得意なら Stack Overflow で質問するのも手です。その場合は両者のガイドラインに従って適切に質問してください。
それと、私の貼ったリンク先には、どのリソースが不足しがちか書いてあります。それを参考に、具体的にどのリソースが枯渇したのかを調べ、質問に追記してください。

話の流れをぶった切りますが、ファイルディスクリプタは増やしましたか?

回答2件
あなたの回答
tips
プレビュー