进程数量控制器
摘要
进程数量控制器用于允许 cgroup 层次结构在达到一定限制后阻止任何新任务进行 fork() 或 clone()。
由于很容易达到任务限制而不触及任何已设置的 kmemcg 限制,PID 是一种基本资源。因此,在 cgroup 层次结构的范围内,必须通过允许限制 cgroup 中任务数量的资源来防止 PID 耗尽。
用法
要使用 pids 控制器,需设置 pids.max 中的任务最大数量(出于明显的原因,根 cgroup 中不可用)。当前 cgroup 中的进程数量由 pids.current 给出。
组织操作不会受到 cgroup 策略的阻碍,因此可能出现 pids.current > pids.max 的情况。这可以通过将限制设置为小于 pids.current,或者将足够多的进程附加到 cgroup 中使得 pids.current > pids.max 来实现。但是,不可能通过 fork() 或 clone() 违反 cgroup 策略。如果创建新进程会导致违反 cgroup 策略,fork() 和 clone() 将返回 -EAGAIN。
要将 cgroup 设置为无限制,将 pids.max 设置为 "max"。这是所有新 cgroup 的默认设置(注意,PID 限制是分层的,因此遵循层次结构中最严格的限制)。
pids.current 跟踪所有子 cgroup 层次结构,因此 parent/pids.current 是 parent/child/pids.current 的超集。
pids.events 文件包含事件计数器:
- max:因达到限制而 fork 失败的次数。
示例
首先,挂载 pids 控制器:
# mkdir -p /sys/fs/cgroup/pids
# mount -t cgroup -o pids none /sys/fs/cgroup/pids
然后创建一个层次结构,设置限制并将进程附加到其中:
# mkdir -p /sys/fs/cgroup/pids/parent/child
# echo 2 > /sys/fs/cgroup/pids/parent/pids.max
# echo $$ > /sys/fs/cgroup/pids/parent/cgroup.procs
# cat /sys/fs/cgroup/pids/parent/pids.current
2
需要注意的是,尝试突破设置的限制(在本例中为 2)将失败:
# cat /sys/fs/cgroup/pids/parent/pids.current
2
# ( /bin/echo "Here's some processes for you." | cat )
sh: fork: Resource temporary unavailable
即使我们迁移到一个没有设置限制的子 cgroup 中,也无法突破层次结构中最严格的限制(在本例中为父级的限制):
# echo $$ > /sys/fs/cgroup/pids/parent/child/cgroup.procs
# cat /sys/fs/cgroup/pids/parent/pids.current
2
# cat /sys/fs/cgroup/pids/parent/child/pids.current
2
# cat /sys/fs/cgroup/pids/parent/child/pids.max
max
# ( /bin/echo "Here's some processes for you." | cat )
sh: fork: Resource temporary unavailable
我们可以设置一个小于 pids.current 的限制,这将完全阻止任何新进程的 fork(请注意,shell 本身也计入 pids.current):
# echo 1 > /sys/fs/cgroup/pids/parent/pids.max
# /bin/echo "We can't even spawn a single process now."
sh: fork: Resource temporary unavailable
# echo 0 > /sys/fs/cgroup/pids/parent/pids.max
# /bin/echo "We can't even spawn a single process now."
sh: fork: Resource temporary unavailable
标签:sys,控制器,fs,parent,current,cgroup,进程,ChatGPT,pids
From: https://www.cnblogs.com/pengdonglin137/p/17891917.html