我们服务器使用supervisor管理大量的进程,一台机跑了 个进程。在supervisor里面起一些进程的时候程序会报fork/exec /bin/sh: resource temporarily unavailable错误以及RLIMIT_NPROC 1000000 current,1000000 max
前者错误说明资源不足但是不知道具体是什么资源不足,后者说明了是NPROC即进程可拥有的最大子进程数目。
针对后者排查实际我们不可能达到这么大的数量限制,而且这个1000000的数字我们也一直没有找到在哪里设置的。首先通过ulimit -a查看了各个用户的数值,发现找不到对应的值,最后是通过直接查看supervisor的进程信息发现了这个限制在哪里
cat /proc/pid/limits
但是很奇怪的是在配置文件/etc/supervisor/supervisor.conf里面也没有这个限制。然后查找supervisor的service启动文件才发现配置了在这里
LimitNOFILE=1000000
LimitNPROC=1000000
但是目前还没有解决问题,为什么会报这个错误,毕竟资源使用没有这么大。通过strace命令跟踪进程启动的过程,显示的错误是clone的时候爆egage,报这个错误有几个原因,一个是RLIMIT_NPROC限制,一个是/proc/sys/kernel/threads-max限制,一个是/proc/sys/kernel/pid_max限制,一个是cgroup的“process number“限制,前三者排除了,之后最后一个问题了,我们通过命令service supervisor status查看可以看到Tasks: 4765 (limit: 4915)非常接近限制值了。然后尝试增加这个限制值来解决问题,首先修改/lib/systemd/system/supervisor.service文件,在[Service]下面增加一行TasksMax=7372,然后执行systemctl daemon-reload就生效了。之后尝试增加更多的程序,发现就没有报错了