利用Cgroups的pids子系统限制进程(线程)数量

在Linux Kernel 4.3中,引入了一个新的cgroups子系统pids,通过这个子系统,可以实现对某个控制组中进程和线程的总数进行限制。
使用前,首先需要挂载该子系统(对于很多的发行版,默认是会挂载的):

[root@test ~]# mkdir -p /sys/fs/cgroup/pids
[root@test ~]# mount -t cgroup -o pids none /sys/fs/cgroup/pids

首先创建一个新的控制组test_max_proc:

[root@test ~]# mkdir /sys/fs/cgroup/pids/test_max_proc
[root@test ~]# ls -l /sys/fs/cgroup/pids/test_max_proc/
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 ~]# echo 2 > /sys/fs/cgroup/pids/test_max_proc/pids.max
[root@test ~]# echo $$ > /sys/fs/cgroup/pids/test_max_proc/cgroup.procs
[root@test ~]# cat /sys/fs/cgroup/pids/parent/pids.current
2
[root@test ~]# /bin/echo "Here's some processes for you." | cat
bash: fork: retry: Resource temporarily unavailable
bash: fork: retry: Resource temporarily unavailable
bash: fork: retry: Resource temporarily unavailable

可以看到限制生效了。由于Linux的线程也是类似进程的实现,因此,当程序有多个线程时,进程和线程的总数也不能超过设定的值

参考:

  1. http://man7.org/linux/man-pages/man7/cgroups.7.html
  2. https://www.kernel.org/doc/Documentation/cgroup-v1/pids.txt