Ole*_*nge 8 linux bash process ulimit
这个:
$ seq 100000 | xargs -P0 -n1 -I {} bash -c 'echo {};sleep {}'
:
5514
bash: fork: retry: No child processes
Run Code Online (Sandbox Code Playgroud)
当系统运行 11666 个进程时,开始抱怨 5500 左右。现在,11666 对我来说真的很惊讶,因为:
$ ulimit -u
313370
$ cat /proc/sys/kernel/pid_max
313370
$ grep hard.*nproc /etc/security/limits.conf
* hard nproc 313370
Run Code Online (Sandbox Code Playgroud)
为什么我只能运行11600个进程?
编辑:
在另一个用户上测试我得到 6100(即 12200 procs),因此总共 24000 procs。所以限制不是系统范围的。
$ 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=
Run Code Online (Sandbox Code Playgroud)
所以12288可能是罪魁祸首。我将其更改为 1000 并执行以下操作:
sudo systemctl daemon-reexec
sudo systemctl restart systemd-logind
Run Code Online (Sandbox Code Playgroud)
如果我现在以未像以前那样登录的用户身份登录,则新限制有效。但是,如果我以最近登录过的用户身份登录,则会强制执行首次登录时的活动限制。所以限制被缓存在某处。
使用上面的我测试了多达 30000 个 procs 并且这有效,但仅适用于之前未登录的用户。
那么从什么缓存限制
/etc/systemd/logind.conf呢?我该如何刷新该缓存?
新的限制远高于 60000 procs(并且可能是我所期望的 313370)。
有问题的系统运行 systemd。这是使用cgroups在各个进程组之间划分系统资源的一件事。
sysctl 可能kernel.sched_autogroup_enabled = 1已设置。这是使用 cgroup 划分系统资源的第二件事。
一旦某个特定用户的一个或一组 cgroup 被初始化,它就可能保持不变,直到重新启动为止。
我没有办法确定是因为 systemd 还是 autogroup,是因为进程数限制还是因为内存限制(在 cgroup 内),也没有办法在源代码中进行搜索。想发表评论而不是回答,但我没有足够的声誉。