Docker
執行多個 docker 實例時出現“pthread_create:資源暫時不可用”
TLDR
當我在其中執行多個 docker 容器時
npm ci
,我開始收到pthread_create: Resource暫時不可用錯誤(少於 5 個 docker 容器可以正常執行)。我推斷某處存在某種執行緒限制,但我找不到哪一個在這裡阻塞。配置
- 一個Jenkins實例為每個建構啟動 docker 容器(通過 ssh 連接到這個 docker 容器)。
- 在每個容器中執行一些建構命令;我在使用時經常看到錯誤,
npm ci
因為這似乎創建了很多執行緒;但我不認為問題與npm
它本身有關。- 所有 docker 容器都在單個docker-host上執行。它的規格:
碼頭主機
- Intel(R) Xeon(R) Gold 5118 CPU @ 2.30GHz,12 核,220 GB RAM
- 700
- Docker 版本 18.06.1-ce,建構 e68fc7a
- 系統版本 219
- 核心 3.10.0-957.5.1.el7.x86_64
錯誤
我可以看到不同形式的錯誤:
- jenkins 無法聯繫到 docker 容器;像這樣的錯誤:java.lang.OutOfMemoryError:無法創建新的本機執行緒
git clone
在容器內失敗並出現錯誤:複製遠端 repo ‘origin’ 時出錯 … 原因:java.lang.OutOfMemoryError:無法創建新的本機執行緒npm ci
在帶有節點的容器內失敗**$$ 1296 $$: pthread_create: 資源暫時不可用**我調查或嘗試過的事情
我看了很多這個問題。
- docker-host的
systemd
版本為 219,因此沒有該TasksMax
屬性。/proc/sys/kernel/threads-max
= 1798308kernel.pid_max
= 49152- 執行緒數
ps -elfT | wc -l
(- 所有建構都以 docker 容器內 pid 1001 的某個使用者身份執行;但是docker-host上沒有 pid 1001 的使用者,所以我不知道哪些限制適用於該使用者。
- 我已經為所有使用者增加了多個限制
/etc/security/limits.conf
(見下文)- 我在docker-host上創建了一個 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 程序的限制(
/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
我找到了一種訪問超過 4096 個執行緒的方法。
我的 docker 容器是 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的天花板了。我對這個解決方案並不完全滿意;因為這意味著我需要調整將在docker-host上執行的所有容器,因為它們都有自己的限制;並且由於我以使用者身份執行所有建構命令,
1001
因此似乎當容器詢問他執行了多少執行緒時;他“看到”了所有容器的所有執行緒;不僅是他自己的例子。為此,我在 docker-for-linux github 中創建了一個問題:https ://github.com/docker/for-linux/issues/654