xref: /openbmc/linux/Documentation/admin-guide/cgroup-v1/pids.rst (revision 0898782247ae533d1f4e47a06bc5d4870931b284)
1*da82c92fSMauro Carvalho Chehab=========================
2*da82c92fSMauro Carvalho ChehabProcess Number Controller
3*da82c92fSMauro Carvalho Chehab=========================
4*da82c92fSMauro Carvalho Chehab
5*da82c92fSMauro Carvalho ChehabAbstract
6*da82c92fSMauro Carvalho Chehab--------
7*da82c92fSMauro Carvalho Chehab
8*da82c92fSMauro Carvalho ChehabThe process number controller is used to allow a cgroup hierarchy to stop any
9*da82c92fSMauro Carvalho Chehabnew tasks from being fork()'d or clone()'d after a certain limit is reached.
10*da82c92fSMauro Carvalho Chehab
11*da82c92fSMauro Carvalho ChehabSince it is trivial to hit the task limit without hitting any kmemcg limits in
12*da82c92fSMauro Carvalho Chehabplace, PIDs are a fundamental resource. As such, PID exhaustion must be
13*da82c92fSMauro Carvalho Chehabpreventable in the scope of a cgroup hierarchy by allowing resource limiting of
14*da82c92fSMauro Carvalho Chehabthe number of tasks in a cgroup.
15*da82c92fSMauro Carvalho Chehab
16*da82c92fSMauro Carvalho ChehabUsage
17*da82c92fSMauro Carvalho Chehab-----
18*da82c92fSMauro Carvalho Chehab
19*da82c92fSMauro Carvalho ChehabIn order to use the `pids` controller, set the maximum number of tasks in
20*da82c92fSMauro Carvalho Chehabpids.max (this is not available in the root cgroup for obvious reasons). The
21*da82c92fSMauro Carvalho Chehabnumber of processes currently in the cgroup is given by pids.current.
22*da82c92fSMauro Carvalho Chehab
23*da82c92fSMauro Carvalho ChehabOrganisational operations are not blocked by cgroup policies, so it is possible
24*da82c92fSMauro Carvalho Chehabto have pids.current > pids.max. This can be done by either setting the limit to
25*da82c92fSMauro Carvalho Chehabbe smaller than pids.current, or attaching enough processes to the cgroup such
26*da82c92fSMauro Carvalho Chehabthat pids.current > pids.max. However, it is not possible to violate a cgroup
27*da82c92fSMauro Carvalho Chehabpolicy through fork() or clone(). fork() and clone() will return -EAGAIN if the
28*da82c92fSMauro Carvalho Chehabcreation of a new process would cause a cgroup policy to be violated.
29*da82c92fSMauro Carvalho Chehab
30*da82c92fSMauro Carvalho ChehabTo set a cgroup to have no limit, set pids.max to "max". This is the default for
31*da82c92fSMauro Carvalho Chehaball new cgroups (N.B. that PID limits are hierarchical, so the most stringent
32*da82c92fSMauro Carvalho Chehablimit in the hierarchy is followed).
33*da82c92fSMauro Carvalho Chehab
34*da82c92fSMauro Carvalho Chehabpids.current tracks all child cgroup hierarchies, so parent/pids.current is a
35*da82c92fSMauro Carvalho Chehabsuperset of parent/child/pids.current.
36*da82c92fSMauro Carvalho Chehab
37*da82c92fSMauro Carvalho ChehabThe pids.events file contains event counters:
38*da82c92fSMauro Carvalho Chehab
39*da82c92fSMauro Carvalho Chehab  - max: Number of times fork failed because limit was hit.
40*da82c92fSMauro Carvalho Chehab
41*da82c92fSMauro Carvalho ChehabExample
42*da82c92fSMauro Carvalho Chehab-------
43*da82c92fSMauro Carvalho Chehab
44*da82c92fSMauro Carvalho ChehabFirst, we mount the pids controller::
45*da82c92fSMauro Carvalho Chehab
46*da82c92fSMauro Carvalho Chehab	# mkdir -p /sys/fs/cgroup/pids
47*da82c92fSMauro Carvalho Chehab	# mount -t cgroup -o pids none /sys/fs/cgroup/pids
48*da82c92fSMauro Carvalho Chehab
49*da82c92fSMauro Carvalho ChehabThen we create a hierarchy, set limits and attach processes to it::
50*da82c92fSMauro Carvalho Chehab
51*da82c92fSMauro Carvalho Chehab	# mkdir -p /sys/fs/cgroup/pids/parent/child
52*da82c92fSMauro Carvalho Chehab	# echo 2 > /sys/fs/cgroup/pids/parent/pids.max
53*da82c92fSMauro Carvalho Chehab	# echo $$ > /sys/fs/cgroup/pids/parent/cgroup.procs
54*da82c92fSMauro Carvalho Chehab	# cat /sys/fs/cgroup/pids/parent/pids.current
55*da82c92fSMauro Carvalho Chehab	2
56*da82c92fSMauro Carvalho Chehab	#
57*da82c92fSMauro Carvalho Chehab
58*da82c92fSMauro Carvalho ChehabIt should be noted that attempts to overcome the set limit (2 in this case) will
59*da82c92fSMauro Carvalho Chehabfail::
60*da82c92fSMauro Carvalho Chehab
61*da82c92fSMauro Carvalho Chehab	# cat /sys/fs/cgroup/pids/parent/pids.current
62*da82c92fSMauro Carvalho Chehab	2
63*da82c92fSMauro Carvalho Chehab	# ( /bin/echo "Here's some processes for you." | cat )
64*da82c92fSMauro Carvalho Chehab	sh: fork: Resource temporary unavailable
65*da82c92fSMauro Carvalho Chehab	#
66*da82c92fSMauro Carvalho Chehab
67*da82c92fSMauro Carvalho ChehabEven if we migrate to a child cgroup (which doesn't have a set limit), we will
68*da82c92fSMauro Carvalho Chehabnot be able to overcome the most stringent limit in the hierarchy (in this case,
69*da82c92fSMauro Carvalho Chehabparent's)::
70*da82c92fSMauro Carvalho Chehab
71*da82c92fSMauro Carvalho Chehab	# echo $$ > /sys/fs/cgroup/pids/parent/child/cgroup.procs
72*da82c92fSMauro Carvalho Chehab	# cat /sys/fs/cgroup/pids/parent/pids.current
73*da82c92fSMauro Carvalho Chehab	2
74*da82c92fSMauro Carvalho Chehab	# cat /sys/fs/cgroup/pids/parent/child/pids.current
75*da82c92fSMauro Carvalho Chehab	2
76*da82c92fSMauro Carvalho Chehab	# cat /sys/fs/cgroup/pids/parent/child/pids.max
77*da82c92fSMauro Carvalho Chehab	max
78*da82c92fSMauro Carvalho Chehab	# ( /bin/echo "Here's some processes for you." | cat )
79*da82c92fSMauro Carvalho Chehab	sh: fork: Resource temporary unavailable
80*da82c92fSMauro Carvalho Chehab	#
81*da82c92fSMauro Carvalho Chehab
82*da82c92fSMauro Carvalho ChehabWe can set a limit that is smaller than pids.current, which will stop any new
83*da82c92fSMauro Carvalho Chehabprocesses from being forked at all (note that the shell itself counts towards
84*da82c92fSMauro Carvalho Chehabpids.current)::
85*da82c92fSMauro Carvalho Chehab
86*da82c92fSMauro Carvalho Chehab	# echo 1 > /sys/fs/cgroup/pids/parent/pids.max
87*da82c92fSMauro Carvalho Chehab	# /bin/echo "We can't even spawn a single process now."
88*da82c92fSMauro Carvalho Chehab	sh: fork: Resource temporary unavailable
89*da82c92fSMauro Carvalho Chehab	# echo 0 > /sys/fs/cgroup/pids/parent/pids.max
90*da82c92fSMauro Carvalho Chehab	# /bin/echo "We can't even spawn a single process now."
91*da82c92fSMauro Carvalho Chehab	sh: fork: Resource temporary unavailable
92*da82c92fSMauro Carvalho Chehab	#
93