FreezeJ' Blog

使用CGroup来限制程序

2021-09-18

参考文档:
https://www.sohu.com/a/252263523_609423
https://blog.csdn.net/kongxx/article/details/98329891
https://www.cnblogs.com/opama/p/4712139.html

官方文档:
https://www.kernel.org/doc/Documentation/cgroup-v1/cgroups.txt
https://www.kernel.org/doc/Documentation/cgroup-v2.txt

安装cgroup和管理命令

yum install libcgroup libcgroup-tools  # Centos

apt-get install cgroup-bin   # Ubuntu

cgroup 的文件系统默认会挂载到/sys/fs/cgroup/目录下

cgroup管理命令

cgclassify -- cgclassify命令是用来将运行的任务移动到一个或者多个cgroup。

cgclear -- cgclear 命令是用来删除层级中的所有cgroup。

cgconfig.conf -- 在cgconfig.conf文件中定义cgroup。

cgconfigparser -- cgconfigparser命令解析cgconfig.conf文件和并挂载层级。

cgcreate -- cgcreate在层级中创建新cgroup。

cgdelete -- cgdelete命令删除指定的cgroup。

cgexec -- cgexec命令在指定的cgroup中运行任务。

cgget -- cgget命令显示cgroup参数。

cgred.conf -- cgred.conf是cgred服务的配置文件。

cgrules.conf -- cgrules.conf 包含用来决定何时任务术语某些 cgroup的规则。

cgrulesengd -- cgrulesengd 在 cgroup 中发布任务。

cgset -- cgset 命令为 cgroup 设定参数。

lscgroup -- lscgroup 命令列出层级中的 cgroup。

lssubsys -- lssubsys 命令列出包含指定子系统的层级

查看cgroup子系统

lssubsys -am

内存cgroup

# 创建内存cgroup
cgcreate -g memory:/freeze_test

# 查看刚刚创建的cgroup
ls /sys/fs/cgroup/memory/freeze_test 

# 查看当前cgroup设置
cgget -g memory:freeze_test

# 限制内存为10M
cgset -r memory.limit_in_bytes=10M freeze_test

# 可以看到已经设置到该文件
cat /sys/fs/cgroup/memory/freeze_test/memory.limit_in_bytes

# 使用设置的内存cgroup来运行python
cgexec -g memory:freeze_test python3
# 在解析器中执行:
test = ' ' * 1024 * 1024 * 1  # 不会退出
test = ' ' * 1024 * 1024 * 10  # 内存超过cgroup限制,会被kill掉

CPU cgroup

# 创建CPU cgroup
cgcreate -g cpu:/freeze_test

# 查看刚刚创建的cgroup
ls /sys/fs/cgroup/cpu/freeze_test

# 查看当前cgroup设置
cgget -g cpu:freeze_test

#参数说明:
# cpu.cfs_period_us:cpu分配的周期(微秒),默认为100000。
# cpu.cfs_quota_us:表示该control group限制占用的时间(微秒),默认为-1,表示不限制。如果设为50000,表示占用50000/10000=50%的CPU。

# 限制cpu使用率10%
cgset -r cpu.cfs_period_us=100000 freeze_test
cgset -r cpu.cfs_quota_us=10000 freeze_test

# 使用设置的CPU cgroup来运行python
cgexec -g cpu:freeze_test python3
# 在解析器中执行:
while True: a=1+1

通过top命令可以看到,python3进程使用10%的CPU

限制CPU个数,使用cpuset.cpus,这里不展开介绍

IO cgroup

# 创建IO cgroup
cgcreate -g blkio:/freeze_test

# 查看刚刚创建的cgroup
ls /sys/fs/cgroup/blkio/freeze_test

# 查找块设备号
lsblk

# 限制读写为1000bps
cgset -r blkio.throttle.read_bps_device="253:0 1000000" freeze_test
cgset -r blkio.throttle.write_bps_device="253:0 1000000" freeze_test

# 查看当前cgroup设置
cgget -g blkio:freeze_test

# 测试
cgexec -g blkio:freeze_test dd if=/dev/vda of=/dev/null
Tags: Linux