質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Q&A

解決済

2回答

17829閲覧

Resource temporarily unavailableが発生し、コマンドが実行できない

daiki002

総合スコア68

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

0グッド

4クリップ

投稿2020/02/11 02:24

編集2020/09/12 10:04

前提・実現したいこと

現在以下のエラーの通り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

再現方法

    1. プログラムを書く

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}
    1. コンパイルする
gcc source.c -pthread
    1. 実行する
$ ./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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

daiki002

2020/02/11 06:37 編集

情報ありがとうございます、しかし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
Zuishin

2020/02/11 06:42

スコアの低い人の初心者マークの質問に英語のソースを貼るといじめだと言われるのでわざわざ日本語のものを探しました。 また質問する前、した後に調べたことがあるなら質問を編集してそれを記載してください。
Zuishin

2020/02/11 06:45

また英語が得意なら Stack Overflow で質問するのも手です。その場合は両者のガイドラインに従って適切に質問してください。
Zuishin

2020/02/11 06:47

それと、私の貼ったリンク先には、どのリソースが不足しがちか書いてあります。それを参考に、具体的にどのリソースが枯渇したのかを調べ、質問に追記してください。
退会済みユーザー

退会済みユーザー

2020/02/13 02:10

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

回答2

0

自己解決

結論

systemd のUserTasksMaxが原因でした。(参考3)

現状の確認方法

「ユーザ全体」の制限があるか確認する(参考3)

以下の場合は制限はありません。

$ systemctl status user.slice | grep Tasks Tasks: 6

「root」の制限があるか確認する(参考3)

以下の場合は最大10,249の制限があります

$ systemctl status user-0.slice | grep Tasks Tasks: 6 (limit: 10249)

質問の「再現方法」に書いてあるプログラムを実行すると、ほぼ一致します。
(Linuxシステムで既に実行中のプロセスがいくつか存在するので誤差があります)

$ ./a.out max thread: 10242

解決方法

以下コマンドを実行する(参考1)

$ mkdir /etc/systemd/logind.conf.d/ $ vim /etc/systemd/logind.conf.d/override.conf [Login] UserTasksMax=infinity $ reboot

また、以下のカーネルパラメータを適切に設定する事でスレッド上限が増えます(参考2)

$ sysctl -w kernel.threads-max=600000 $ sysctl -w kernel.pid_max=600000 $ sysctl -w vm.max_map_count=600000

また、スレッド上限を限界までチューニングする場合はスタックサイズ変更もポイントになります。
hana_yama_san様の回答

参考

  1. TasksMax を利用した fork ボムの防止

  2. Linuxでの最大スレッド数

  3. cgroup: fork rejected by pids controller in..." found in system log

投稿2020/09/12 10:42

編集2020/09/12 12:32
daiki002

総合スコア68

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

(参りました、検証中にVirtualBox上の
CentOsで「sysctl kernel.threads-max=100000」
を実行したら、ホスト機のFreeBSDまでハングしてしまった)

・・・
で、要するに作成できるスレッド数は当たり前ですが、
システムのメモリサイズに依存します。

調べたら、
number of threads = total virtual memory / (stack size10241024)
だそうです。

と言う事で「ulimit -s」を使用すればスタックサイズを小さく出来、
結果的にスレッドを多く出来るようです。

が、
スタックを小さくすると、コマンドライン引数の最大値が減るとか、

スタックオーバーフロー(仮に発生してもプログラムが落ちるだけで
昔の様にセキュリティ侵害に直結することは少ないでしょうが・・)
が、発生したりのリスクが発生します。
(多数回の再帰呼び出し等は動かなくなるかもです)

※VMの大きさは既に最大に設定されているようです。

「ulimit -s」を確認し、自己責任でチューニングしてください。

書いている間に、他の回答が付いて(えっ!てか、自己解決?)解決済みになった様ですね。
ま、ご参考までに。

投稿2020/09/12 11:10

編集2020/09/12 11:15
hana_yama_san

総合スコア923

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

daiki002

2020/09/12 11:19

ご回答いただいたのに自己解決していて申し訳ないです。 しかしスタックサイズについては触れていなかったのでありがたいです。 カーネルパラメータの変更だけでは最大スレッド数の限界があるので、限界までチューニングする場合はスタックサイズを考慮するシーンが出てきそうですね。
hana_yama_san

2020/09/12 11:28

その通りです。が、はっきり言ってメモリを増やすが最適解かもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問