4.3カーネルで「リソースが一時的に利用不可」でスレッドの作成が失敗する


39

いくつかのコンテナでArch Linux(カーネル4.3.3-2)でdockerサーバーを実行しています。前回の再起動以来、ドッカーサーバーとコンテナ内のランダムプログラムの両方がクラッシュし、スレッドを作成できない、または(あまり頻繁ではありませんが)フォークするというメッセージが表示されます。特定のエラーメッセージはプログラムによって異なりますが、それらのほとんどは特定のエラーに言及しているようですResource temporarily unavailable。エラーメッセージの例については、この投稿の最後をご覧ください。

今、このエラーメッセージを受け取った人がたくさんいますし、彼らへの応答もたくさんあります。本当にイライラするのは、誰もが問題を解決する方法を推測しているように見えることですが、問題の多くの考えられる原因のどれが存在するかを特定する方法を誰も指摘していないようです。

エラーの考えられる5つの原因と、それらがシステムに存在しないことを確認する方法を収集しました。

  1. /proc/sys/kernel/threads-maxsource)で設定されるスレッドの数にはシステム全体の制限があります。私の場合、これはに設定されてい60613ます。
  2. すべてのスレッドはスタック内のスペースを使用します。スタックサイズの制限はulimit -ssource)を使用して構成されます。私のシェルの制限があることに使用される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ドッキングウィンドウコンテナ内。
  3. すべてのスレッドはいくらかのメモリを消費します。仮想メモリの制限は、を使用して構成されますulimit -v。私のシステムではに設定されてunlimitedおり、3 GBのメモリの80%が無料です。
  4. を使用するプロセスの数には制限がありますulimit -u。この場合、スレッドはプロセスとしてカウントされます(source)。私のシステムでは、制限はに設定されて30306おり、Dockerデーモンおよび内部のdockerコンテナの場合、制限は1048576です。現在実行中のスレッドの数は、実行ls -1d /proc/*/task/* | wc -lまたは実行ps -elfT | wc -lsource)によって確認できます。私のシステムでは、それらはとの間に700あり800ます。
  5. 開いているファイルの数には制限があります。一部のソースによると、これはスレッドを作成するときにも関係します。制限はを使用して設定されますulimit -n。私のシステムと内部ドッカーでは、制限がに設定されてい1048576ます。開いているファイルの数はlsof | wc -lsource)を使用して調べることができます30000。私のシステムでは約です。

最後のリブート前にカーネル4.2.5-1を実行していたように見えますが、現在は4.3.3-2を実行しています。4.2.5-1にダウングレードすると、すべての問題が修正されます。この問題に言及している他の投稿はthisthisです。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

1
最近4.3カーネルにアップグレードしましたか?
ロニChoudhury

それは非常に可能です。どうして?
cdauth

1
驚くべきことに、私はカーネル4.2.5-1にダウングレードし、すべてが再び機能するようになりました!これを引き起こしている原因と、4.3で修正する方法の手がかりはありますか?
cdauth

何が原因なのかはわかりません。それを修正する私の方法は、トピックに関するArch Linuxフォーラムのスレッドが「解決済み」とマークされるのを待っていることです:-P。
ロニChoudhury

1
+1私同じ問題を抱えていなかったとしても、よく尋ねられ調査された質問であるため
Roy Truelove

回答:


47

この問題はTasksMaxsystemd属性が原因です。systemd 228で導入され、Linuxカーネル4.3で導入されたcgroups pidサブシステムを利用しています。512したがって、カーネル4.3以降が実行されている場合、systemd でタスク制限が有効になります。この機能はここで発表され、このプルリクエストで導入され、デフォルト値はこのプルリクエストによって設定されました。カーネルを4.3にアップグレードsystemctl status dockerすると、次のTasks行が表示されます。

# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/etc/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since Fri 2016-01-15 19:58:00 CET; 1min 52s ago
     Docs: https://docs.docker.com
 Main PID: 2770 (docker)
    Tasks: 502 (limit: 512)
   CGroup: /system.slice/docker.service

TasksMax=infinity[Service]セクションで設定docker.serviceすると、問題が修正されます。docker.service通常は/usr/share/systemd/systemにありますが/etc/systemd/system、パッケージマネージャーによって上書きされることを避けるために、配置/コピーすることもできます。

Dockerサンプルsystemdファイルのプルリクエストが増加TasksMaxしており、Arch Linuxのバグレポートがパッケージに対して同じことを達成しようとしています。Arch Linuxフォーラムlxcに関するArch Linuxバグレポートで、さらに議論が行われています。

DefaultTasksMax[Manager]セクションで/etc/systemd/system.conf(または/etc/systemd/user.confユーザー実行サービス用)を使用して、のデフォルト値を制御できますTasksMax

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


1
FWIW、サービスファイルは/lib/systemd/system/docker.service私のDebianテストでありました。
コンパイラ

2
FWIW systemctl set-property docker.service TasksMax=4096は、現在実行中のサービスのプロパティを設定し、問題のDockerインストールの正しい場所で後続の再起動の設定を保持します。
-Nakedible

これは一般的なアプローチです。ただし、提案したDockerの変更は、2016-02-09にこの回答を投稿した後に元に戻され、この復帰はDockerバージョン1.10.1で世界にリリースされることに注意してください。
JdeBP

男、ありがとう、ありがとう!私はこのためにtoooooが長い間探している
achabahe

設定ファイルに変更を加えた場合(私の場合は/etc/systemd/system/docker.service.d/50-TasksMax.confUbuntu 16にありました)、を実行する必要がありますsystemctl daemon-reload。を実行してsudo service docker restartも機能しません。
オスマン

4

cdauthの答えは正しいですが、追加する詳細があります。

systemd 229と4.3カーネルを備えたUbuntu 16.04システムでは、UserTasksMaxが新しく増加したデフォルトの12288に設定されていても、デフォルトでセッションスコープに512 pidの制限が適用されました。したがって、ユーザーセッションスコープは512スレッドに制限されていました

制限を削除する唯一の方法は、設定DefaultTasksMax=unlimited/etc/systemd/system.confsystemctl daemon-reexec(または再起動して)ください。

これが発生しているかどうかは、発行systemctl status、セッションスコープの選択、およびで確認できcat /sys/fs/cgroup/pids/user.slice/user-${UID}.slice/session-FOO.scope/pids.maxます。


/etc/systemd/system.confに変更を加えて再起動しました。Dockerはタスクの制限を512としてリストしています。上記の@Nakedibleのコメントを使用すると、利用可能なタスクが更新されました。
ベンマシューズ

1
ライアンありがとう!@BenMathewsはおそらく、Ubuntu 16.04では両方とも有効な問題であるため適切に機能するためには両方を修正する必要があります。この問題は、シェルのユーザーではなく、デーモンによって起動されたコンテナに適用されるようです。そのため、すべてが正常に表示さ@reboot lxc-autostartれ、crontabに追加して起動時に自動起動し、再起動後に突然障害のあるコンテナーを取得します。
qris

1

このスレッドを読んだ後。

このソリューションは私のために働いた:docker -d --exec-opt native.cgroupdriver=cgroupfs。私は実際にこれを追加しましたOPTIONS/etc/sysconfig/docker...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.