linux kernel 2.6之后提供了四种IO调度算法,每种调度算法都有其不同的特点和应用场景,系统使用者可以通过系统提供的接口,选择使用哪种IO调度算法,以及调整IO调度算法的参数,以达到最优的系统性能。本文总结四种IO调度算法的特点、应用场景、系统提供的控制接口。

四种调度算法介绍:

1、CFQ(Complete Fair Queuing)

  该算法为每一个进程分配一个时间窗口,在该时间窗口内,允许进程发射IO请求。通过时间窗口在不同进程间的移动,保证了对于所有进程而言都有公平的发射IO请求的权利。

  适用于系统中存在多任务I/O请求的情况,通过在多进程中轮换,保证了系统I/O请求整体的低延迟。但是,对于只有少数进程存在大量密集的I/O请求的情况,则会出现明显的I/O性能下降。

  2个主要优化参数:

1.1、slice_idle

如果一个进程在自己的时间窗口里,经过slice_idle时间都没有发射I/O请求,则调度选择下一个程序。通过该机制,可以有效利用I/O请求的局部性原理,提高系统的I/O吞吐量。

  1.2、quantum

该参数控制在一个时间窗口内可以发射的I/O请求的最大数目。

2、NOOP

  NOOP调度器并不完成任何复杂的工作,只是将上层发来的I/O请求直接发送至下层,实现了一个FIFO的I/O请求队列。

  应用环境主要有以下两种:一是物理设备包含自己的I/O调度程序,比如SCSI的TCQ;二是寻道时间可以忽略不计的设备,比如SSD等。、

3、DEADLINE

  主要针对I/O请求的延时而设计,每个I/O请求都被附加一个最后执行期限。该算法维护两类队列,一是按照扇区排序的读写请求队列;二是按照过期时间排序的读写请求队列。如果当前没有I/O请求过期,则会按照扇区顺序执行I/O请求;如果发现过期的I/O请求,则会处理按照过期时间排序的队列,直到所有过期请求都被发射为止。在处理请求时,该算法会优先考虑读请求。

  当系统中存在的I/O请求进程比较少时,与CFQ算法相比,DEADLINE算法可以提供较高的I/O吞吐率,特别是对于使用了自带I/O请求队列的设备,如SCSI的TCQ的时候。另外可以通过调整参数,尽可能的降低读IO的延迟,对于读IO延迟要求较低的应用,可以考虑使用这种IO调度器。

  3个主要优化参数:

  3.1、writes_starved

该参数控制当读写队列均不为空时,发射多少个读请求后,允许发射写请求。

  3.2、read_expire

参数控制读请求的过期时间,单位毫秒。

  3.3、write_expire

参数控制写请求的过期时间,单位毫秒。

 4、Anticipatory

  DeadLine解决了饥饿问题,但是降低了全局吞吐量,当系统大量存在顺序请求时,可能导致请求无法被很好地排序,引发频繁寻道。

Anticipatory是基于预测的I/O算法,大体上它和DeadLine很类似,也维护了三个请求队列。区别在于,当它处理完一个I/O请求以后并不会直接返回处理下一个请求,而是会等待片刻,默认为6ms。如果这时候有新来的针对当前扇区相邻扇区的请求,那么会直接处理它,当等待时间结束后,调度器才返回处理下一个队列请求。Anticipatory适用于大文件读IO优先的应用。

为块I/O设备设置I/O调度算法的方法

1、挂在sysfs文件系统

mount -t sysfs sysfs /sys

 将sysfs文件系统挂在到/sys目录下。

2、修改块设备的IO调度算法以及调整相关参数

[root@12008459A sys]# cat /sys/block/sda/queue/scheduler
noop [anticipatory] deadline cfq
[root@12008459A sys]# echo cfq >/sys/block/sda/queue/scheduler
[root@12008459A sys]# cat /sys/block/sda/queue/scheduler
noop anticipatory deadline [cfq]

 调度算法相关的参数调整 接口文件在 /sys/block/sda/queue/iosched目录下。另外贴一张引用的linux IO子系统结构图:

1、http://blog.yufeng.info/archives/751

IO调度算法研究1的更多相关文章

  1. 阿里云主机SSD实例磁盘测试及IO调度算法调整

    测试背景及环境说明 阿里云ECS 主机配置: 4C8G root@zabbix-master:~# grep -i "model name" /proc/cpuinfo model ...

  2. IO调度算法的理解(转载)

    IO调度器(IO Scheduler)是操作系统用来决定块设备上IO操作提交顺序的方法.存在的目的有两个,一是提高IO吞吐量,二是降低IO响应时间.然而IO吞吐量和IO响应时间往往是矛盾的,为了尽量平 ...

  3. MySQL--linux IO调度算法

    ==================================================================== Linux IO调度算法Linux下目前有4中IO调度算法: ...

  4. Linux IO调度算法

    Linux IO调度算法  操作系统的调度 CPU调度    CPU scheduler IO调度       IO scheduler   IO调度器的总体目标是希望让磁头能够总是往一个方向移动,移 ...

  5. linux块设备的IO调度算法和回写机制

    ************************************************************************************** 參考: <Linux ...

  6. MySQL优化--IO调度算法优化

    之前已经在微信公众号分享了数据库优化的方法,链接为https://mp.weixin.qq.com/s/6Atzk9UKPJRxxAs0nsKBXg . 其中操作系统部分介绍了IO调度算法的优化,本文 ...

  7. 基于3D NAND层差异的固态盘请求调度算法研究立项 报告

    Abstract SSD(Solid State Drive),因其超高的读写性能,以及价格的走低趋势逐渐占据市场,为人们带来更好的用户体验,也为企业级的高并行业务需要提供了一定支持,近几年来SSD的 ...

  8. 【转载】小结一下linux 2.6内核的四种IO调度算法

    在LINUX 2.6中,有四种关于IO的调度算法,下面综合小结一下: 1) NOOP NOOP算法的全写为No Operation.该算法实现了最最简单的FIFO队列,所有IO请求大致按照先来后到的顺 ...

  9. IO调度算法

    简介: 当向设备写入数据块或是从设备读出数据块时,请求都被安置在一个队列中等待完成. 每个块设备都有它自己的队列. I/O调度程序负责维护这些队列的顺序,以更有效地利用介质.I/O调度程序将无序的I/ ...

随机推荐

  1. 什么时候css会见less

    在一定程度上,css不能被视为一个节目.虽然和其他语言,它有自己的规范.编码,但它的笨拙实在让我失望. 不喜欢css是由于不管怎么优化代码.项目大到一定程序后.都会看上去一团乱.并且有时候一个bug的 ...

  2. objective-c 关键字和概念

    @ 看到这个关键字,我们就应该想到,这是Object-C对C语言的扩展,例如@interface XXX. @interface 声明类 @implementation 实现类 @protocol 声 ...

  3. EF 4.0 更新数据时候的一个错误及其处理

    错误如图: 修改下方法后可以进行更新了.但是中间多了一步查询 /// <summary> /// 更新一个产品分类 /// </summary> /// <param n ...

  4. 在WHERE子句中引用取别名的列

    版权说明:作者:张颖希(PocketZ's Blog)出处:http://www.cnblogs.com/PocketZ本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页 ...

  5. wcf综合运用之:大文件异步断点续传

    在WCF下作大文件的上传,首先想到使用的就是Stream,这也是微软推荐的使用方式.处理流程是:首先把文件加载到内存中,加载完毕后传递数据.这种处理方式对小文件,值得推荐,比如几K,几十k的图片文件, ...

  6. css3图片3D翻转效果

    点击图片看翻转效果 html结构 <div class="flip"> <div class="front"> <img src= ...

  7. MySQL 关闭子表的外键约束检察

    准备: 定义一个教师表.一个学生表:在学生表中引用教师表ID create table teachers(teacherID int not null auto_increment primary k ...

  8. Linux同平台Oracle数据库整体物理迁移

    Linux同平台数据库整体物理迁移需求:A机器不再使用,要将A机器的Oracle迁移到B机器.之前写过类似需求的文章: http://www.linuxidc.com/Linux/2015-05/11 ...

  9. mongodb初体验

    最近关注大数据,自然会关注到nosql数据库,其中当然是mongodb. nosql数据库大多是k,v数据库,这也不是新鲜的名词了,berkerly DB已经存在很多年了,现在属于oracle. 具体 ...

  10. opencv 简单、常用的图像处理函数(2)

    opencv的项目以来配置和环境变量的配置都很简单,对于我这个没有c++基础的来说,复杂的是opencv的api和一些大部分来自国外没有翻译的资料,以及一些常见的编码问题. 资料 opencv 中文a ...