在GNU1Linux上,队列调度决定了到块设备的请求实际上发送到底层设备的顺序。默认情况下使用cfq (Completely Fair Queueing,完全公平排队)策略。随意使用的笔记本和台式机使用这个调度策略没有问题,并且有助于防止I/O饥饿,但是用于服务器则是有问题的。在MySQL的工作负载类型下,cfq 会导致很差的响应时间,因为会在队列中延迟些不必要的请求。
可以用下面的命令来查看系统所有支持的以及当前在用的调度策略:
$ cat /sys/block/sda/queue/scheduler
noop deadline [cfq]
这里sda需要替换成想查看的磁盘的盘符。在我们的例子中,方括号表示正在使用的调度策略。cfq之外的两个选项都适合服务器级的硬件,并且在大多数情况下,它们工作同样出色。noop调度适合那些自己在背后实现了调度算法的设备,如硬件RAID控制器和SAN。deadLine则对RAID控制器和直接使用的磁盘都工作良好。我们的基准测试显示,这两者之间的差异非常小。重要的是别用cfq,这可能会导致严重的性能问题。
不过这个建议也需要有所保留的,因为磁盘调度策略实际上在不同的内核有很多不一样的地方,千万不能望文生义。