Linux下可通过cgroup v2的io.max控制器精确限制进程块设备IO带宽,需进程独占cgroup、明确目标设备(如/dev/sda),并确认内核启用blkio支持(5.0+默认开启);验证用mount | grep cgroup和/proc/cgroups;配置时设主次设备号(如8:0)及wbps值;可用systemd-run启动或迁移PID至cgroup;验证用io.stat和dd/fio测试。

在 Linux 下可以通过 Cgroup(特别是 cgroup v2)对特定进程的块设备 IO 带宽进行精确限制,核心是使用 io.max 控制器。关键在于:进程必须运行在独立的 cgroup 中,且目标块设备需明确(如 /dev/sda),内核需启用 blkio 支持(5.0+ 默认启用 cgroup v2 io controller)。
确认系统支持并启用 cgroup v2
现代发行版(如 Ubuntu 22.04+、CentOS 8+、Fedora)默认使用 cgroup v2。验证方式:
- 执行
mount | grep cgroup,输出中应含type cgroup2 - 检查
/proc/cgroups,若name列有io且enabled为 1,则控制器就绪 - 若仍为 cgroup v1,需在内核启动参数中添加
cgroup_no_v1=all并禁用旧控制器
创建并配置 IO 限速的 cgroup
以限制进程对 /dev/sda 的写入带宽为 10MB/s 为例(单位为 bytes/sec):
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 挂载 io 控制器(若未自动挂载):
sudo mkdir -p /sys/fs/cgroup/io-limited && sudo mount -t cgroup2 none /sys/fs/cgroup/io-limited - 新建子组:
sudo mkdir /sys/fs/cgroup/io-limited/restrict-write - 设置限速规则(格式:
<major>:<minor> rbps=0 wbps=10485760):echo "8:0 wbps=10485760" | sudo tee /sys/fs/cgroup/io-limited/restrict-write/io.max
其中8:0是/dev/sda的主次设备号(可用ls -l /dev/sda查看)
将目标进程加入该 cgroup
有两种常用方式:
-
启动时指定:用
systemd-run直接运行新进程systemd-run --scope -p "IOWeight=100" --property="IOReadBandwidthMax=/dev/sda:0" --property="IOWriteBandwidthMax=/dev/sda:10M" your-command -
运行中迁移:将已存在 PID 加入 cgroup
echo $PID | sudo tee /sys/fs/cgroup/io-limited/restrict-write/cgroup.procs
注意:仅当进程未在其他 io cgroup 中才可成功迁移;多线程进程会整体受限
验证与调试
限速生效后可通过以下方式确认:
- 实时查看当前 IO 统计:
cat /sys/fs/cgroup/io-limited/restrict-write/io.stat,关注rwbps和riops字段 - 用
dd或fio测试实际吞吐:dd if=/dev/zero of=/mnt/testfile bs=1M count=2000 oflag=direct - 若无效果,检查:进程是否真在目标 cgroup(
cat /proc/$PID/cgroup)、设备号是否正确、是否启用了CONFIG_BLK_CGROUP_IO_CTRL内核选项

















