Cgroup(三)memory和pids子系统
一、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