Ulimit
達到程序限制,但不確定如何
我執行一個伺服器,主要用於隨機 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,並且我遇到了這個限制。CUR=$(cat /sys/fs/cgroup/pids/pids.current) MAX=$(cat /sys/fs/cgroup/pids/pids.max) echo $CUR/$MAX