我运行一个服务器,主要用于随机 Docker 容器和作为 Gitlab-CI 运行器。每隔一段时间,当服务器运行一周左右时,我就会遇到进程资源限制。
例如,我尝试配置 gitlab runner,
...
Registering runner... succeeded runner=gy1zjHEv
runtime: failed to create new OS thread (have 9 already; errno=11)
runtime: may need to increase max user processes (ulimit -u)
fatal error: newosproc
...
或者几分钟后,尝试安装该strace
实用程序
(in dutch)
...
Instellen van strace (4.21-1ubuntu1) ...
Bezig met afhandelen van triggers voor man-db (2.8.3-2ubuntu0.1) ...
/usr/bin/mandb: fork failed: Hulpbron is tijdelijk onbeschikbaar
/usr/bin/mandb: fork failed: Hulpbron is tijdelijk onbeschikbaar
/usr/bin/mandb: fork failed: Hulpbron is tijdelijk onbeschikbaar
/usr/bin/mandb: fork failed: Hulpbron is tijdelijk onbeschikbaar
/usr/bin/mandb: fork failed: Hulpbron is tijdelijk onbeschikbaar
/usr/bin/mandb: fork failed: Hulpbron is tijdelijk onbeschikbaar
/usr/bin/mandb: fork failed: Hulpbron is tijdelijk onbeschikbaar
/usr/bin/mandb: fork failed: Hulpbron is tijdelijk onbeschikbaar
/usr/bin/mandb: fork failed: Hulpbron is tijdelijk onbeschikbaar
/usr/bin/mandb: fork failed: Hulpbron is tijdelijk onbeschikbaar
/usr/bin/mandb: fork failed: Hulpbron is tijdelijk onbeschikbaar
/usr/bin/mandb: fork failed: Hulpbron is tijdelijk onbeschikbaar
/usr/bin/mandb: fork failed: Hulpbron is tijdelijk onbeschikbaar
/usr/bin/mandb: fork failed: Hulpbron is tijdelijk onbeschikbaar
Bezig met afhandelen van triggers voor libc-bin (2.27-3ubuntu1) ...
它转化为fork failed: Resource is temporarily unavailable
有什么东西导致fork
抛出EAGAIN
。
超限
$ ulimit -u
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 1029355
max locked memory (kbytes, -l) 16384
max memory size (kbytes, -m) unlimited
open files (-n) 32768
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 62987
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
我的最大用户进程设置为62987
,我离使用 62,000 个进程还差得很远。gitlab 异常还显示当前进程数为 9,这应该是“太高”了吗?
如果我离配置的 ulimit 不远,克隆怎么可能遇到进程资源限制?
经过大量搜索,事实证明我遇到了 cgroups 限制。即,通过查询
/sys/fs/cgroup/pids/pids.current
and/sys/fs/cgroup/pids/pids.max
,我看到最大值约为 400 个 pid,并且我遇到了这个限制。