Docker

執行多個 docker 實例時出現“pthread_create:資源暫時不可用”

  • April 29, 2019

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-hostsystemd版本為 219,因此沒有該TasksMax屬性。
  • /proc/sys/kernel/threads-max= 1798308
  • kernel.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/limits16087 是 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

引用自:https://unix.stackexchange.com/questions/515496