什么是 ionice
ionice 用来给进程设定 IO 调度类别与优先级,降低后台任务对在线业务的干扰。类别有三档:-c1 realtime 抢占式最高优先级、-c2 best-effort 带 0-7 优先级(数值越小越优先)、-c3 idle 仅在设备空闲时才分配 IO。它与 CPU 侧的 nice 是两套机制,只调 nice 不会改变 IO 竞争结果。
基本信息
| 类别 | -c0 none / -c1 realtime / -c2 best-effort / -c3 idle |
|---|---|
| 优先级 | best-effort 下的 -n 0-7,默认 4 |
| 查看 | ionice -p <pid> |
| 设置 | ionice -c2 -n7 -p <pid> 或启动时前置 |
| 权限 | realtime 类别与提高他人进程优先级需要 root |
| 生效前提 | 磁盘调度器需支持优先级(如 bfq、mq-deadline) |
典型使用场景
- 备份与归档任务:降到 idle 或最低 best-effort,避免抢占在线 IO
- 大目录扫描与全盘 find:扫描期间不拖慢业务读写
- 日志压缩与轮转:周期性重活放到低优先级执行
- 批量数据导入:控制竞争,让在线请求优先完成
- 排查 IO 竞争:确认某个进程的类别是否被误设为 realtime
查看与设置
查看与设置
ionice -p 12345 # 查看某进程当前类别
ionice -c2 -n7 -p 12345 # 降到最低 best-effort
sudo ionice -c3 -p 12345 # 降为 idle,仅空闲时用盘
sudo ionice -c3 nice -n 19 du -xsh /data # 低优先级前台执行
ionice -c2 -n7 bash backup.sh # 整个脚本及其子进程降级
ionice -c1 -p 12345 # 提到 realtime(谨慎)
ps -eo pid,ni,cls,comm --sort=-cls | head # 顺便看调度类分布类别对照
| 类别 | 行为 | 使用建议 |
|---|---|---|
| none | 使用进程默认(通常 best-effort) | 不显式指定时即此状态 |
| realtime | 绝对优先,可能饿死其他 IO | 仅极端延迟敏感场景,慎用 |
| best-effort | 按 0-7 优先级竞争 | 在线业务用高优先级,离线用 7 |
| idle | 设备空闲才分配 | 备份、清理、巡检类任务首选 |
ionice 只影响块设备层的排队顺序,对 NFS 等网络文件系统的效果有限,网络侧的争用要靠带宽限制或存储侧 QoS 解决。
realtime 类别会抢占所有其他进程的 IO,误用可能让数据库与关键服务出现长尾等待,生产环境不建议直接使用。
systemd 服务可以用 IOSchedulingClass=idle 与 IOSchedulingPriority=7 在单元层面固定策略,比事后对进程执行命令更持久,也不怕进程重启后策略丢失。
备份、扫描这类周期性任务,策略最好在作业调度系统里统一下发:即使换了机器或进程被重启,优先级设置也不会凭空消失。