CPU 限制
1. 创建测试的 cgroup
在 /sys/fs/cgroup/cpu 下面创建自己的 cgroups 测试目录,该目录会自动创建一些文件,对进程或者线程的控制都可以通过修改这些文件内容自动完成。
tasks:被 cgroup 管理的进程
cpu.cfs_period_us:时间周期
cpu.cfs_quota_us:在时间周期内能使用的 CPU 时间
cpu.shares:设置 cgroup 的相对值,如果有多个 cgroup 根据此值平均分配
root@:/sys/fs/cgroup/cpu# mkdir cgroup_test
root@:/sys/fs/cgroup/cpu# cd cgroup_test/
root@:/sys/fs/cgroup/cpu/cgroup_test# ls
cgroup.clone_children cpuacct.stat cpuacct.usage_all cpuacct.usage_percpu_sys cpuacct.usage_sys cpu.cfs_period_us cpu.shares notify_on_release
cgroup.procs cpuacct.usage cpuacct.usage_percpu cpuacct.usage_percpu_user cpuacct.usage_user cpu.cfs_quota_us cpu.stat tasks
2. 创建一个消耗 CPU 的进程,吃满 CPU
root@:/test# cat > cpu.py << EOF
> if __name__ == '__main__':
> a = 0
> while True:
> a += 1
> EOF
root:/test# python cpu.py
3. 修改 cgroup 的配置,使其只使用 20% 的 CPU
root@:/sys/fs/cgroup/cpu/cgroup_test# cat cpu.cfs_quota_us
100000
root@:/sys/fs/cgroup/cpu/cgroup_test# cat cpu.cfs_quota_us
100000
root@:/sys/fs/cgroup/cpu/cgroup_test# cat tasks
root@:/sys/fs/cgroup/cpu/cgroup_test# echo 624693 > tasks
root@:/sys/fs/cgroup/cpu/cgroup_test# cat tasks
624693
root@:/sys/fs/cgroup/cpu/cgroup_test# echo 20000 > cpu.cfs_quota_us
Memory 限制
1. 创建 cgroup
memory.memsw.limit_in_bytes:内存+swap空间使用的总量限制
memory.limit_in_bytes:内存使用量限制
memory.memsw.usage_in_bytes:当前cgroup的内存+swap使用量
memory.usage_in_bytes:当前cgroup的内存使用量
memory.max_usage_in_bytes:当前cgroup的历史最大内存使用量
memory.memsw.max_usage_in_bytes:当前cgroup的历史最大内存+swap使用量
root@:/sys/fs/cgroup/memory# mkdir cgroup_test
root@:/sys/fs/cgroup/memory# cd cgroup_test/
root@:/sys/fs/cgroup/memory/cgroup_test# ls
cgroup.clone_children memory.kmem.limit_in_bytes memory.kmem.tcp.usage_in_bytes memory.memsw.max_usage_in_bytes memory.soft_limit_in_bytes tasks
cgroup.event_control memory.kmem.max_usage_in_bytes memory.kmem.usage_in_bytes memory.memsw.usage_in_bytes memory.stat
cgroup.procs memory.kmem.slabinfo memory.limit_in_bytes memory.move_charge_at_immigrate memory.swappiness
memory.failcnt memory.kmem.tcp.failcnt memory.max_usage_in_bytes memory.numa_stat memory.usage_in_bytes
memory.force_empty memory.kmem.tcp.limit_in_bytes memory.memsw.failcnt memory.oom_control memory.use_hierarchy
memory.kmem.failcnt memory.kmem.tcp.max_usage_in_bytes memory.memsw.limit_in_bytes memory.pressure_level notify_on_release
2. 设置很小的 Memory
root@:/sys/fs/cgroup/memory/cgroup_test# echo 2M > memory.memsw.limit_in_bytes
root@:/sys/fs/cgroup/memory/cgroup_test# echo 2M > memory.limit_in_bytes
3. 使用脚本使用大量 Memory
需要注意内存被分配后,再放入 tasks,由于后续内存一直超过了限制就不会被 Kill 了,所以这里先 sleep 100s
root@:/test# cat mem.py
if __name__ == '__main__':
import time
time.sleep(100)
a = [i for i in range(100000000)]
time.sleep(1000)
root@:/test# python mem.py
4. 将脚本的 PID 放入 tasks 中
echo $(ps -ef | grep mem.py | grep -v grep | awk '{print $2}') > tasks
然后就可以发现进程被自动 Killed
以上创建 cgroup 以及进程绑定 cgroup 的操作可以使用:cgcreate 和 cgexec 简单实现