最简单可靠的方式是用 ionice -c 2 -n 7 启动数据迁移任务;因现代内核已移除 CFQ,-c 3 失效,需改用 -c 2(best-effort 类)且 -n 7 设最低 IO 优先级,再配合 cron 低峰期执行并验证生效。

直接用 ionice -c 2 -n 7 启动数据迁移任务,是最简单也最可靠的方式。现代 Linux 内核(5.0+)已移除 CFQ 调度器,-c 3(idle 类)基本失效,别再依赖它“彻底让出 IO”。
确认当前 IO 调度器类型
先看你的磁盘用的是什么调度器:
cat /sys/block/*/queue/scheduler
如果输出中显示 [mq-deadline] 或 [kyber](常见于 SSD/NVMe),说明 ionice -c 3 不起作用,必须改用 -c 2。
用 ionice -c 2 -n 7 启动迁移任务
-c 2 是 best-effort 类,-n 7 表示该类中最低 IO 优先级(0 最高,7 最低):
ionice -c 2 -n 7 rsync -a --delete /src/ /dst/ # 或用 dd 做块级迁移 ionice -c 2 -n 7 dd if=/dev/sda of=/backup.img bs=1M
这样能显著降低对前台服务(如数据库、Web)的 IO 干扰,尤其适合深夜运行。
配合时间调度自动执行
把任务放进 cron,限定在低峰期(例如凌晨 2–4 点):
# 编辑用户 crontab crontab -e # 添加一行(每天凌晨 2:15 执行) 15 2 * * * ionice -c 2 -n 7 rsync -a /data/ /backup/ >> /var/log/backup.log 2>&1
注意:cron 默认不加载用户环境,建议用绝对路径调用命令(如 /usr/bin/ionice),或在脚本开头显式设置 PATH。
验证是否生效
任务运行后,查 PID 并确认 IO 优先级:
pgrep -f "rsync.*backup" ionice -p <PID>
应返回类似 best-effort: prio 7。若显示 prio 4,说明没设成功,检查是否漏了 -n 7 或权限问题。
不复杂但容易忽略


















