我运行一个服务器,主要用于随机 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,那么 clone 怎么可能遇到进程资源限制呢?
答案1
经过大量搜索,我发现我遇到了 cgroups 限制。也就是说,通过查询/sys/fs/cgroup/pids/pids.current
和/sys/fs/cgroup/pids/pids.max
,我发现最大值约为 400 个 pid,而我遇到了这个限制。
CUR=$(cat /sys/fs/cgroup/pids/pids.current)
MAX=$(cat /sys/fs/cgroup/pids/pids.max)
echo $CUR/$MAX