linux – 限制集在哪里? bash:fork:retry:没有子进程

这个:

$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内),也没有时间在源代码中搜索.想要评论而不是回答,但我没有足够的声誉.

上一篇:Supervisord和ulimit到java应用程序


下一篇:linux – 限制文件描述符的数量