ionice 命令详解
更新时间:2026-09-17。「一个命令一个文档」系列,属于性能观测与调试族。它管的是块设备 I/O 的调度优先级,和管 CPU 的 nice/renice 是两回事。
一、查看与设置
bash
ionice -p 1234 # 查看进程当前 I/O 调度类别/优先级
ionice -c 3 ./backup.sh # 以 idle 类别运行(空闲才用磁盘)
ionice -c 2 -n 0 -p 1234 # best-effort 最高优先级(0~7,越小越高)
ionice -c 1 -n 4 ./critical # realtime 类别(需要 CAP_SYS_ADMIN)-c 类别 | 名称 | 含义 |
|---|---|---|
| 0 | none | 不单独指定,沿用进程默认 |
| 1 | realtime | 最高,保证磁盘访问权,需 root,用错会饿死别人 |
| 2 | best-effort | 默认普通类别,-n 0~7 分级(默认从 CPU nice 推导) |
| 3 | idle | 仅在磁盘空闲时 I/O,备份/索引等后台任务首选 |
-n 只对 best-effort/realtime 有效,0 最高 7 最低。
二、最实用的场景
bash
# 夜间大备份、updatedb、日志压缩不抢占在线业务磁盘
ionice -c 3 tar czf /backup/data.tgz /data
ionice -c 3 rsync -a /data/ /backup/idle 类别的任务在有别的 I/O 时会主动让路,是"后台重 I/O 不影响线上"的经典手段(前提是调度器支持,见下)。
三、为什么"设置了没效果"——必读
ionice 的优先级依赖 I/O 调度器实现:
- 历史上只有 CFQ 调度器完整支持 ionice 的类别/优先级语义。
- 现代发行版默认 mq-deadline、none(none/no-op)、BFQ、Kyber:
- BFQ 支持 cgroup 与类 idle 权重,对 ionice 有一定支持;
- mq-deadline / none 基本不响应 ionice 的优先级——你设置成功(不报错)但块层不据此排序,表现为"没效果"。
- 查看调度器:bash
cat /sys/block/sda/queue/scheduler # [mq-deadline] 括号内为当前 - 现代更可靠的 I/O 隔离手段是 cgroup v2 的 io 控制器(
io.weight、io.max限速),与调度器无关,见 cgroup(cgcreate/cgset)。
所以:单机临时让后台任务让路可试
ionice -c 3(CFQ/BFQ 有效);容器/云主机、blk-mq 调度器下要可靠隔离磁盘,用 cgroup io 权重/限速,而不是依赖 ionice。
四、与 nice 的关系
- nice/renice 调 CPU 调度权重;ionice 调块 I/O 调度类别,互不替代。
- 一个既吃 CPU 又刷盘的备份通常两个都降:bash
nice -n 19 ionice -c 3 ./heavy.sh - best-effort 的
-n默认由 CPU nice 折算(nice 高 → I/O 级别也低),所以只 renice 在某些调度器下也会间接影响 I/O。
相关命令
CPU 优先级用 nice/renice,磁盘瓶颈用
iostat -x(见 iostat)/iotop,可靠 I/O 隔离用 cgroup io 控制器。
总结
ionice -c 设的是块 I/O 调度类别:realtime(1,root)/best-effort(2,默认,-n 0~7)/idle(3,空闲才用盘,适合备份);最常用 ionice -c 3 后台任务 让重 I/O 不抢线上。但 ionice 的优先级只有 CFQ/BFQ 等调度器真正实现,现代默认的 mq-deadline/none 下设了也常常无效,容器化环境应改用 cgroup v2 io 权重/限速,并注意它与管 CPU 的 nice 是两条独立优先级。