I/O调度算法在各个进程竞争磁盘I/O的时候担当了裁判的角色。要求请求的次序和时机做最优化的处理,以求得尽可能最好的整体I/O性能。

一、I/O调度程序的总结

  1. 当向设备读写数据时,请求被安置在一个队列中等待完成
  2. 每个块设备都有自己的队列
  3. I/O调度程序负责维护这些队列的顺序,将无序的I/O操作变为有序的I/O操作

二、I/O调度的4种算法

1.CFQ(完全公平排队I/O调度程序)

最新的内核版本和发行版中,都选择CFQ做为默认的I/O调度器,对于通用的服务器是最好的选择。

CFQ对于多媒体应用(video,audio)和桌面系统是最好的选择。

CFQ赋予I/O请求一个优先级,而I/O优先级请求独立于进程优先级,高优先级的进程的读写不能自动地继承高的I/O优先级

对于很多IO压力较大的场景就并不是很适应,尤其是IO压力集中在某些进程上的场景。因为这种场景我们需要更多的满足某个或者某几个进程的IO响应速度,而不是让所有的进程公平的使用IO,比如数据库应用

CFQ试图均匀地分布对I/O带宽的访问,避免进程被饿死并实现较低的延迟,是deadline和as调度器的折中。

工作原理:

CFQ为每个进程/线程,单独创建一个队列来管理该进程所产生的请求,也就是说每个进程一个队列,每个队列按照上述规则进行merge和sort。

各队列之间的调度使用时间片来调度,以此来保证每个进程都能被很好的分配到I/O带宽,I/O调度器每次执行一个进程的4次请求。可以调queued和quantum来优化。

2.NOOP(电梯式调度程序)

在Linux 2.4或更早的版本的调度程序,那时只有这一种I/O调度算法,I/O请求被分配到队列,调度由硬件进行,只有当CPU时钟频率比较有限时进行。

Noop对所有的I/O请求都用FIFO队列形式处理,默认认为I/O不会存在性能问题。

CPU像电梯算法一样对I/O请求进行组织,当有一个新的请求到来时,它将请求合并到最近的请求之后,以此来保证请求同一介质。

NOOP倾向饿死读而利于写,NOOP对于闪存设备,RAM,嵌入式系统是最好的选择。

电梯算法饿死读请求的解释:

因为写请求比读请求更容易,写请求通过文件系统cache,不需要等一次写完成,就可以开始下一次写操作,写请求通过合并,堆积到I/O队列中。

读请求需要等到它前面所有的读操作完成,才能进行下一次读操作,在读操作之间有几毫秒时间,而写请求在这之间就到来,饿死了后面的读请求。

3.Deadline(截止时间调度程序)

Deadline确保了在一个截止时间内服务请求,这个截止时间是可调整的,而默认读期限短于写期限,这样就防止了写操作因为不能被读取而饿死的现象。

Deadline对数据库环境(ORACLE、MySQL等)是最好的选择。

Deadline实现了四个队列,其中两个分别处理正常read和write,按扇区号排序,进行正常IO的合并处理以提高吞吐量。

因为IO请求可能会集中在某些磁盘位置,这样会导致新来的请求一直被合并,于是可能会有其他磁盘位置的IO请求被饿死。

于是实现了另外两个处理超时read和write的队列,按请求创建时间排序,如果有超时的请求出现,就放进这两个队列,调度算法保证超时(达到最终期限时间)的队列中的请求会优先被处理,防止请求被饿死。

由于Deadline的特点,无法区分进程,也就不能实现针对进程的IO资源控制。

4.AS(预料I/O调度程序)

本质上与Deadline一样,但在最后一次读操作后,要等待6ms才能继续进行对其它I/O请求进行调度。

可以从应用程序中预订一个新的读请求,改进读操作的执行,但以一些写操作为代价。

它会在每个6ms中插入新的I/O操作,而会将一些小写入流合并成一个大写入流,用写入延时换取最大的写入吞吐量。

AS适合于写入较多的环境,比如文件服务器,AS对数据库环境表现很差。

5.总结

1.cfq是一种比较通用的调度算法,是一种以进程为出发点考虑的调度算法,保证尽量公平。

2.deadline是一种以提高机械硬盘吞吐量为思考出发点的调度算法,只有当有IO请求达到最终期限的时候才进行调度,非常适合业务比较单一并且IO压力比较重的业务,比如数据库。

3.noop在固态硬盘这种场景下,使用noop是最好的,deadline次之,而cfq由于复杂度的原因,效率最低。

三、I/O调度方法的查看与设置

# 查看当前系统的I/O调度方法
cat /sys/block/sda/queue/schedulernoop anticipatory deadline [cfq]# 临时更改I/O调度方法
# 更改到noop
echo noop > /sys/block/sda/queue/scheduler# 永久更改I/O调度方法
# 修改内核引导参数,加入elevator=调度程序名
vim /boot/grub/menu.lstkernel /boot/vmlinuz-2.6.18-8.el5 ro root=LABEL=/ elevator=deadline rhgb quiet# 重启后查看调度方法
cat /sys/block/sda/queue/schedulernoop anticipatory [deadline] cfq

优先级调度算法实现_「kernel」 - 磁盘IO调度算法相关推荐

  1. dev layoutview 怎么显示大小_「转」磁盘满了,为啥du却显示还有很大空间?

    今天有个实习生问了我一个诡异的问题,"线下一台磁盘大小32G的开发机(虚拟机)打不出日志",把追查过程和大家分享一下. 画外音:贵司开发机磁盘容量多大? 先du一下,查看磁盘空间: ...

  2. d盘不能扩展卷_「干货」磁盘分区能压缩还能扩展,这个教程让你秒会

    不少小黑粉刚拿到手的电脑只有C盘一个分区,如何给磁盘分区,大家可能都有一款压箱底的磁盘分区助手要推荐. 不过,相比大部分磁盘分区助手,Windows 10系统的分区设置方法最易学实用,还可以最大限度保 ...

  3. 更改as的默认gradle地址_面试官:谈谈这4种磁盘IO调度算法--CFQ、NOOP、Deadline、AS...

    概述 今天主要分享下磁盘IO调度算法,虽然对于我们平时只需要设置deadline就行了,不过了解下它的4种算法也还是不错的. I/O 调度算法 I/O 调度算法在各个进程竞争磁盘I/O的时候担当了裁判 ...

  4. tomcat 不支持put 高版本_「MG6_DCT280」湿式七档双离合版本-性价比并不高

    上汽名爵_MG6定义为「掀背式运动轿车」,设计感很有些英伦风格,性能也确实可圈可点.然而这台车只有MT版本值得选择,即使在新款升级"DCT280"湿式七档双离合变速箱后也不例外.因 ...

  5. 用typescript完成倒计时_「干货」将数十万行CoffeeScript代码迁移到TypeScript

    作者 | David Goldstein 译者 | 王强 策划 | 小智 转发链接:https://mp.weixin.qq.com/s/TK7kWXX4hR3e-jtpVMuBnw 序言 2017 ...

  6. python决策树可视化_「决策树」| Part3—Python实现之可视化

    文章首发于微信公众号:AlgorithmDeveloper,专注机器学习与Python,编程与算法,还有生活. 1.前言 「决策树」| Part2-Python实现之构建决策树中我们已经可以基于给定数 ...

  7. jsp循环输出表格_「翻译」JS可视化学习之七:Promise、事件循环和异步2

    喜欢排队吧,它能保护你的时间和精力 - 排队纪律维护员Event Loop Promise和事件循环概览图 请注意上面这张图,Promise和事件循环的那些事,将在这个图上缓缓展开. 微任务和(宏)任 ...

  8. 消除左递归实验代码_「leetcode」108. 构造二叉搜索树【递归】【迭代】详解!

    构造二叉搜索树,一不小心就平衡了 ❞ 108.将有序数组转换为二叉搜索树 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树 ...

  9. idea findbugs使用_「测试」 - 静态测试 amp; FindBugs

    在阅读Kafka和RocketMQ对比的文章中,看到一些有关质量的话题,通过IntelliJ的FindBugs插件进行静态代码扫描,相较于sonar更加轻巧,更适合「单元测试」阶段进行. <Ap ...

最新文章

  1. 【插件】jQuery.iviewer----图片浏览(滚动放大缩小问题解决)
  2. 联邦学习的一些使用库
  3. VSCode 更新后打不开之解决办法
  4. ubuntu docker慢_基于docker搭建MulVAL攻击图
  5. Windows下搭建IOS开发环境(一)
  6. 基于jedis的Redis工具类
  7. Adobe Photoshop/Adobe Dreamwear/您此时无法使用此产品。您必须问题解决办法FLEXnet Licensing Service服务
  8. CCF201512试题
  9. 【转载】SQL Server 2008 中新建用户登录并指定该用户的数据库
  10. AcWing 4. 多重背包问题(多重背包 朴素版)
  11. 短视频APP测试要点
  12. 使用foobar2000将cue文件分割wav、ape、flac无损音乐
  13. 中段尾段全段什么意思_排气管中段 尾段 全段 和芭蕉 是什么意思
  14. Java创建图片并绘图
  15. POCO C++库学习和分析 -- 序
  16. 平安科技美国研究院院长韩玫:AI赋能传统行业,要知其然也知其所以然
  17. Pixhawk---sdlog2应用详解
  18. 分布式数据库中间件 MyCat 搞起来!
  19. POJ1008 玛雅历
  20. 使用高德地图绘制矩形网格,显示行政区域。

热门文章

  1. emf java_Java实现emf图片字节流转png(jpg)图片字节流
  2. gmr 通信 matlab,matlab使用TCP/IP Server Sockets
  3. python字典遍历的4种方法
  4. Python练习题:批量删除多个文件夹内的相同文件
  5. python使用内置方法和修饰器方法获取类名、函数名
  6. 一文读懂:从 Python 打包到 CLI 工具
  7. linux cp指令报错:cp: omitting directory ‘xxx‘(需要加-r递归拷贝)
  8. Intel Realsense D435 C/C++调用code examples(附代码)(坑坑坑坑坑!!!)(opencv显示图片反色解决)
  9. 睡觉时憋气发出“嗯嗯”的声音?
  10. numpy np.polyfit()(最小二乘多项式拟合曲线)(有待进一步研究)