linux中可通过cgroups v1的blkio.throttle.write_bps_device限制进程对特定物理磁盘的写入带宽,需基于设备主次号(如8:16),以字节/秒为单位写入限速值,并将进程pid加入对应cgroup。

在 Linux 中,可以通过 cgroups v1 的 blkio.weight 或更精确的 blkio.throttle.write_bps_device(即 Write_Bps)来限制进程对**特定物理磁盘设备**的写入带宽。注意:该功能依赖内核开启 CONFIG_BLK_CGROUP=y(主流发行版默认启用),且仅适用于 cgroups v1 的 blkio 子系统(cgroups v2 使用 io.max 替代,语法不同)。
确认设备主次号并启用 blkio cgroup
Linux 中磁盘限速需基于设备的主/次号(major:minor),例如 /dev/sdb 可能对应 8:16:
- 查设备号:
ls -l /dev/sdb→ 看输出中类似brw-rw---- 1 root disk 8, 16 ...的数字 - 确认 blkio 控制器已挂载:
mount | grep blkio;若未挂载,执行:sudo mkdir -p /sys/fs/cgroup/blkio/backupsudo mount -t cgroup -o blkio none /sys/fs/cgroup/blkio
设置 Write_Bps 限速值
向目标 cgroup 的 blkio.throttle.write_bps_device 文件写入 "MAJOR:MINOR BYTES_PER_SECOND":
- 例如限制
/dev/sdb(8:16)写入不超过 50 MB/s:echo "8:16 52428800" | sudo tee /sys/fs/cgroup/blkio/backup/blkio.throttle.write_bps_device - 单位是字节/秒(非 KB/MB),50 MB/s = 50 × 1024 × 1024 = 52428800
- 可同时设多个设备,每行一条,或重复写入追加
将备份脚本进程加入该 cgroup
运行脚本前,将其 PID 写入 cgroup 的 cgroup.procs(推荐方式)或 tasks:
- 启动脚本并获取 PID:
./backup.sh & echo $! - 将 PID 加入 cgroup:
echo $PID | sudo tee /sys/fs/cgroup/blkio/backup/cgroup.procs - 更稳妥做法:在脚本开头自动加入自身(需 root 或 cap_sys_admin):
echo $$ | tee /sys/fs/cgroup/blkio/backup/cgroup.procs >/dev/null 2>&1
验证与注意事项
限速是否生效可通过 iostat -x 1 观察对应设备的 wkB/s 是否稳定在设定值附近;也可用 cat /sys/fs/cgroup/blkio/backup/blkio.throttle.io_service_bytes 查看已统计的写入量。
- 该限制只作用于直接写入该块设备的 I/O,不控制缓存写回(page cache)、tmpfs 或网络存储
- 若脚本调用
rsync、dd、tar等工具,只要它们最终落盘到目标设备,就会被限制 - cgroups v2 用户请改用
io.max(格式如"8:16 wbps=52428800"),路径为/sys/fs/cgroup/backup/io.max











