CentOS 7.9 上用 cgroup v1 的 blkio 给备份进程限速,写的是 100MB/s,实际 dd 测出来四百 MB/s,备份一跑数据库的 IO 就被抢光。

把日志和配置对完,能解释这个现象的基本就这几处。限速写在了 blkio.throttle.read_bps_device,实际瓶颈在写方向;设备号写成了 8:0,云盘实际是 252:0 这类虚拟设备号;cgroup v2 用的是 io.max,v1 的参数在 v2 环境下完全不生效;进程跑在 systemd 的 slice 里,没被放进限速的 cgroup。

先确认 cgroup 版本和设备号

stat -c '%t:%T' /dev/vdb && mount | grep cgroup

然后按真实设备号写限速值

echo '252:16 104857600' > /sys/fs/cgroup/blkio/backup/blkio.throttle.write_bps_device

接着把进程放进这个 cgroup 再测

echo $$ > /sys/fs/cgroup/blkio/backup/tasks && dd if=/dev/zero of=/data/t.bin bs=1M count=500 oflag=direct

等前面都确认过,再用 io.max 的写法在 v2 上验证

echo '252:16 wbps=104857600' > /sys/fs/cgroup/backup/io.max

这类改动我都写进变更记录,过两周再出问题时能对上号。

我习惯把每一步的执行时间和结果记在一边,后面复盘省事。

改完先别撤,确认这几项。dd 的写入速度被压在 100MB/s 附近,数据库的 IO 等待明显下降,备份窗口内业务延迟保持平稳。

补一句。限速要按读写方向分别设,设备号必须用 stat 查出来;cgroup v1 和 v2 的接口完全不同,先确认版本再写参数。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189