打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
几种IO调度算法 | 别样的天空

几种IO调度算法

2011年3月20日 发表评论 阅读评论

Linux 2.6,有四种关于IO的调度算法,下面综合小结一下:

1) NOOP

NOOP算法的全写为No Operation。该算法实现了最最简单的FIFO队列,所有IO请求大致按照先来后到的顺序进行操作

。之所以说大致,原因是NOOPFIFO的基础上还做了相邻IO请求的合并,并不是完完全全按照先进先出的规则满

IO请求。NOOP假定I/O请求由驱动程序或者设备做了优化或者重排了顺序(就像一个智能控制器完成的工作那样)

在有些SAN环境下,这个选择可能是最好选择。Noop 对于 IO 不那么操心,对所有的 IO请求都用 FIFO 队列形式处

理,默认认为 IO 不会存在性能问题。这也使得 CPU 也不用那么操心。当然,对于复杂一点的应用类型,使用这个

调度器,用户自己就会非常操心。

2) Deadline scheduler

DEADLINECFQ的基础上,解决了IO请求饿死的极端情况。除了CFQ本身具有的IO排序队列之外,DEADLINE额外分别为

IO和写IO提供了FIFO队列。读FIFO队列的最大等待时间为500ms,写FIFO队列的最大等待时间为5sFIFO队列内的

IO请求优先级要比CFQ队列中的高,,而读FIFO队列的优先级又比写FIFO队列的优先级高。优先级可以表示如下:

FIFO(Read) > FIFO(Write) > CFQ

deadline 算法保证对于既定的 IO 请求以最小的延迟时间,从这一点理解,对于 DSS 应用应该会是很适合的。

3) Anticipatory scheduler

CFQDEADLINE考虑的焦点在于满足零散IO请求上。对于连续的IO请求,比如顺序读,并没有做优化。为了满足随机

IO和顺序IO混合的场景,Linux还支持ANTICIPATORY调度算法。ANTICIPATORY的在DEADLINE的基础上,为每个读IO

设置了6ms 的等待时间窗口。如果在这6msOS收到了相邻位置的读IO请求,就可以立即满足

Anticipatory scheduleras) 曾经一度是 Linux 2.6 Kernel IO scheduler Anticipatory 的中文含义是

预料的, 预想的”, 这个词的确揭示了这个算法的特点,简单的说,有个 IO 发生的时候,如果又有进程请求 IO

作,则将产生一个默认的 6 毫秒猜测时间,猜测下一个进程请求 IO 是要干什么的。这对于随即读取会造成比较大

的延时,对数据库应用很糟糕,而对于 Web Server 等则会表现的不错。这个算法也可以简单理解为面向低速磁盘的

,因为那个猜测实际上的目的是为了减少磁头移动时间。

4CFQ

CFQ算法的全写为Completely Fair Queuing。该算法的特点是按照IO请求的地址进行排序,而不是按照先来后到的顺

序来进行响应。

在传统的SAS盘上,磁盘寻道花去了绝大多数的IO响应时间。CFQ的出发点是对IO地址进行排序,以尽量少的磁盘旋转

次数来满足尽可能多的IO请求。在CFQ算法下,SAS盘的吞吐量大大提高了。但是相比于NOOP的缺点是,先来的IO请求

并不一定能被满足,可能会出现饿死的情况。

Completely Fair Queuing cfq, 完全公平队列) 2.6.18 取代了 Anticipatory scheduler 成为 Linux Kernel

默认的 IO scheduler cfq 对每个进程维护一个 IO 队列,各个进程发来的 IO 请求会被 cfq 以轮循方式处理。

也就是对每一个 IO 请求都是公平的。这使得 cfq 很适合离散读的应用(eg: OLTP DB)。我所知道的企业级 Linux

发行版中,SUSE Linux 好像是最先默认用 cfq .

查看和修改IO调度器的算法非常简单。假设我们要对sda进行操作,如下所示:

cat /sys/block/sda/queue/scheduler

echo “cfq” > /sys/block/sda/queue/scheduler

总结:

1 CFQDEADLINE考虑的焦点在于满足零散IO请求上。对于连续的IO请求,比如顺序读,并没有做优化。为了满足随

IO和顺序IO混合的场景,Linux还支持ANTICIPATORY调度算法。ANTICIPATORY的在DEADLINE的基础上,为每个读IO

都设置了6ms的等待时间窗口。如果在这6msOS收到了相邻位置的读IO请求,就可以立即满足。

IO调度器算法的选择,既取决于硬件特征,也取决于应用场景。

在传统的SAS盘上,CFQDEADLINEANTICIPATORY都是不错的选择;对于专属的数据库服务器,DEADLINE的吞吐量和

响应时间都表现良好。然而在新兴的固态硬盘比如SSDFusion IO上,最简单的NOOP反而可能是最好的算法,因为其

他三个算法的优化是基于缩短寻道时间的,而固态硬盘没有所谓的寻道时间且IO响应时间非常短。

2 对于数据库应用, Anticipatory Scheduler 的表现是最差的。Deadline DSS 环境表现比 cfq 更好一点,而

cfq 综合来看表现更好一些。这也难怪 RHEL 4 默认的 IO 调度器设置为 cfq. RHEL 4 RHEL 3,整体 IO

进还是不小的。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Linux I/O 调度方法
如何提高Linux下块设备IO的整体性能?
微博MySQL优化之路 - 肖鹏
更改 Linux I/O 调度器来改善服务器性能
cpu调节和io调度
内核调教指南(CPU调速器以及I/O调速器模式说明)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服