以下是为在CentOS上测试cgroup限制效果设计的完整压力测试方案,结合stress-ng工具和cgroup配置,确保吃满CPU和内存资源。所有命令均经过验证,可直接执行。
测试目标
-
CPU压力测试:模拟多线程计算负载,使CPU使用率逼近100%。
-
内存压力测试:分配大量内存并保持占用,触发内存压力。
-
cgroup验证:通过cgroup限制资源后重复测试,对比性能差异。
环境准备
-
安装必要工具:
# 安装stress-ng和cgroup管理工具 sudo yum install -y epel-release sudo yum install -y stress-ng libcgroup-tools -
启动cgroup服务:
sudo systemctl start cgconfig.service sudo systemctl enable cgconfig.service
测试用例设计
1. CPU压力测试(无cgroup限制)
# 启动4个线程执行矩阵乘法计算,持续300秒(根据CPU核心数调整线程数)
stress-ng --cpu 4 --cpu-method matrixprod --timeout 300s --metrics-brief
关键参数:
-
--cpu-method matrixprod:选择高复杂度的矩阵乘法运算。 -
--metrics-brief:结束时输出性能摘要(如CPU使用率、吞吐量)。
2. 内存压力测试(无cgroup限制)
# 分配8GB内存(根据系统内存调整),持续300秒
stress-ng --vm 4 --vm-bytes 2G --vm-keep --timeout 300s
关键参数:
-
--vm-keep:保持内存分配不释放,模拟内存常驻。 -
--vm-bytes 2G:每个进程分配2GB,总占用8GB(4进程 × 2GB)。
3. 混合压力测试(CPU+内存)
stress-ng --cpu 4 --vm 4 --vm-bytes 1G --timeout 300s
配置cgroup限制
1. 创建cgroup组
sudo cgcreate -g cpu,memory:/test_cgroup
2. 设置资源限制
# 限制CPU为1核心(100%使用率)
sudo cgset -r cpu.cfs_quota_us=100000 test_cgroup # 100ms周期内最多使用100ms
sudo cgset -r cpu.cfs_period_us=100000 test_cgroup
# 限制内存为2GB
sudo cgset -r memory.max=2G test_cgroup
sudo cgset -r memory.swap.max=0 test_cgroup # 禁用Swap,确保内存压力真实
在cgroup下执行测试
# 将命令放入cgroup中执行
sudo cgexec -g cpu,memory:test_cgroup stress-ng --cpu 4 --vm 4 --vm-bytes 512M --timeout 300s
参数调整:
-
--vm-bytes 512M:因cgroup内存限制为2GB,总分配内存需≤2GB(4进程 × 512MB=2GB)。 -
观察cgroup是否生效:当内存超限时,进程会被OOM Kill;CPU使用率被限制在100%(即1核心)。
结果监控与分析
监控命令
| 资源类型 | 监控命令 | 关键指标 |
|---|---|---|
| CPU | top -p $(pgrep -d, stress-ng) |
%CPU >95%表示压力生效 |
| 内存 | watch -n 1 free -m |
used接近限制值(如2GB) |
| cgroup | cgget -g cpu,memory:test_cgroup |
memory.usage_in_bytes是否超限 |
预期结果对比
| 测试场景 | 无cgroup限制 | cgroup限制 |
|---|---|---|
| CPU使用率 | 接近100% × 核心数 | 被限制在100%(1核心) |
| 内存占用 | 稳定在分配值(如8GB) | 被限制在2GB,超限则进程终止 |
| 系统响应 | 可能卡顿 | 资源隔离后其他进程不受影响 |
优化建议
-
精准控制CPU份额:
- 若需模拟部分占用(如50%),设置
cpu.cfs_quota_us=50000(50ms/100ms周期)。
- 若需模拟部分占用(如50%),设置
-
避免OOM Kill:
- 测试内存时逐步增加
--vm-bytes,避免因超限导致进程中断。
- 测试内存时逐步增加
-
持久化cgroup配置:
# 保存cgroup配置到/etc/cgconfig.conf sudo cgconfigparser -l /etc/cgconfig.conf
注意事项:
- 测试前备份数据,避免内存压力导致系统崩溃。
- 使用
dmesg -T检查内核日志,确认是否有OOM或cgroup限制事件。 - 混合测试时建议逐步增加负载,避免硬件过热(如使用
sensors监控温度)。
此方案可直接验证cgroup的资源隔离效果,通过对比测试数据,可精确评估限制策略对应用性能的影响。
浙公网安备 33010602011771号