【问题标题】:Maximum number of children processes on LinuxLinux 上的最大子进程数
【发布时间】:2015-04-13 12:35:50
【问题描述】:

下面的代码将产生尽可能多的孩子。自己不会再分叉,一旦父进程退出就会变成僵尸。
父进程会产生多少子进程?

int main(int argc, char *arg[])
{
     while(fork() > 0);
}

【问题讨论】:

  • 我不知道这是否要求效率,但while(fork() >= 0)会更好。或者更糟,取决于所有者是谁。
  • 如果我添加 >= 儿子也会生儿子,我不想那样。
  • 僵尸进程仍然分配有它们的 pid,所以如果你有足够的内存来保存进程数据,max_pids 可能是你的限制。

标签: c linux fork


【解决方案1】:

可以使用setrlimit(2)RLIMIT_NPROC 限制子进程的数量。请注意,fork(2) 可能由于多种原因而失败。您可以使用 bash builtin ulimit 来设置该限制。

您可以使用getrlimit(或解析/proc/self/limits,请参阅proc(5))来获取该信息。

在系统范围内,您可能会使用/proc/sys/kernel/threads-max,因为:

此文件指定系统范围内的线程数限制 (任务)可以在系统上创建。

还有/proc/sys/kernel/pid_max

此文件指定 PID 环绕的值(即, 此文件中的值比最大 PID 大一)。 PID 大于该值的不分配;因此,这个值 文件还充当系统范围内的总数量限制 进程和线程。此文件的默认值 32768, 产生与早期内核相同的 PID 范围。在 32 位 平台,32768 是 pid_max 的最大值。在 64 位上 系统,pid_max 可以设置为最大 2^22 的任何值(PID_MAX_LIMIT, 大约 400 万)。

但是,可能存在其他限制(尤其是交换空间)。

内核的任务要么是单线程进程,要么是某个进程中的某个线程——例如由低级系统调用clone(2)(或一些kernel thread,如kworkerksoftirqd 等...)创建。

顺便说一句,进程的实际数量受到可用资源的限制。一个典型的 Linux 桌面只有几百个(现在,我的 Debian/x86-64 桌面具有 32Gb RAM 和 i5-4690S 有 227 个进程)。所以一个进程是一个相当昂贵的资源(它需要 RAM,它需要 CPU ......)。如果它们太多,您将体验到thrashing。而且在实践中,您不希望有太多可运行 进程或可调度任务(可能最多只有几十个,每个core 可能不超过几个)。

【讨论】:

  • getconf CHILD_MAX 是否返回相同的内容?
【解决方案2】:

更新——我可能太快了,没有看到没有 fork 循环。那么这可能取决于在该机器上分叉的成本。僵尸也可能使用系统资源,这些资源在某些时候会被耗尽。而且下面提到的ulimit命令当然还是有效的--

更新 2:我在 some copy of /linux/kernel/fork.c 中看到了这一点,它应该保持机器可用(max_threads 显然也限制了进程的数量,因为每个进程至少有一个线程):

         /*
272          * The default maximum number of threads is set to a safe
273          * value: the thread structures can take up at most half
274          * of memory.
275          */
276         max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);

-- 原答案:

它将创建物理上尽可能多的进程(也就是说,它将快速冻结机器——我已经做到了),或者当前用户或 shell 允许的尽可能多的进程,如果施加这样的限制的话.在 bash 中,可以通过内置的 shell 命令ulimit -u <number> 施加限制。请注意,可能不必通过 bash 启动进程(也许 cron 作业不会)。

【讨论】:

  • 我认为您的答案仍然有效,因为僵尸进程仍然是子进程。孩子们不会使用太多内存,他们只会在内核中有一个task_struct,只有几个唯一的有效指针。当进程变成僵尸进程时,其他人要么为空,要么与父进程相同。
猜你喜欢
  • 2011-08-03
  • 2013-07-22
  • 1970-01-01
  • 2020-11-02
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
  • 2012-01-04
相关资源
最近更新 更多