这:
$ seq 100000 | xargs -P0 -n1 -I {} bash -c 'echo {};sleep {}'
:
5514
bash: fork: retry: No child processes
当系统有 11666 个进程运行时,在 5500 左右开始抱怨。现在,11666 让我感到非常惊讶,因为:
$ ulimit -u
313370
$ cat /proc/sys/kernel/pid_max
313370
$ grep hard.*nproc /etc/security/limits.conf
* hard nproc 313370
为什么我只能运行11600个进程?
编辑:
对另一个用户进行测试,我得到 6100 个(即 12200 个进程),因此总共 24000 个进程。所以限制不是系统范围的。
$ uname -a
Linux aspire 4.4.0-116-generic #140-Ubuntu SMP Mon Feb 12 21:23:04 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
$ grep -i tasksmax /etc/systemd/*
/etc/systemd/logind.conf:#UserTasksMax=12288
/etc/systemd/system.conf:#DefaultTasksMax=
所以 12288 可能是罪魁祸首。我将其更改为 1000 并执行以下操作:
sudo systemctl daemon-reexec
sudo systemctl restart systemd-logind
如果我现在以以前未登录的用户身份登录,则新限制将起作用。但是,如果我以最近登录的用户身份登录,则会强制执行首次登录时的活动限制。所以限制被缓存在某个地方。
使用上面的方法,我测试了多达 30000 个进程,这有效,但仅适用于之前未登录的用户。
那么缓存的限制是什么呢
/etc/systemd/logind.conf
?我怎样才能刷新该缓存?
新的限制远高于 60000 个进程(并且可能是我期望的 313370)。
答案1
有问题的系统运行 systemd。这是使用的一件事cgroups将系统资源分配给不同的进程组。
sysctl 可能已kernel.sched_autogroup_enabled = 1
设置。这是使用 cgroup 划分系统资源的第二件事。
一旦某个特定用户的一个或一组 cgroup 被初始化,它就可能保持不变,直到重新启动为止。
我没有办法确定是因为 systemd 还是 autogroup,是因为进程数限制还是因为内存限制(在 cgroup 内),也没有办法在源代码中进行搜索。想发表评论而不是回答,但我没有足够的声誉。