最可靠方式是使用 cgroups v2 的 io.max 控制器,它在内核层硬限磁盘带宽,不受缓存和进程行为影响;ionice 和 trickle 仅调优优先级或限网络,对磁盘 IO 几乎无效。

直接用 cgroup v2 的 io.max 控制器,是限制可疑进程 IO 带宽最可靠的方式。它在内核层生效,不依赖进程行为(比如是否走 socket),也不受缓存干扰,能真正压住读写速率。ionice 或 trickle 之类工具只能调优先级或限网络,对磁盘 IO 几乎无效。
确认系统支持 cgroup v2 io 控制器
先确保你的系统已启用 cgroup v2 和 io 子系统:
- 运行 mount | grep cgroup,输出中应包含 type cgroup2
- 运行 cat /proc/cgroups,检查 io 行的 enabled 列是否为 1
- 主流通用发行版(Ubuntu 22.04+、CentOS 8+、Fedora 33+)默认启用,内核 5.0 起已内置支持
创建限速 cgroup 并设置规则
以限制进程对 /dev/sda 的写入带宽为 5MB/s 为例(单位:字节/秒):
- 新建控制组:sudo mkdir -p /sys/fs/cgroup/suspicious-io
- 查设备号:ls -l /dev/sda,通常显示 brw-rw---- 1 root disk 8, 0 → 主次号是 8:0
- 写入限速规则:echo "8:0 wbps=5242880" | sudo tee /sys/fs/cgroup/suspicious-io/io.max
- 如需同时限读:echo "8:0 rbps=5242880 wbps=5242880" | sudo tee /sys/fs/cgroup/suspicious-io/io.max
将可疑进程加入该 cgroup
两种常用方式,选其一即可:
- 运行中迁移:获取进程 PID 后执行 echo $PID | sudo tee /sys/fs/cgroup/suspicious-io/cgroup.procs(注意:进程不能已在其他 io cgroup 中)
- 启动时绑定:用 systemd-run 直接启动,例如 systemd-run --scope -p IOWriteBandwidthMax=/dev/sda:5M -- your-command
验证与观察效果
限速是否真起作用,不能只看命令是否执行成功:
- 实时查看统计:cat /sys/fs/cgroup/suspicious-io/io.stat,重点关注 rwbps(实际读写带宽)字段
- 手动测试吞吐:dd if=/dev/zero of=/mnt/test bs=1M count=500 oflag=direct,观察实际写入速度是否被压到 5MB/s 左右
- 若无变化,重点检查三项:PID 是否写对、8:0 是否对应目标磁盘、进程是否真的在该 cgroup 下(可查 cat /proc/$PID/cgroup)


















