当前位置: 首页 > news >正文

cgroups测试cpu bug

您遇到的 cgroup CPU 份额控制效果不明显 的问题,核心原因在于对 Linux 完全公平调度器 (CFS) 机制的理解偏差及实践场景的特殊性。以下是详细分析和解决方案:


一、关键认知纠偏

❌ 常见误解:“shares=200 vs 800 → 严格 20%:80% 硬性保障”

真实规则

  • cpu.shares 定义的是 相对优先级权重,而非绝对资源配额。
  • 当单一 cgroup 内有多个进程时,shares 决定它们之间的资源争夺比例;
  • 若整组仅一个进程,该进程可获得所在层级的全部可用 CPU 时间片(不受 shares 数值限制)。

👉 因此您的测试场景中:

  • lesscpu 组的 md5summorecpu 组的 sha1sum 各自独占自己所在层的全额 CPU 资源,二者本质上处于平等竞争地位!

二、实验设计缺陷拆解

环节现存问题影响程度
并发模型单进程/单组 → 无组内竞争⭐⭐⭐⭐⭐
导致 shares 失效
观测工具top 仅反映瞬时采样⭐⭐⭐
无法捕捉长期统计规律
负载特性密码学计算非满负荷⭐⭐
未触发真正的 CPU 争抢
环境干扰未隔离其他系统进程⭐⭐⭐⭐
后台进程稀释效果

三、科学验证方案 & 预期现象

🔧 修正版测试步骤
# 创建两组并设置份额
mkdir -p /sys/fs/cgroup/cpu/group1
echo 200 > /sys/fs/cgroup/cpu/group1/cpu.shares
mkdir -p /sys/fs/cgroup/cpu/group2
echo 800 > /sys/fs/cgroup/cpu/group2/cpu.shares# 同时启动两个高负载进程(强制持续竞争)
cgexec -g cpu:group1 yes > /dev/null &   # PID_A
cgexec -g cpu:group2 yes > /dev/null &   # PID_B
📊 正确观测方式
工具用法预期结果
ps -o comm,pid,psr,ni -C 'yes'实时查看进程亲和性+优先级PID_B 的 ni 值应为 PID_A 的 4 倍
pidstat -u -h <PID_A> <PID_B> 1每秒输出两进程的 CPU 占比长期统计下 B : A ≈ 4:1
cat /proc/<PID>/schedstat查看调度器原始数据policy 字段显示 CFS
📌 关键原理说明
  • 只有当同一层级存在多个活跃进程时,CFS 才会依据 shares 进行动态调谐。
  • yes 命令通过死循环制造持续满负荷,迫使调度器频繁介入分配。
  • pidstat 的统计周期越长(如观察 60 秒),结果越趋近理论比例。

四、为何原始测试无效?

  1. 伪并行假象

    • 您先后执行两条独立命令,实质是串行操作而非真正并发。
    • md5sum /dev/zero 虽看似永续,实则单线程纯计算无阻塞,不会主动释放 CPU。
  2. top 命令局限性

    • 默认 3 秒刷新间隔 + 仅显示当前时刻快照 → 易受进程调度时机影响。
    • 缺乏历史累计数据支撑,难以发现微小差异。
  3. 算法轻量化

    • MD5/SHA1 属于轻量级加密算法,现代 CPU 可在很少时钟周期内完成单次运算。
    • 真实负载远低于 CPU 最大吞吐量,无法暴露调度器干预效果。

五、进阶验证建议

🚀 强化竞争压力测试
# 在每组启动多个同名进程加剧竞争
for i in {1..5}; do cgexec -g cpu:group1 sleep 100 & done
for i in {1..5}; do cgexec -g cpu:group2 sleep 100 & done

👉 此模式下,组内 5 个进程将严格按照 200:800 的比例分享 CPU 时间片。

🛠️ 可视化监控方案
# 安装图形化监控工具
yum install gnuplot htop -y# 持续记录 CPU 使用率
while true; do ps -o %cpu,comm -C 'yes' | grep -v PID | awk '{print strftime("%H:%M:%S") "\t" $1}' >> data.log; sleep 1; 
done# 生成趋势图
gnuplot <<EOF
set title "CPU Allocation Over Time"
set xlabel "Time"
set ylabel "CPU %"
plot "data.log" using 1:2 with lines title "Group1", \"data.log" using 1:3 with lines title "Group2"
EOF

六、结论与最佳实践

场景推荐方案备注
开发调试使用 stress-ng --cpu 2 生成可控负载精准模拟 CPU 压力
生产环境结合 nice/ionice 调整优先级配合 cgroup 实现三级管控
监控取证perf record -ag + perf report获取调度器事件明细

核心原则

CPU shares 只在 组内多进程共存 时生效,其本质是 相对权重而非绝对配额。若要实现严格资源隔离,需改用 quota 或转向更新的 cgroup v2 + controllers 体系。

http://www.lryc.cn/news/604547.html

相关文章:

  • 达芬奇速成班-面板介绍
  • 什么是CHO细胞?
  • 深入剖析 StarRocks 与 Hive 的区别、使用场景及协同方案实践
  • Spring Cloud Gateway静态路由实战:Maven多模块高效配置指南
  • 安全和AI方向的学习路线
  • docker常用命令集(6)
  • Shopify Draggable + Vue 3 完整指南:打造现代化拖拽交互体验
  • Apache Ignite 与 Spring Data 集成
  • 人工智能与安全:智能安防的创新与伦理边界
  • 把Java程序部署到本地Docker
  • 常见CMS
  • NVIDIA Isaac平台推动医疗AI机器人发展研究
  • Hyperchain 的分级权限体系如何应对潜在的安全威胁和攻击?
  • 关于Docker【常见问题解决方案】
  • 【问题未解决-寻求帮助】VS Code 中使用 Conda 环境,运行 Python 后 PowerShell 终端输出内容立即消失
  • 随笔之TDengine基准测试示例
  • 【开源】一款开源、跨平台的.NET WPF 通用权限开发框架 (ABP) ,功能全面、界面美观
  • 基于 Flask 和 MySQL 的期货数据分析系统
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 微博评论IP地图可视化分析实现
  • Vue + Flask 管理系统开发方案
  • 【Flask 基础 ①】 | 路由、参数与模板渲染
  • [Agent开发平台] API网关 | 业务领域 | DTO格式 | 分页令牌
  • FPGA实现CameraLink视频解码转SRIO与DSP交互,FPGA+DSP多核异构图像处理架构,提供2套工程源码和技术支持
  • 分布式搜索和分析引擎Elasticsearch实战指南
  • 图像处理中级篇 [1]—— 彩色照相机的效果与预处理
  • RAG实战指南 Day 28:RAG系统缓存与性能优化
  • 大模型对比评测:Qwen2.5 VS Gemini 2.0谁更能打?
  • 线性代数常见的解题方法
  • Apache Ignite中分布式信号量(Distributed Semaphore)的说明和使用示例
  • GitPython03-项目setup编译