首页/系统/Linux 内核与性能调优速查/cgroup v2 io.max / io.weight

cgroup v2 io.max / io.weight

io.max 按设备限速(rbps/wbps/riops/wiops),io.weight 分配 IO 权重;设备用主:次号(如 8:0)标识。

两个接口的分工

cgroup v2 用 io.max 对指定块设备做硬性限速,可分别限制读/写带宽(rbps/wbps)与读/写 IOPS(riops/wiops);io.weight 则在多个组竞争时按权重分配 IO 带宽。设备以「主:次」号标识,因为同一个 cgroup 对不同设备可以有不同策略。设置是否生效要与 io.stat 中该设备的实际读写量对照,才能确认。

基本信息

接口路径/sys/fs/cgroup/<组>/io.max 与 io.weight(io.stat 为只读统计)
设备标识主:次号,如 8:0,可用 lsblk -o NAME,MAJ:MIN 查询
限速字段rbps、wbps、riops、wiops
权重范围1-10000,仅在同设备竞争时生效
systemd 对应IOReadBandwidthMax=、IOWriteBandwidthMax=、IOWeight=
cgroup 版本v2 接口;v1 为 blkio.* 系列,规则不能直接照搬

典型使用场景

  • 限制备份、同步、日志压缩等后台任务的磁盘带宽,保护在线业务
  • 按权重为多个服务分配 IO,让数据库优先于批处理
  • 多租户隔离:防止单个容器把共享设备打满
  • 排查「限速配了但没效果」:核对设备号与后端存储支持情况
  • 评估限速对业务延迟与吞吐的实际代价,作为容量规划输入

查看与设置

查看与设置
cat /sys/fs/cgroup/myapp.slice/io.max  # 当前各设备的限速规则
cat /sys/fs/cgroup/myapp.slice/io.stat  # 各设备实际读写量,用于验证
echo "8:0 rbps=104857600 wbps=52428800" | sudo tee /sys/fs/cgroup/myapp.slice/io.max  # 限制读写带宽
lsblk -o NAME,MAJ:MIN,SIZE  # 确认设备主次号,写错会静默失效
systemctl set-property myapp.service IOReadBandwidthMax="/dev/sda 100M"  # systemd 侧设置
cat /sys/fs/cgroup/myapp.slice/io.weight  # 查看权重模式下的取值

接口对照

接口类型取值与说明
io.max硬限速rbps/wbps/riops/wiops 直接给上限
io.weight相对权重1-10000,仅在竞争时按比例分配
io.stat只读统计各设备的读写字节数与 IOPS
systemd 属性封装IOReadBandwidthMax、IOWeight 等
设备号写错不会报错,规则只是静默不生效。写入后应立刻读回 io.max 并用 io.stat 观察实际速率,确认规则落在预期的设备上。
限速是双刃剑:上限设得过低会连带限制该组自身的正常业务,表现为「压测时还好、线上莫名变慢」。变更前后都要测量业务侧的 IOPS、延迟与队列,而不只看是否触发限速。

易错点

  • 设备号写错导致规则静默失效:不报错也不生效,必须读回核实
  • 只设权重不设上限:在无竞争的时段没有任何约束,压力上来后仍可能占满设备
  • 上限设得低于业务正常需求:把保护手段变成了性能故障
  • 在网络存储或虚拟设备上使用:后端不支持时规则无效,需要先确认存储栈能力
  • 把 v1 的 blkio 规则搬到 v2:接口与字段名不同,需要按 v2 语法重写

数据来源与参考

  • Linux 内核 Documentation/admin-guide/cgroup-v2.rst
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌