这个:
$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).
解决方法:
有问题的系统运行systemd.这是使用cgroups在不同进程组之间划分系统资源的一件事.
sysctl kernel.sched_autogroup_enabled = 1可能已设置.这将是使用cgroup划分系统资源的第二件事.
有可能一旦特定用户的cgroup或一组cgroup被初始化,它就会保持不变,直到重新启动.
我没有办法去寻找它是因为systemd还是autogroup,是因为进程数限制还是因为内存限制(在cgroup内),也没有时间在源代码中搜索.想要评论而不是回答,但我没有足够的声誉.