linux中限制服务磁盘io速率最直接方式是配置systemd服务单元的ioreadbandwidthmax和iowritebandwidthmax属性,底层依赖cgroup v2 io.max控制器,需确认系统启用cgroup v2及io控制器,支持内核≥5.0,配置后通过systemctl daemon-reload生效,并可用io.stat验证限速效果。

Linux 中用 systemd 限制服务磁盘 IO 速率,最直接有效的方式是通过 systemd 的 I/O 带宽控制属性,在服务单元(.service)中配置 IOReadBandwidthMax 和 IOWriteBandwidthMax。这套机制底层基于 cgroup v2 的 io.max 控制器,内核原生支持,无需额外工具,且对进程级 IO 有硬性限速效果。
确认系统支持 cgroup v2 IO 控制器
systemd 的 IO 带宽限制依赖于 cgroup v2 的 io controller。请先验证:
- 运行
mount | grep cgroup,输出中应包含type cgroup2 - 检查
/proc/cgroups,确认io行的enabled列为1 - 内核版本建议 ≥ 5.0(主流发行版如 Ubuntu 22.04+/CentOS 8+ 默认满足)
在 service 文件中配置 IO 限速
以限制 mysqld 服务对 /dev/sda 的写入速率为 10MB/s 为例(读不限):
- 编辑服务文件:
sudo systemctl edit mysqld.service - 添加以下内容:
[Service] IOWriteBandwidthMax=/dev/sda:10M IOReadBandwidthMax=/dev/sda:0
注意:/dev/sda 必须是真实块设备路径;单位支持 K、M、G;设为 0 表示禁止该方向 IO。
保存后执行:sudo systemctl daemon-reload && sudo systemctl restart mysqld
临时运行时限制(测试或一次性任务)
不修改服务文件,也可用 systemd-run 启动带限速的新实例:
sudo systemd-run --scope -p "IOWriteBandwidthMax=/dev/sda:5M" rsync -av /src/ /dst/- 该命令会创建一个临时 scope 单元,进程退出后自动清理
- 适合快速验证限速效果,或对非 systemd 管理的命令加约束
验证是否生效
限速启用后,可通过以下方式确认:
- 查服务所属 cgroup 路径:
systemctl show mysqld --property=ControlGroup - 查看实时 IO 统计:
cat /sys/fs/cgroup$(systemctl show -p ControlGroup mysqld | cut -d= -f2)/io.stat,关注rwbps字段 - 用
dd或fio对比限速前后吞吐变化(例如dd if=/dev/zero of=/mnt/test bs=1M count=1000 oflag=direct)











