一、memory子系統
1、memory子系統的作用
- 限制memory(含匿名和文件映射,swap cache)
- 限制swap+memory
- 顯示cgroup的內存信息
- 為每個cgroup設置softlimit
2、文件解釋
cgroup.event_control #用於eventfd的接口
memory.usage_in_bytes #顯示當前已用的內存
memory.limit_in_bytes #設置/顯示當前限制的內存額度
memory.failcnt #顯示內存使用量達到限制值的次數
memory.max_usage_in_bytes #歷史內存最大使用量
memory.soft_limit_in_bytes #設置/顯示當前限制的內存軟額度
memory.stat #顯示當前cgroup的內存使用情況
memory.use_hierarchy #設置/顯示是否將子cgroup的內存使用情況統計到當前cgroup里面
memory.force_empty #觸發系統立即盡可能的回收當前cgroup中可以回收的內存
memory.pressure_level #設置內存壓力的通知事件,配合cgroup.event_control一起使用
memory.swappiness #設置和顯示當前的swappiness
memory.move_charge_at_immigrate #設置當進程移動到其他cgroup中時,它所占用的內存是否也隨着移動過去
memory.oom_control #設置/顯示oom controls相關的配置
memory.numa_stat #顯示numa相關的內存
3、設置用戶內存
memory.limit_in_bytes:限制memory的大小
memory.memsw.limit_in_bytes:限制swap+memory的大小
當memory.limit_in_bytes==memory.memsw.limit_in_bytes時表示cgroup不使用swap
1)設置memory.limit_in_bytes和memory.memsw.limit_in_bytes的限定值為50M,此時不會使用swap
# cd /sys/fs/cgroup/memory # mkdir mem # echo 50M >mem/memory.limit_in_bytes # echo 50M >mem/memory.memsw.limit_in_bytes # more mem/memory.limit_in_bytes 52428800 # more mem/memory.memsw.limit_in_bytes 52428800
2)將當前bash設置到tasks中,並嘗試使用dd命令創建一個100M的文件,此時會觸發OOM-killer機制
# echo $$ >mem/tasks # dd if=/dev/zero of=/tmp/testfile bs=100M count=1 Killed # more mem/memory.max_usage_in_bytes 使用內存 52428800 # more mem/memory.memsw.max_usage_in_bytes 52428800
二、pids子系統
1、pid子系統作用
能是限制cgroup及其所有子孫cgroup里面能創建的總的task數量。
pids.current: 表示當前cgroup及其所有子孫cgroup中現有的總的進程數量
pids.max: 當前cgroup及其所有子孫cgroup中所允許創建的總的最大進程數量,在根cgroup下沒有這個文件,原因顯而易見,因為我們沒有必要限制整個系統所能創建的進程數量。
2、限制進程數
# mount|grep pids cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids) # cd /sys/fs/cgroup/pids/ # mkdir test # mkdir test # cd test/ # ls -l total 0 -rw-r--r-- 1 root root 0 Nov 23 16:18 cgroup.clone_children --w--w--w- 1 root root 0 Nov 23 16:18 cgroup.event_control -rw-r--r-- 1 root root 0 Nov 23 16:18 cgroup.procs -rw-r--r-- 1 root root 0 Nov 23 16:18 notify_on_release -r--r--r-- 1 root root 0 Nov 23 16:18 pids.current -rw-r--r-- 1 root root 0 Nov 23 16:18 pids.max -rw-r--r-- 1 root root 0 Nov 23 16:18 tasks #將pids.max設置為1,即當前cgroup只允許有一個進程 # echo 1 >pids.max #將當前bash進程加入到該cgroup # echo $$ > cgroup.procs -bash: fork: retry: No child processes -bash: fork: retry: No child processes -bash: fork: retry: No child processes -bash: fork: retry: No child processes -bash: fork: Resource temporarily unavailable
在開一個終端
# cd /sys/fs/cgroup/pids/test # more pids.current 1 # more pids.max 1 # more cgroup.procs 1303