linux不支持对进程做精确write_iops硬限制,必须用wbps带宽限速替代:先确认cgroup v2及io控制器已启用(mount | grep cgroup2且cat /proc/cgroups中io行enabled为1),再用主次设备号(如8:0)按格式“8:0 wbps=52428800”写入io.max,最后通过dd direct和iostat实测验证。

Linux不支持精确IOPS硬限制,必须用wbps代替
直接设“10000 IOPS”在内核里根本不会生效——cgroup v2的io.max中虽有max_iops_per_second字段,但它只是调度提示,内核不统计也不拦截;cgroup v1的blkio.throttle.write_iops_device在现代调度器(如kyber、mq-deadline)下多数静默失效。真正能落地的只有带宽限速(wbps),再结合业务请求大小反推。
用io.max设wbps前,先确认cgroup v2和io控制器就绪
漏掉这步,后面所有配置都白写:
- 运行
mount | grep cgroup2,输出里必须含type cgroup2且挂载点是/sys/fs/cgroup - 运行
cat /proc/cgroups,检查io行的enabled列是否为1 - 若只看到
blkio(v1)而没io(v2),需在内核启动参数加cgroup_no_v1=all并重启
查准设备号+写对io.max格式,否则限速不生效
常见错误是把/dev/sda直接写进配置,但io.max只认主次设备号(如8:0):
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
- 执行
ls -l /dev/sda,看输出类似brw-rw---- 1 root disk 8, 0→ 主次号就是8:0 - nvme盘用
ls -l /dev/nvme0n1,通常对应259:0 - 写
io.max时格式必须严格:8:0 wbps=52428800(50 MB/s),不能多空格、不能换行、不能写单位 - 多个设备可分行写,如
8:0 wbps=52428800和259:0 wbps=104857600各占一行
迁移PID后必须用dd direct实测,别信io.stat单一看数
io.stat里的wbps=值是内核统计的平均速率,有延迟且可能被缓存干扰:
- 验证前先清页缓存:
sudo sh -c "echo 3 > /proc/sys/vm/drop_caches" - 用direct I/O跑测试:
dd if=/dev/zero of=/mnt/test bs=4K count=10000 oflag=direct conv=fdatasync - 同时开两个终端:一个跑
cat /sys/fs/cgroup/your-group/io.stat | grep wbps,另一个跑iostat -x 1 /dev/sda看wkB/s是否稳定在目标值±5% - 若
iostat远超设定值,大概率是PID没真正落到该cgroup——查cat /proc/$PID/cgroup | grep io
实际IOPS波动受IO合并、队列深度、文件系统缓存影响极大,固定IOPS限速本身意义有限;重点盯住带宽上限是否被守住,这才是cgroup能保证的底线。










