博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IO调度算法研究1
阅读量:6111 次
发布时间:2019-06-21

本文共 1903 字,大约阅读时间需要 6 分钟。

  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

转载于:https://www.cnblogs.com/VincentXu/p/3610963.html

你可能感兴趣的文章
往每一个数组前面追加一个前缀
查看>>
Golang游戏服务器与skynet的个人直观比较
查看>>
Bootstrap关于表单(二):水平表单
查看>>
CAP定理
查看>>
Permutations
查看>>
Android布局技巧——合并布局
查看>>
基于python的性能测试工具–locust
查看>>
Windows服务监视,如果停止则启动
查看>>
maven 一个phase绑定多个插件
查看>>
Node.js程序在node-windows中不能运行
查看>>
java编程 I/O编程--字节流
查看>>
UVA 11995 - I Can Guess the Data Structure!
查看>>
2016-12-04
查看>>
Mysql优化
查看>>
Lua的各种资源1
查看>>
了解大数据的特点、来源与数据呈现方式
查看>>
第十二周作业
查看>>
Server Develop (四) select实现非阻塞sever
查看>>
【转载】程序员新年要做的10个决定
查看>>
自学之jQuery
查看>>