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. 新辰:4G时代怎样利用手机进行移动APP营销?

    未来的时代是4G时代,新辰手机用户的搜索量不在电脑端之下.那么,我们要怎样用手机进行营销呢?手机站点的竞价文章,要怎样去写比較好?手机站点要做专题吗?手机站点的优化思路在哪里?手机的系统不同,在不同的 ...

  2. Java并发编程:Thread类的使用介绍

    在学习Thread类之前,先介绍与线程相关知识:线程的几种状态.上下文切换,然后接着介绍Thread类中的方法的具体使用. 以下是本文的目录大纲: 一.线程的状态 二.上下文切换 三.Thread类中 ...

  3. const和readonly你真的懂吗?

    第二遍文章我打算把const和readonly的区别拿出来讲下,因为写代码这么久我都还没搞清楚这两者的区别,实在有点惭愧,所以这一次我打算搞清楚它. 定义 来看看MSDN的解释: readonly:r ...

  4. JSONObject put accumulate element 方法区别-------java中

    1.public Object put (Object key, Object value) 将value映射到key下.如果此JSONObject对象之前存在一个value在这个key下,当前的va ...

  5. 彻底解决 LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

    最近我的VS2010不知道怎么回事,平时用的好好的,近期竟然出现了所谓的 LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 头痛万分,查了各种资料一 ...

  6. Django Web开发【1】Django简介

    前言 看完<Django Book>之后, 总想找个实例来实战开发下,无奈国内Django的书籍相当少,只能从英文书籍中吸取养料,偶然之后得到Learning Website Develo ...

  7. java实现cmd的copy功能

    import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...

  8. Composer Yii2 不设置全局变量 归档安装 Win7

    1.下载Composer_installer.phar https://getcomposer.org/composer.phar 重命名为  composer_installer.phar 将文件放 ...

  9. latex 批量注释

    在LaTex中的注释有3种方法: 1. 右键单击选中要注释的文本,选择 Insert Comment ,WinEdt 就会自动给选定的行添加 % ,完成段落文本的注释: 右键单击选中已经注释的文本,选 ...

  10. Android Memory/Resource Leak总结

    Android的内存/资源泄露,不容易发现,又会引发app甚至是system的一系列问题. 在这里我根据以往碰到的相关问题,总结出了一些检测和修改方法. *有可能造成memory leak的代码是Fr ...