Linux中限制进程磁盘带宽最可靠的方式是使用cgroup v2的io.max控制器实现内核级写入带宽(wbps)硬限,IOPS无法精确硬限但可依平均请求大小换算为带宽逼近目标;需确认cgroup2挂载、io控制器启用、设备号准确,再创建cgroup并写入如“8:0 wbps=31457280”规则,最后迁移PID或用systemd-run启动,并通过io.stat、iostat和dd direct验证。

Linux 中限制进程磁盘带宽最可靠的方式是使用 cgroup v2 的 io.max 控制器,通过写入带宽(wbps)实现内核级硬限。IOPS 无法精确硬限,但可按平均请求大小换算为带宽来逼近目标。
确认系统支持 cgroup v2 和 io 控制器
执行以下命令检查是否就绪:
-
mount | grep cgroup2 —— 应看到
cgroup2 on /sys/fs/cgroup type cgroup2 -
cat /sys/fs/cgroup/cgroup.controllers | grep io —— 输出含
io且状态为 enabled -
ls -l /dev/sda —— 获取目标设备主次号(如
brw-rw---- 1 root disk 8, 0→ 设备号8:0)
创建限速组并设置写入带宽上限
以限制进程对 /dev/sda 的写入速率为 30 MB/s 为例(30 × 1024 × 1024 = 31,457,280 字节/秒):
- sudo mkdir -p /sys/fs/cgroup/db-write
- echo "8:0 wbps=31457280" | sudo tee /sys/fs/cgroup/db-write/io.max
若需同时限制读取,可追加 rbps=值,例如:"8:0 rbps=10485760 wbps=31457280"。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
将进程加入限速组
两种常用方式:
- 运行中迁移:已知 PID(如 1234),执行 echo 1234 | sudo tee /sys/fs/cgroup/db-write/cgroup.procs
-
启动时指定:用 systemd-run 直接运行,例如
systemd-run --scope --property="IOWriteBandwidthMax=/dev/sda:30M" your-command
注意:进程不能已在其他 io cgroup 中;多线程进程整体受限。
验证限速是否生效
推荐组合验证:
- 实时查看统计:cat /sys/fs/cgroup/db-write/io.stat | grep wbps
- 观察设备级吞吐:iostat -x 1 /dev/sda,关注
wkB/s是否稳定在 ~30720(即 30 MB/s) - 简单压测:dd if=/dev/zero of=/mnt/test bs=1M count=1000 oflag=direct,对比限速前后速率
若无变化,请检查进程是否真在目标 cgroup(cat /proc/1234/cgroup | grep io)以及设备号是否匹配。

















