ionice 调整 IO 优先级
ionice 属于 util-linux,用来设置进程的磁盘 IO 调度类与优先级,让备份、压缩这类重 IO 任务在磁盘忙于业务时自动让路。它和 nice 分工不同:nice 调的是 CPU 时间片权重,ionice 管的是块设备请求的排队与优先级,两者配合才能同时压低 CPU 与 IO 抢占。
基本信息
| 适用平台 | Linux(util-linux);效果依赖 IO 调度器 |
|---|---|
| 语法 | ionice [-c 类别] [-n 级别] [-p PID] [-P PGID] [-u UID] [命令] |
| 调度类 | 1 realtime、2 best-effort(缺省)、3 idle |
| 级别范围 | best-effort 下 0 最高、7 最低 |
典型使用场景
- 夜间备份与业务共盘时,让备份在空闲级运行
- 大量日志压缩任务压低 IO 优先级,避免业务请求延迟抖动
- 给某个失控进程降级救火(来不及重启时)
- 验证磁盘上是否是 IO 抢占导致的服务变慢
- 配合 nice 一起限制批处理作业的资源占用
常用示例
常用示例
ionice -c3 tar czf backup.tgz /data # 空闲级打包:只在磁盘不忙时干活
ionice -c2 -n7 -p 1234 # 运行中的进程降到 IO 最低档
ionice -c2 -n0 -p 1234 # 需要提速时提高该进程 IO 优先级
ionice -p 1234 # 查看某个进程当前的 IO 调度设置
nice -n10 ionice -c3 rsync -a /data /backup # CPU 与 IO 双重降级
ionice -c3 dd if=/dev/zero of=/tmp/big bs=1M count=200 # 造压力并观察影响调度类读法
| 类别 | 说明 | 典型用法 |
|---|---|---|
| -c1 realtime | 最高优先级,进程几乎抢占式访问磁盘 | 基本不用于生产,容易把整机拖慢 |
| -c2 best-effort | 缺省级别,用 -n0 到 -n7 调高低 | -n7 降低备份影响,-n0 给关键进程让路 |
| -c3 idle | 只在设备空闲时获得 IO 时间片 | 备份、索引、压缩等后台任务首选 |
| 继承行为 | 子进程默认继承父进程的调度设置 | 包装脚本时注意整条进程链都会受影响 |
效果取决于 IO 调度器与内核版本:老内核的 CFQ 对 ionice 支持最好,blk-mq 与 NVMe 场景下 systemd 的 IOWeight、cgroup v2 的 io.max 更可靠。
ionice 只影响进程自己发起的 IO,内核写回、日志刷盘等后台行为不受它控制,因此不能指望它完全消除磁盘争抢。
验证与搭配
- 用 ionice -p PID 回读设置,确认确实生效而不是静默失败
- 配合 iostat 的 await 与 util 观察业务盘延迟是否真的下降
- 与 nice 组合使用:一个压 CPU 权重,一个压 IO 排队顺序
- 批量任务包装成脚本时,把 ionice 写在命令最前面,让子进程一并继承
- systemd 托管的服务不用包装命令,直接用 IOWeight 与 CPUWeight 在单元里声明
ionice 表达的是同一设备上不同进程之间的相对顺序,不限制进程的绝对 IO 带宽;要卡上限得用 cgroup v2 的 io.max 或 systemd 的 IOReadBandwidthMax 一类设置。