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