ionice 设置 IO 调度类

ionice 调整进程 IO 类别:-c1 realtime、-c2 best-effort(-n 0-7 优先级)、-c3 idle(仅空闲时使用磁盘)。

什么是 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 在单元层面固定策略,比事后对进程执行命令更持久,也不怕进程重启后策略丢失。
备份、扫描这类周期性任务,策略最好在作业调度系统里统一下发:即使换了机器或进程被重启,优先级设置也不会凭空消失。

易错点

  • none 与部分调度器下类别区分度有限,先确认设备调度器(mq-deadline、bfq、none)再评估效果
  • realtime 类抢占所有 IO,误用可能使其他服务 IO 饿死,属于排障时才考虑的手段
  • 把 ionice 当成万能降噪:它管不了网络存储与自身是唯一 IO 来源的场景
  • 只给父进程设置而子进程被重新分配默认类别,批量任务建议在启动脚本或 systemd 单元里统一下发

数据来源与参考

  • util-linux 文档 ionice(1)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌