cgroups 实践

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

cgroups 实践_第1张图片

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 

cgroups 实践_第2张图片

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 简单实现

你可能感兴趣的:(linux,运维,服务器)