`fork的原因:重试:没有子进程`

时间:2017-08-04 21:10:50

标签: c linux multithreading linux-kernel fork

当我在OpenSuse中运行某个商业构建流程时,遇到以下错误:

fork: retry: No child processes

我在流程中与不同可执行文件对应的各个位置遇到此错误,因此我认为该工具本身不是问题。但是,我同时运行此构建流程的多个实例(最多16个)。根据负载将构建分派到不同的服务器,因此有时一些构建在同一台机器上运行。我怀疑服务器负载在某种程度上与此有关,但我无法确切地知道如何。

我怀疑错误消息与EAGAIN的{​​{1}}错误相对应。 fork手册提供了导致此错误的几个可能原因:

  1. fork软资源限制(通过RLIMIT_NPROC设置),这限制了实际用户ID的进程数和线程数
  2. 内核对进程和线程数量的系统范围限制setrlimit(2)已达到(参见/proc/sys/kernel/threads-max
  3. 达到了最大PID数proc(5)
  4. 我相信这些都不满意,因为

    1. /proc/sys/kernel/pid_max报告无限制为最大用户进程数。
    2. ulimit -a设置为1031129.我监视/proc/sys/kernel/threads-max中的行数,这应该是1秒的线程数(加上ps输出的标题行)粒度,但它永远不会高于917。
    3. ps auxH设置为32768.我使用/proc/sys/kernel/pid_max监控进程数,但它永远不会高于726.
    4. 我相信我在某处看到内核也有可能耗尽其他(内存?)资源。我该怎么检查?或者在我的推理中还有其他错误吗?

      输出表单ps aux是:

      ulimit -a

1 个答案:

答案 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

进行检查