IO调度算法经常是文件系统优化的一个重要内容。


noop(不干涉算法)

noop算法,假设硬盘IO能力是足够的,有一定的IO合并优化,大致按照先来后到的顺序分配IO,适用于SSD,传统硬盘因为存在寻址,在noop算法下,性能会非常差。


cfq (完全公平算法)

cfq算法,给每个进程一个IO队列,然后轮询各个队列,达到公平的效果。适用于传统硬盘,也是长久以来的默认算法。为减少寻址,该算法尝试给IO排序,极端情况可导致IO饥饿,即如果一个程序有大量顺序读写,那么它就会插队,导致其他程序IO饥饿。CentOS 6默认使用cfq算法。


deadline (倒计时算法)

deadline算法,维护读写两个队列,每个队列都有各自的超时时间,确保每个IO在一定时间内可以得到满足,有效防止IO饥饿,适用于传统硬盘,ubuntu以及CentOS 7 都默认使用deadline算法。


查看和修改倒计时参数,详见下面的命令:

cat /sys/block/sda/queue/iosched/read_expire
cat /sys/block/sda/queue/iosched/write_expire
echo 500 >/sys/block/sda/queue/iosched/read_expire
echo 1000 > /sys/block/sda/queue/iosched/write_expire


anticipatory(预估分配算法)

anticipatory算法,为了减少IO寻址,在每个IO结束时停留一段时间,如果下一个IO正好发生在硬盘的临近位置,那么可以立即满足。适用于传统硬盘,在大量顺序读写时比较合适。


除了noop,其他三种都为磁盘寻址做了优化,适用于机械硬盘,在不同场合都有自己的用武之地,一般来说,deadline更通用一点。SSD硬盘由于没有机械指针,用noop倒是一个更好的选择。


查看硬盘sda的IO调度器

cat /sys/block/sda/queue/scheduler

更换IO调度器,比如deadline

echo deadline > /sys/block/sda/queue/scheduler