Linux的IO调度

转载 2016年08月29日 22:06:23

之前蘑菇街电话面试的时候面试官问我IO调度算法有哪些,之前没留意过这个东西,记录一下:)

 

对于普通的机械硬盘,我们完成一次IO读写的流程从硬盘的物理结构上来说是,机械硬盘的存储介质是磁盘,磁头在盘片上移动进行磁道寻址,行为类似播放一张唱片。这种结构的特点是,顺序访问时吞吐量较高,但是如果一旦对盘片有随机访问,那么大量的时间都会浪费在磁头的移动上,这时候就会导致每次IO的响应时间变长,极大的降低IO的响应速度。磁头在盘片上寻道的操作,类似电梯调度,如果在寻道的过程中,能把顺序路过的相关磁道的数据请求都“顺便”处理掉,那么就可以在比较小影响响应速度的前提下,提高整体IO的吞吐量。这就是我们问什么要设计IO调度算法的原因。

 

常见的算法总结:

CFQ完全公平队列(Completely Fair Queueing)

cfq就是试图给所有进程分配等同的块设备使用的时间片,进程在时间片内,可以将产生的IO请求提交给块设备进行处理,时间片结束,进程的请求将排进它自己的队列,等待下次调度的时候进行处理。这就是cfq的基本原理。

DeadLine最终期限调度

deadline调度算法相对cfq要简单很多。其设计目标是,在保证请求按照设备扇区的顺序进行访问的同时,兼顾其它请求不被饿死,要在一个最终期限前被调度到。我们知道磁头对磁盘的寻道是可以进行顺序访问和随机访问的,因为寻道延时时间的关系,顺序访问时IO的吞吐量更大,随机访问的吞吐量小。如果我们想为一个机械硬盘进行吞吐量优化的话,那么就可以让调度器按照尽量复合顺序访问的IO请求进行排序,之后请求以这样的顺序发送给硬盘,就可以使IO的吞吐量更大。但是这样做也有另一个问题,就是如果此时出现了一个请求,它要访问的磁道离目前磁头所在磁道很远,应用的请求又大量集中在目前磁道附近。导致大量请求一直会被合并和插队处理,而那个要访问比较远磁道的请求将因为一直不能被调度而饿死。deadline就是这样一种调度器,能在保证IO最大吞吐量的情况下,尽量使远端请求在一个期限内被调度而不被饿死的调度器。

Noop调度器

noop调度器是最简单的调度器。它本质上就是一个链表实现的fifo队列,并对请求进行简单的合并处理。调度器本身并没有提供任何可疑配置的参数。

各种调度器的应用场景选择

从原理上看,

cfq是一种比较通用的调度算法,它是一种以进程为出发点考虑的调度算法,保证大家尽量公平,为所有进程分配等量的带宽,适合于桌面多任务及多媒体应用。

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

noop呢?其实如果我们把我们的思考对象拓展到固态硬盘,那么你就会发现,无论cfq还是deadline,都是针对机械硬盘的结构进行的队列算法调整,而这种调整对于固态硬盘来说,完全没有意义。对于固态硬盘来说,IO调度算法越复杂,额外要处理的逻辑就越多,效率就越低。所以,固态硬盘这种场景下使用noop是最好的,deadline次之,而cfq由于复杂度的原因,无疑效率最低。

如何(查看&&修改)我们OS上的IO调度算法?

查看当前系统支持的IO调度算法

[root@VM_58_172_centos ~]# dmesg | grep -i scheduler
[ 0.580914] io scheduler noop registered
[ 0.582382] io scheduler deadline registered (default)
[ 0.584125] io scheduler cfq registered

查看某块硬盘的IO调度算法

[root@VM_58_172_centos ~]# cat /sys/block/vda/queue/scheduler
none
[root@VM_58_172_centos ~]# cat /sys/block/vdb/queue/scheduler
none

修改某块硬盘的IO调度算法

[root@VM_58_172_centos ~]# echo cfq > /sys/block/vda/queue/scheduler
[root@VM_58_172_centos ~]# cat /sys/block/vda/queue/scheduler
none

我是在虚拟云主机上做的实验,不知为什么无法修改对应硬盘的IO调度算法,或许是供应商对此做了限制?之后再去细查一下

 

参考:

  Linux的IO调度(分析的很深入,严重推荐~):http://liwei.life/2016/03/14/linux_io_scheduler/?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io

  http://scoke.blog.51cto.com/769125/490546

相关文章推荐

块IO层(Linux内核源码分析)

背景本篇博客重点分析块IO层,试图了解在linux源码中是如何实现块IO的。基本知识块设备与字符设备块设备与字符设备都是物理外设。简单来说,块设备与字符设备的最大区别在于块设备都随机对数据片段进行读写...

Linux IO调度层分析-1

Linux IO调度程序是块设备I/O子系统的主要组件,它介于通用块层和块设备驱动程序之间,所图2-1所示。当Linux内核组件要读写一些数据时,并不是请求一发出,内核便立即执行该请求,而是将其推迟执...

Linux IO调度算法比较

  • 2015年04月01日 18:05
  • 305KB
  • 下载

Linux下io磁盘调度策略及配置

http://www.linuxidc.com/Linux/2011-06/37674.htm I/O 调度算法再各个进程竞争磁盘I/O的时候担当了裁判的角色。他要求请求的次序和时机...

Linux IO调度

在计算机系统中IO请求分为两种,一种是读请求,一种是写请求,这两种请求对时间的敏感度有很大的差异。进程会因读请求儿进入休眠状态,如果是和用户交互的应用,休眠时间过长会引起明显的卡顿,用户体验便会下降;...

linux io调度

转自:http://home.lupaworld.com/home.php?mod=space&uid=56821&do=blog&id=139949 一)I/O调度程序的总结: 1)当向设备写入...
  • lqx4_3
  • lqx4_3
  • 2011年08月12日 14:45
  • 1938

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

************************************************************************************** 参考: 《Linux内核设...

linux CFQ IO调度算法分析笔记

CFQ调度器是四种IO Scheduler中最复杂的一个,redhat有个文档可以做为入门的文档先了解下 red-hat-enterprise-linux-5-io-tuning-guide.pdf ...

Linux IO调度

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

小结一下linux 2.6内核的四种IO调度算法

在LINUX 2.6中,有四种关于IO的调度算法,下面综合小结一下: 1) NOOP NOOP算法的全写为No Operation。该算法实现了最最简单的FIFO队列,所有IO请求大致按照...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux的IO调度
举报原因:
原因补充:

(最多只允许输入30个字)