全長DR
私が実行している複数のDockerコンテナを起動すると、次npm ci
のメッセージが表示され始めます。pthread_create: リソースを一時的に使用できません。エラー(5つ未満のDockerコンテナが正しく実行される可能性があります)のどこかにある種のスレッド制限があると推測されますが、ここではどのスレッドがブロックされているかがわかりません。
構成
- ㅏジェンキンスインスタンスは各ビルドに対してDockerコンテナを起動します(Sshを介してこのDockerコンテナに接続します)。
- 各コンテナでいくつかのビルドコマンドを実行します。このエラーは
npm ci
かなり多くのスレッドを生成しているようですが、この問題はnpm
それ自体に関連しているとは思いません。 - すべてのドッカーコンテナは単一のコンテナで実行されます。ドッカーホスト。仕様:
ドッカーホスト
- Intel(R) Xeon(R) Gold 5118 CPU @ 2.30GHz、12コア、220GB RAM
- セントース7
- Dockerバージョン18.06.1-ce、ビルドe68fc7a
- システムバージョン219
- カーネル 3.10.0-957.5.1.el7.x86_64
間違い
さまざまな形式のエラーが表示されます。
- Jenkinsは、次のエラーのためDockerコンテナにアクセスできません。java.lang.OutOfMemoryError: 新しい基本スレッドを作成できません。
git clone
コンテナ内のエラーエラー:リモートリポジトリ「origin」の複製中にエラーが発生しました...原因:java.lang.OutOfMemoryError:新しい基本スレッドを作成できませんでした。npm ci
コンテナ内のエラーノード[1296]: pthread_create: リソースを一時的に使用できません。
私が調査したか試したこと
たくさん見ました。この問題。
- ドッカーホストバージョン219があるので
systemd
ありません。TasksMax
属性。 /proc/sys/kernel/threads-max
=1798308kernel.pid_max
= 49152- スレッド数(
ps -elfT | wc -l
)は通常700個ですが、複数のコンテナを実行すると4500個まで上がることがわかりました。 - すべてのビルドはdockerコンテナ内でpid 1001を持つユーザーとして実行されますが、pid 1001を持つユーザーはありません。ドッカーホストしたがって、このユーザーにどのような制限が適用されるのかわかりません。
- すべてのユーザーに複数の制限を追加しました
/etc/security/limits.conf
(下記参照)。 - uid 1001で仮想ユーザーを作成しました。ドッカーホストそして、
nproc
制限を無制限に設定したことを確認してください。このユーザーとしてログインulimit -u
しても制限はありません。それでも問題は解決しません。
/etc/security/limits.conf:
* soft nproc unlimited
* soft stack 65536
* soft nofile 2097152
ルートへの出力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) 899154
max locked memory (kbytes, -l) 1048576
max memory size (kbytes, -m) unlimited
open files (-n) 1048576
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 65536
cpu time (seconds, -t) unlimited
max user processes (-u) 899154
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
私のdockerdプロセスの制限(cat /proc/16087/limits
、ここで16087はdockerdのpidです)
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size unlimited unlimited bytes
Max core file size unlimited unlimited bytes
Max resident set unlimited unlimited bytes
Max processes unlimited unlimited processes
Max open files 65536 65536 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 899154 899154 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
答え1
4096以上のスレッドにアクセスする方法を見つけました。
私のドッカーコンテナはcentos7イメージです。デフォルトでは、ユーザー制限は次のように定義された4096プロセスに設定されます/etc/security/limits.d/20-nproc.conf
。
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
* soft nproc 4096
root soft nproc unlimited
私のDockerコンテナにログインしたときに、そのユーザーに対するこの制限を削除する~/.bashrc
コマンドを追加しました。ulimit -u unlimited
これでこの4096天井を突破できるようになりました。
このソリューションはあまり満足できません。なぜなら、実行中のすべてのコンテナを調整する必要があるからです。ドッカーホストすべて固有の制限があるため、すべてのビルドコマンドをユーザーとして実行するため、コンテナが実行している1001
スレッドの数を尋ねるようです。彼は自分の例だけでなく、すべてのコンテナのすべてのスレッドを一緒に「見る」。
これに対してdocker-for-linux githubに問題を作成しました。https://github.com/docker/for-linux/issues/654