在Linux Kernel 4.3中,引入了一个新的cgroups子系统pids
,通过这个子系统,可以实现对某个控制组中进程和线程的总数进行限制。
使用前,首先需要挂载该子系统(对于很多的发行版,默认是会挂载的):
[root@test ~]
[root@test ~]
首先创建一个新的控制组test_max_proc
:
[root@test ~]
[root@test ~]
total 0
-rw-r--r-- 1 root root 0 Apr 26 09:11 cgroup.clone_children
-rw-r--r-- 1 root root 0 Apr 26 09:11 cgroup.procs
-rw-r--r-- 1 root root 0 Apr 26 09:11 notify_on_release
-r--r--r-- 1 root root 0 Apr 26 09:11 pids.current
-r--r--r-- 1 root root 0 Apr 26 09:11 pids.events
-rw-r--r-- 1 root root 0 Apr 26 09:11 pids.max
-rw-r--r-- 1 root root 0 Apr 26 09:11 tasks
其中,pids.max
控制该组中最多可以拥有的进程数,其中线程也包含在其中。pids.current
存储了当前控制组的进程(线程)总数。cgroup.procs
是需要限制的进程pid。
[root@test ~]
[root@test ~]
[root@test ~]
2
[root@test ~]
bash: fork: retry: Resource temporarily unavailable
bash: fork: retry: Resource temporarily unavailable
bash: fork: retry: Resource temporarily unavailable
可以看到限制生效了。由于Linux的线程也是类似进程的实现,因此,当程序有多个线程时,进程和线程的总数也不能超过设定的值
参考:
- http://man7.org/linux/man-pages/man7/cgroups.7.html
- https://www.kernel.org/doc/Documentation/cgroup-v1/pids.txt