使用CGroup来限制程序

官方文档

https://www.kernel.org/doc/Documentation/cgroup-v1/cgroups.txt

https://www.kernel.org/doc/Documentation/cgroup-v2.txt

安装

yum install libcgroup libcgroup-tools  # Centos
apt-get install cgroup-bin   # Ubuntu

默认安装路径/sys/fs/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 命令列出包含指定子系统的层级

查看子系统

lssubsys -am

限制CPU使用

机器配置为64c 512G

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

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

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

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

# 限制cpu使用率50%(机器配置为64核,CPU使用率50%)
cgset -r cpu.cfs_period_us=100000 starrocks_cn
cgset -r cpu.cfs_quota_us=3200000 starrocks_cn

# 使用设置的CPU cgroup来运行压力测试工具
cgexec -g cpu:starrocks_cn stress-ng -c 64
注:限制CPU使用率参数计算方式为
cfs_quota_us/cfs_period_us
即
3200000/100000=3200%
64核CPU 总使用率为100% * 64 = 6400%
使用一半即3200%

压力测试之前

压力测试执行后

限制内存使用

创建内存cgroup
cgcreate -g memory:/starrocks_cn

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

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

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

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

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

IO使用限制

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

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

# 查找块设备号
lsblk

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

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

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


使用CGroup来限制程序
https://www.hechunyu.com/archives/1704446970622
作者
chunyu
发布于
2024年01月05日
许可协议