微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐