查看进程当前i/o优先级直接执行ionice -p pid,如ionice -p 1234可显示best-effort: prio 4或idle;若返回none,说明当前i/o调度器(如deadline)不支持ionice,其设置无效。

查看进程当前 I/O 优先级用 ionice -p PID
直接查,不绕弯。比如想看 PID 为 1234 的进程当前用了什么 I/O 调度类和优先级,就执行:
ionice -p 1234
输出类似 best-effort: prio 4 或 idle,没有数字的就是 -c3(空闲类不带优先级参数)。注意:如果返回 none,说明内核没识别到有效调度类,常见于用了 deadline 或 noop I/O 调度器的系统——这时 ionice 本身就不生效,查了也没用。
常见错误现象:
-
ionice -p 1234报错Permission denied:该进程是 root 启动、你非 root 用户,且它属于realtime类(-c1),普通用户无权读取; - 输出为空或只显示
none:不是命令错了,而是当前内核 I/O 调度器不支持 ionice(如deadline); - 查不到进程:PID 已退出,或你输错了数字。
ionice -c2 -n6 和 ionice -c3 的实际区别在哪
不是“数值越小越快”,而是“调度时机完全不同”:
-
ionice -c2 -n6属于 best-effort 类,优先级 6(最低档),但它仍会和其他-c2进程争磁盘队列,只是轮到它的机会少、每次服务的请求数也少; -
ionice -c3是 idle 类,根本不在常规调度队列里排队——只有当所有其他进程都声明“此刻无 I/O 请求”时,它才被允许发一个请求; - 效果差异在 HDD 上明显,在 SSD 上几乎不可测(因延迟低、并行强),但
-c3依然能减少请求堆积对 queue depth 的压力。
典型使用场景:
- 后台日志归档、
rsync同步大目录 → 用-c3,彻底不抢资源; - 数据库导出(需稳定吞吐但不干扰线上查询)→ 用
-c2 -n5或-c2 -n6,留点余量给关键服务; - 别用
-c1:即使你是 root,实时类极易导致 SSH 响应卡顿、syslog写不进磁盘,除非你在嵌入式设备上跑硬实时任务。
为什么 ionice -c2 -n0 没让程序变快
因为 ionice 控制的是“被调度的顺序”,不是“能跑多快”。设成最高优先级(-n0)只意味着:当多个 -c2 进程同时要磁盘时,它排第一;但它不能突破硬件瓶颈、也不能绕过文件系统锁或 page cache 缺页等待。
容易踩的坑:
- 误以为
-n0= “独占磁盘”:错。同一类下仍是轮询(round-robin),只是每轮给它多发几次请求; - 在 CFQ 调度器已弃用的系统(如较新 kernel +
mq-deadline)上强行设-c2:参数被忽略,ionice -p仍显示best-effort,但实际无效; - 没配合
nice:CPU 忙不过来时,I/O 再高优先级也发不出请求。真正降干扰得一起用:nice -n19 ionice -c3 tar -cf backup.tar /data。
普通用户能用哪些 ionice 参数
权限边界很清晰:
- 可自由使用
-c2(best-effort)+-n0到-n7; - 可自由使用
-c3(idle),无需 root; -
-c1(realtime)和-c0(none)必须 root,普通用户执行会报Operation not permitted; - 用
-p修改别人启动的进程(哪怕同用户)可能失败,取决于进程是否设置了PR_SET_NO_NEW_PRIVS或被 seccomp 限制。
最后提醒一句:ionice 设置的是“请求入队策略”,不是“带宽限额”。想真正限速(比如 rsync 不得超过 10MB/s),得用 cgroups v2 的 io.max,或者上层工具如 trickle。ionice 只管“排队位置”,不管“跑多快”。











