Chr*_*aes 5 multithreading ulimit docker
在npm ci启动我运行的多个 docker 容器时,我开始收到pthread_create: Resource暂时不可用错误(少于 5 个 docker 容器可以正常运行)。我推断某处存在某种线程限制,但我找不到此处阻塞的是哪个线程。
npm ci因为这似乎创建了很多线程;但我不认为问题与npm它本身有关。docker-host
我可以看到不同形式下的错误:
git clone在容器内失败并出现错误:错误克隆远程存储库“原点”...... 原因:java.lang.OutOfMemoryError:无法创建新的本机线程npm ci在节点 [1296]的容器内失败:pthread_create:资源暂时不可用这个问题我看了很多。
systemd版本219,因此是不具备的TasksMax属性。/proc/sys/kernel/threads-max = 1798308kernel.pid_max = 49152ps -elfT | wc -l) 通常为 700,但在运行多个容器时,我看到它攀升至 4500。/etc/security/limits.conf(见下文)nproc将限制设置为无限制。登录该用户ulimit -u= 无限制。这仍然没有解决问题/etc/security/limits.conf :
* soft nproc unlimited
* soft stack 65536
* soft nofile 2097152
Run Code Online (Sandbox Code Playgroud)
ulimit -a以 root 身份输出:
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
Run Code Online (Sandbox Code Playgroud)
我的 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
Run Code Online (Sandbox Code Playgroud)
我找到了一种方法来访问超过 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
Run Code Online (Sandbox Code Playgroud)
当登录到我的 docker 容器时;我添加到~/.bashrc命令中ulimit -u unlimited,以便为该用户删除此限制。现在我可以突破这个4096的天花板了。
我对这个解决方案不太满意;因为这意味着我需要调整在docker-host上运行的所有容器,因为它们都有自己的限制;由于我以用户身份运行所有构建命令,1001因此似乎容器询问他正在运行多少个线程;他“看到”所有容器的所有线程在一起;不仅仅是他自己的例子。
我为此在 docker-for-linux github 中创建了一个问题: https: //github.com/docker/for-linux/issues/654
| 归档时间: |
|
| 查看次数: |
5015 次 |
| 最近记录: |