两个接口的分工
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、延迟与队列,而不只看是否触发限速。