最可靠方式是使用cgroups v2的io.max控制器精准限制可疑进程磁盘IO带宽,需确认系统启用cgroup2及io控制器,查准设备号(如8:0或259:0),创建限速组并写入wbps/rbps值,迁移PID至该cgroup,最后通过io.stat和dd direct实测验证。

直接用 cgroups v2 的 io 子系统限制可疑进程的磁盘 IO 带宽,是最可靠、内核原生支持的方式。它不依赖用户态工具,能精准控制读写速率,且对直接调用 syscalls(如 dd、rsync、数据库写入)的进程完全生效。
确认系统已启用 cgroups v2 io 控制器
执行以下命令检查基础环境是否就绪:
-
mount | grep cgroup —— 输出中必须包含 type cgroup2,且挂载点为
/sys/fs/cgroup或其子目录 -
cat /proc/cgroups —— 查看
name列是否有 io,且对应enabled值为 1 - 若仍显示 cgroup v1(如 blkio),需在内核启动参数中添加
cgroup_no_v1=all并重启,否则 io.max 等接口不可用
创建限速组并设置设备级带宽规则
以限制进程对 /dev/sda 的写入为 5MB/s 为例(单位是字节/秒):
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- 先查设备号:ls -l /dev/sda → 得到类似
brw-rw---- 1 root disk 8, 0 Apr 15 16:00 /dev/sda,主次号即 8:0 - 新建限速组:sudo mkdir -p /sys/fs/cgroup/suspicious-io
- 设限(只限写入,读不限):echo "8:0 wbps=5242880" | sudo tee /sys/fs/cgroup/suspicious-io/io.max
- 如需同时限读写:echo "8:0 rbps=5242880 wbps=5242880" | sudo tee /sys/fs/cgroup/suspicious-io/io.max
注意:NVMe 设备(如 /dev/nvme0n1)主次号常为 259:0,务必用 ls -l 确认,填错则规则无效。
将可疑进程实时纳入限速组
无需重启进程,支持运行中迁移:
- 获取目标 PID:pgrep -f "suspicious_keyword" 或查
ps aux | grep ... - 写入 cgroup.procs:echo $PID | sudo tee /sys/fs/cgroup/suspicious-io/cgroup.procs
- 验证是否成功:cat /sys/fs/cgroup/suspicious-io/cgroup.procs 应输出该 PID
- 多线程进程会整体受限;若失败,常见原因是该进程已在其他 io cgroup 中,需先移出原组
验证限速是否实际生效
不要仅凭配置文件判断,要观察实时统计和实测吞吐:
- 查看实时 IO 统计:cat /sys/fs/cgroup/suspicious-io/io.stat,重点关注
rwbps=和wbps=字段是否接近设定值 - 用
dd实测(建议 direct I/O 避免缓存干扰):dd if=/dev/zero of=/mnt/test bs=1M count=500 oflag=direct - 若无效果,重点排查三项:进程是否真在该 cgroup、设备号是否准确、内核是否启用 CONFIG_BLK_CGROUP_IO_CTRL(可通过
zcat /proc/config.gz | grep BLK_CGROUP或查/boot/config-$(uname -r))

















