如/usr/src/linux/Documentation/block/switching-sched.txt
中所述,任何特定块设备上的I/O调度程序都可以在运行时更改.可能会有一些延迟,因为在使用新的调度程序之前,之前调度程序的请求都会被刷新,但即使在设备被大量使用的情况下,也可以毫无问题地对其进行更改.
# 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
理想情况下,将有一个单一的调度器来满足所有需求.它似乎还不存在.内核通常没有足够的知识来为您的工作负载 Select 最佳的调度程序:
noop
通常是内存支持的块设备(例如ramdisks)和其他非旋转介质(flash)的最佳 Select ,在这些设备中,try 重新安排I/O是一种资源浪费
deadline
是一个轻量级的调度器,它试图对延迟进行严格限制
cfq
试图保持系统范围内I/O带宽的公平性
在很长一段时间内,默认值为anticipatory
,并进行了大量调整,但在2.6.33年(2010年初)被删除.cfq
在不久前成为默认版本,因为它的性能是合理的,公平性是多用户系统(甚至是单用户台式机)的一个好目标.在某些情况下——数据库经常被用作示例,因为它们往往已经有了自己独特的调度和访问模式,并且通常是重要的服务(那么谁在乎公平呢?——anticipatory
在这些工作负载上长期以来一直是可调的,以获得最佳性能,而deadline
则非常迅速地将所有请求传递到底层设备.