ionice 手册指出:
请注意,在内核 2.6.26 之前,未请求 io 优先级的进程正式使用“none”作为调度类,但 io 调度程序会将此类进程视为尽力而为类。尽力而为类别中的优先级将从进程的 cpu 良好级别动态派生:io_priority = (cpu_nice + 20) / 5。
对于 2.6.26 之后带有 CFQ io 调度程序的内核,未请求 io 优先级的进程会继承 CPU 调度类。 io 优先级源自进程的 cpu 好级别(与内核 2.6.26 之前相同)。
我是 2.6.26 发布的,但这仍然留下一些悬而未决的问题(我假设是 CFQ):
预定类的继承映射是什么? TS SCHED_OTHER = 尽力而为(io 类 2)吗?
使用 ionice -p 命令获取值时,返回
none: prio 0
。然而,ionice man 中提到的公式表明,相同的进程(CPU 性能为零)将是best-effort: prio 4
因为 (0 + 20) / 5 = 4。
所以我现在的假设是none: prio 0
= best-effort: prio 4
,但我希望有人可以引用一些内核源代码来证明这是绝对正确的。
答案1
1)来自文档计划设计-CFS.txt:
CFS 代表“完全公平调度程序”,是由 Ingo Molnar 实现并合并到 Linux 2.6.23 中的新“桌面”进程调度程序。它替代了之前的普通调度程序的 SCHED_OTHER 交互代码。
您似乎将 O(1) 调度程序与 CFQ io 调度程序混淆了。
所以就有了 SCHED_{NORMAL, BATCH, IDLE} 策略。 IDLE 没有任何优先级。并安排空闲、尽力且实时的课程。
2)遗憾的是,您没有显示您输入的命令。例如,将 init 的 io-scheduling 更改为尽力而为类
# ionice -p 1
无:prio 0
# ionice -c2 20 -p 1
# ionice -p 1
尽力而为:prio 4