使用Linux
$ uname -r
4.4.0-1041-aws
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.3 LTS
Release: 16.04
Codename: xenial
限制允许多达200k个进程
$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 563048
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 524288
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) unlimited
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
$ cat /proc/sys/kernel/pid_max
200000
$ cat /proc/sys/kernel/threads-max
1126097
足够的可用内存为127k进程提供1MB的空间
$ free
total used free shared buff/cache available
Mem: 144156492 5382168 130458252 575604 8316072 137302624
Swap: 0 0 0
而且我现有的流程/线程不到1k。
$ ps -elfT | wc -l
832
但我无法启动50k进程
$ echo '
seq 50000 | while read _; do
sleep 20 &
done
' | bash
bash: fork: retry: Resource temporarily unavailable
bash: fork: retry: Resource temporarily unavailable
bash: fork: retry: Resource temporarily unavailable
bash: fork: retry: Resource temporarily unavailable
bash: fork: retry: Resource temporarily unavailable
bash: fork: retry: Resource temporarily unavailable
...
为什么我不能创建50k进程?
这是由 Linux癌症 systemd。
除了kernel.pid_max和ulimit之外,我还需要更改第三个限制。
/etc/system的/login的.conf
[Login]
UserTasksMax=70000
然后重启。
在@Basile的答案的基础上,你可能已经没用了pids。
cat /proc/sys/kernel/pid_max
在我的机器上给了我32768(签名短片的最大值)。小于50k
编辑:我错过了/ proc / sys / kernel / pid_max设置为200000.在这种情况下可能不是问题。
因为每个process都需要一些资源:一些RAM(包括一些内核内存),一些CPU等。
每个进程都有自己的virtual address space,包括它自己的call stack(其中一些需要物理资源,包括几个pages的RAM;阅读更多关于resident set size;在我的桌面上,一些bash
进程的RSS约为6Mbytes)。所以一个过程实际上是一些相当重的东西。
顺便说一句,这不是Linux特有的。
阅读有关操作系统的更多信息Operating Systems : Three Easy Pieces
尝试cat /proc/$$/maps
和cat /proc/$$/status
并阅读更多关于proc(5)的信息。了解fork(2)和execve(2)的失败。暂时不可用的资源是EAGAIN
(参见errno(3)),有几个原因可以使fork
失败并使用EAGAIN
。在我的系统上,cat /proc/sys/kernel/pid_max
给出32768(达到该限制为EAGAIN
提供fork
)。
顺便说一句,想象一下,如果你可以分叉一万个进程。那么context switch时间将占主导地位w.r.t.运行时间。
你的Linux系统看起来像一些AWS实例。亚马逊不会让你创建那么多的进程,因为他们的硬件并没有那么多。
(在一些昂贵的超级计算机或服务器上,例如一个TB的RAM和一百个内核,也许你可以运行50K进程;我猜他们需要一些特定的内核或内核配置。我建议从亚马逊支持获得帮助)