当我在OpenSuse中运行某个商业构建流程时,遇到以下错误:
fork: retry: No child processes
我在流程中与不同可执行文件对应的各个位置遇到此错误,因此我认为该工具本身不是问题。但是,我同时运行此构建流程的多个实例(最多16个)。根据负载将构建分派到不同的服务器,因此有时一些构建在同一台机器上运行。我怀疑服务器负载在某种程度上与此有关,但我无法确切地知道如何。
我怀疑错误消息与EAGAIN
的{{1}}错误相对应。 fork
手册提供了导致此错误的几个可能原因:
fork
软资源限制(通过RLIMIT_NPROC
设置),这限制了实际用户ID的进程数和线程数setrlimit(2)
已达到(参见/proc/sys/kernel/threads-max
)proc(5)
我相信这些都不满意,因为
/proc/sys/kernel/pid_max
报告无限制为最大用户进程数。ulimit -a
设置为1031129.我监视/proc/sys/kernel/threads-max
中的行数,这应该是1秒的线程数(加上ps输出的标题行)粒度,但它永远不会高于917。ps auxH
设置为32768.我使用/proc/sys/kernel/pid_max
监控进程数,但它永远不会高于726. 我相信我在某处看到内核也有可能耗尽其他(内存?)资源。我该怎么检查?或者在我的推理中还有其他错误吗?
输出表单ps aux
是:
ulimit -a
答案 0 :(得分:1)
也许很明显,但是ulimit-正在运行此构建流程的用户的输出吗?我的一台服务器的示例输出:
[root@server]# cat /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
通常,进程的无限个nr仅留给root用户,以免在fork炸弹中运行。在这里,除root用户外的所有其他用户都将受到限制。
此外,我看到打开文件的数量限制。对于用户,您可以使用lsof -u <user>| wc -l