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

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

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

修改Linux IO调度器

Linux系统默认提供了三种IO调度方式 noop deadline cfq 原来系统中默认的调度方式是deadline,下面介绍如何更改默认调度机制。一次性更改通过host > cat /sys/b...
  • abcamus
  • abcamus
  • 2017年02月07日 21:42
  • 1461

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

************************************************************************************** 参考: 《Linux内核设...
  • hustyangju
  • hustyangju
  • 2014年10月27日 15:08
  • 2849

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

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

浅谈IO调度算法

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

调优之IO调度

07 Understand IO Scheduling理解IO调度            ======================================================...
  • tangshiweibbs
  • tangshiweibbs
  • 2017年05月02日 10:34
  • 666

[IO系统]16 IO调度器-NOOP

Noop调度算法也叫作电梯调度算法,它将IO请求放入到一个FIFO队列中,然后逐个执行这些IO请求,当然对于一些在磁盘上连续的IO请求,Noop算法会适当做一些合并。这个调度算法特别适合那些不希望调度...
  • iamonlyme
  • iamonlyme
  • 2017年03月16日 20:17
  • 661

操作系统(6)--IO管理和磁盘调度学习笔记

执行IO的三种技术: 可编程IO:处理器代表一个进程给IO模块发送IO命令,该进程进入忙等待,直到操作完成才可以继续执行;中断驱动IO:处理器代表进程给IO模块发送IO命令,有两种可能性:如果来自...
  • woshizuxi
  • woshizuxi
  • 2016年09月29日 19:12
  • 530

btrfs cfq, noop, deadline三种IO调度策略下的IO性能表现(gp针对grup.conf配置)

转自:http://blog.163.com/digoal@126/blog/static/1638770402015117214118/ btrfs 格式化和挂载参数: # mkfs.btrfs...
  • wdnq1022
  • wdnq1022
  • 2017年11月22日 16:11
  • 141

磁盘IO过高 处理办法

针对系统中磁盘IO负载过高的指导性操作 主要命令:echo deadline > /sys/block/sda/queue/scheduler 注:以下的内容仅是提供参考,如果磁盘IO...
  • xie1xiao1jun
  • xie1xiao1jun
  • 2014年03月06日 15:17
  • 16272
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux的IO调度
举报原因:
原因补充:

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