全長DR

全長DR

全長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=1798308
  • kernel.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

おすすめ記事