いくつかのコンテナでArch Linux(カーネル4.3.3-2)でdockerサーバーを実行しています。前回の再起動以来、ドッカーサーバーとコンテナ内のランダムプログラムの両方がクラッシュし、スレッドを作成できない、または(あまり頻繁ではありませんが)フォークするというメッセージが表示されます。特定のエラーメッセージはプログラムによって異なりますが、それらのほとんどは特定のエラーに言及しているようですResource temporarily unavailable
。エラーメッセージの例については、この投稿の最後をご覧ください。
今、このエラーメッセージを受け取った人がたくさんいますし、彼らへの応答もたくさんあります。本当にイライラするのは、誰もが問題を解決する方法を推測しているように見えることですが、問題の多くの考えられる原因のどれが存在するかを特定する方法を誰も指摘していないようです。
エラーの考えられる5つの原因と、それらがシステムに存在しないことを確認する方法を収集しました。
/proc/sys/kernel/threads-max
(source)で設定されるスレッドの数にはシステム全体の制限があります。私の場合、これはに設定されてい60613
ます。- すべてのスレッドはスタック内のスペースを使用します。スタックサイズの制限は
ulimit -s
(source)を使用して構成されます。私のシェルの制限があることに使用される8192
が、私は置くことによって、それが増加している* soft stack 32768
に/etc/security/limits.conf
ので、ulimit -s
今戻ります32768
。私も入れてドッキングウィンドウのプロセスのためにそれを増加しているLimitSTACK=33554432
に/etc/systemd/system/docker.service
(ソース、と私は限界が覗くことで適用されていることを確認/proc/<pid of docker>/limits
し、実行することにより、ulimit -s
ドッキングウィンドウコンテナ内。 - すべてのスレッドはいくらかのメモリを消費します。仮想メモリの制限は、を使用して構成されます
ulimit -v
。私のシステムではに設定されてunlimited
おり、3 GBのメモリの80%が無料です。 - を使用するプロセスの数には制限があります
ulimit -u
。この場合、スレッドはプロセスとしてカウントされます(source)。私のシステムでは、制限はに設定されて30306
おり、Dockerデーモンおよび内部のdockerコンテナの場合、制限は1048576
です。現在実行中のスレッドの数は、実行ls -1d /proc/*/task/* | wc -l
または実行ps -elfT | wc -l
(source)によって確認できます。私のシステムでは、それらはとの間に700
あり800
ます。 - 開いているファイルの数には制限があります。一部のソースによると、これはスレッドを作成するときにも関係します。制限はを使用して設定されます
ulimit -n
。私のシステムと内部ドッカーでは、制限がに設定されてい1048576
ます。開いているファイルの数はlsof | wc -l
(source)を使用して調べることができます30000
。私のシステムでは約です。
最後のリブート前にカーネル4.2.5-1を実行していたように見えますが、現在は4.3.3-2を実行しています。4.2.5-1にダウングレードすると、すべての問題が修正されます。この問題に言及している他の投稿はthisとthisです。Arch Linuxのバグレポートを開きました。
これを引き起こしている可能性のあるカーネルの変更点は何ですか?
エラーメッセージの例を次に示します。
Crash dump was written to: erl_crash.dump
Failed to create aux thread
Jan 07 14:37:25 edeltraud docker[30625]: runtime/cgo: pthread_create failed: Resource temporarily unavailable
dpkg: unrecoverable fatal error, aborting:
fork failed: Resource temporarily unavailable
E: Sub-process /usr/bin/dpkg returned an error code (2)
test -z "/usr/include" || /usr/sbin/mkdir -p "/tmp/lib32-popt/pkg/lib32-popt/usr/include"
/bin/sh: fork: retry: Resource temporarily unavailable
/usr/bin/install -c -m 644 popt.h '/tmp/lib32-popt/pkg/lib32-popt/usr/include'
test -z "/usr/share/man/man3" || /usr/sbin/mkdir -p "/tmp/lib32-popt/pkg/lib32-popt/usr/share/man/man3"
/bin/sh: fork: retry: Resource temporarily unavailable
/bin/sh: fork: retry: No child processes
/bin/sh: fork: retry: Resource temporarily unavailable
/bin/sh: fork: retry: No child processes
/bin/sh: fork: retry: No child processes
/bin/sh: fork: retry: Resource temporarily unavailable
/bin/sh: fork: retry: Resource temporarily unavailable
/bin/sh: fork: retry: No child processes
/bin/sh: fork: Resource temporarily unavailable
/bin/sh: fork: Resource temporarily unavailable
make[3]: *** [install-man3] Error 254
Jan 07 11:04:39 edeltraud docker[780]: time="2016-01-07T11:04:39.986684617+01:00" level=error msg="Error running container: [8] System error: fork/exec /proc/self/exe: resource temporarily unavailable"
[Wed Jan 06 23:20:33.701287 2016] [mpm_event:alert] [pid 217:tid 140325422335744] (11)Resource temporarily unavailable: apr_thread_create: unable to create worker thread