为什么我不能在Linux中创建50k进程?

问题描述 投票:0回答:3

使用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 process ulimit
3个回答
1
投票

这是由 Linux癌症 systemd。

除了kernel.pid_max和ulimit之外,我还需要更改第三个限制。

/etc/system的/login的.conf

[Login]
UserTasksMax=70000

然后重启。


0
投票

在@Basile的答案的基础上,你可能已经没用了pids。

cat /proc/sys/kernel/pid_max在我的机器上给了我32768(签名短片的最大值)。小于50k

编辑:我错过了/ proc / sys / kernel / pid_max设置为200000.在这种情况下可能不是问题。


0
投票

因为每个process都需要一些资源:一些RAM(包括一些内核内存),一些CPU等。

每个进程都有自己的virtual address space,包括它自己的call stack(其中一些需要物理资源,包括几个pages的RAM;阅读更多关于resident set size;在我的桌面上,一些bash进程的RSS约为6Mbytes)。所以一个过程实际上是一些相当重的东西。

顺便说一句,这不是Linux特有的。

阅读有关操作系统的更多信息Operating Systems : Three Easy Pieces

尝试cat /proc/$$/mapscat /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进程;我猜他们需要一些特定的内核或内核配置。我建议从亚马逊支持获得帮助)

© www.soinside.com 2019 - 2024. All rights reserved.