我读到,据说可以通过写入/ sys / block / [disk] / queue / scheduler来更改正在运行的内核上特定设备的I / O调度程序。例如,我可以在系统上看到:
anon@anon:~$ cat /sys/block/sda/queue/scheduler noop anticipatory deadline [cfq]
默认值是完全公平的队列调度程序。我想知道的是,在自定义内核中包括所有四个调度程序是否有用。除非内核足够聪明地为正确的硬件选择正确的调度程序,特别是基于闪存的驱动器的“ noop”调度程序,以及针对传统驱动器的其他调度程序,否则编译一个以上的调度程序似乎没有多大意义。硬盘。
是这样吗
如中所述/usr/src/linux/Documentation/block/switching- sched.txt,可以在运行时更改任何特定块设备上的I / O调度程序。可能会有一些延迟,因为在使用新的调度程序之前,所有先前的调度程序的请求都已清除,但是即使设备使用过多,也可以毫无问题地对其进行更改。
/usr/src/linux/Documentation/block/switching- sched.txt
# cat /sys/block/hda/queue/scheduler noop deadline [cfq] # echo anticipatory > /sys/block/hda/queue/scheduler # cat /sys/block/hda/queue/scheduler noop [deadline] cfq
理想情况下,将有一个调度程序来满足所有需求。它似乎还不存在。内核通常没有足够的知识来为您的工作负载选择最佳的调度程序:
noop
deadline
cfq
默认设置anticipatory很长时间,它进行了很多调整,但在 2.6.33 (2010年初)中已被删除。 cfq成为前一段时间的默认设置,因为它的性能合理且公平是多用户系统(甚至单用户桌面)的一个好目标。在某些情况下- 数据库经常被用作示例,因为它们往往已经具有自己独特的调度和访问模式,并且通常是 最 重要的服务(所以谁在乎公平性?)- anticipatory具有可调性的悠久历史以在这些工作负载上获得最佳性能,并deadline很快将所有请求传递到基础设备。
anticipatory