linux系统磁盘IO调度

注册 Vultr VPS 送你10美金 免费玩4个月

I/O 调度算法再各个进程竞争磁盘I/O的时候担当了裁判的角色.他要求请求的次序和时机做最优化的处理,以求得尽可能最好的整体I/O性能.其实所有的 IO 优化只有二点,合并和排序… 在linux下面列出4种调度算法

CFQ (Completely Fair Queuing 完全公平的排队)(elevator=cfq):

这是默认算法,对于通用服务器来说通常是最好的选择.它试图均匀地分布对I/O带宽的访问.在多媒体应用, 总能保证audio、video及时从磁盘读取数据.但对于其他各类应用表现也很好.每个进程一个queue,每个queue按照上述规则进行merge和sort.进程之间round robin调度,每次执行一个进程的4个请求.可以调 queued 和 quantum 来优化

Deadline (elevator=deadline):

这个算法试图把每次请求的延迟降至最低.该算法重排了请求的顺序来提高性能.可以调队列的过期的读写过程,如 read_expire 和 write_expire 二个参数来控制多久内一定要读到数据,超时就放弃排序.比较合适小文件.还可以使用打开 front_merges 来进行合并邻近文件.

NOOP (elevator=noop):

I/O请求被分配到队列,调度由硬件进行,只有当CPU时钟频率比较有限时进行. Noop对于I/O不那么操心,对所有的I/O请求都用FIFO队列形式处理,默认认为 I/O不会存在性能问题.这也使得CPU也不用那么操心.当然对于复杂一点的应用类型使用这个调度器,用户自己就会非常操心.
Noop调度算法指的是当请求被存储到队列并交由I/O子系统处理时由磁盘硬件对其进行优化.该算法一般只对一些特定的硬件(例如RAM disk和TCQ disk等).现代磁盘控制器都具备通过tagged command queuing进行优化的功能.Tagged command queuing(TCQ)可以通过由磁盘控制器对I/O请求进行重新排序来减少磁头的动作.通常需要进行重组的I/O请求都会带有一个标识符,这样控制器在接收到这些I/O请求的时候会按照规则进行处理.
有些应用程序需要对队列长度进行限制,而现代的设备驱动都具备用于控制队列长度的TCO功能,并且该功能可以作为内核参数在系统启动的时候添加.例如要控制SCSI驱动器Lun2的队列长度为64个请求,可以修改/etc/grub.conf并增加下面的内核参数:aic7xxx=tag_info:{{0,0,64,0,0,0,0}}

Anticipatory (elevator=as):

对读操作优化服务时间,在提供一个I/O的时候进行短时间等待,使进程能够提交到另外的I/O.Anticipatory scheduler(as) 曾经一度是Linux 2.6 Kernel的I/O scheduler.Anticipatory的中文含义是“预料的,预想的”,这个词的确揭示了这个算法的特点,简单的说有个I/O发生的时候,如果又有进程请求I/O操作,则将产生一个默认的6毫秒猜测时间,猜测下一个进程请求I/O是要干什么的.这对于随机读取会造成比较大的延时,对数据库应用很糟糕,而对于Web Server等则会表现的不错.这个算法也可以简单理解为面向低速磁盘的,因为那个“猜测”实际上的目的是为了减少磁头移动时间.因此这种算法更加适合顺序读写的应用程序.这个可以用来调整的内核参数有 antic_expire ,read_expire 和 write_expire.

linux中IO调度方法的查看和设置的方法 查看当前IO

$ cat /sys/block/{DEVICE-NAME}/queue/scheduler  
$ cat /sys/block/sd*/queue/scheduler

例:输出结果如下

noop anticipatory deadline [cfq]

设置当前IO

`$ echo {SCHEDULER-NAME} > /sys/block/{DEVICE-NAME}/queue/scheduler` 
`$ echo noop > /sys/block/hda/queue/scheduler`

对IO调度使用的建议

Deadline I/O scheduler
在这个中 deadline 调度算法通过降低性能而获得更短的等待时间,它使用轮询的调度器,简洁小巧,提供了最小的读取延迟和尚佳的吞吐量,特别适合于读取较多的环境(比如数据库,Oracle 10G 之类).

Anticipatory I/O scheduler
anticipatory 算法通过增加等待时间来获得更高的性能,假设一个块设备只有一个物理查找磁头(例如一个单独的SATA硬盘),将多个随机的小写入流合并成一个大写入流(相当于给随机读写变顺序读写), 使用这个原理来使用读取写入的延时换取最大的读取写入吞吐量.适用于大多数环境,特别是读取写入较多的环境,比如文件服务器,Web 应用,App等应用我们可以采纳as调度.后面我会教大家怎么调这个的合并的等待时间.

CFQ I/O scheduler
这个是 对所有因素也都做了折中而尽量获得公平性,使用QoS策略为所有任务分配等量的带宽,避免进程被饿死并实现了较低的延迟,可以认为是上述两种调度器的折中.适用于有大量进程的多用户系统

注册 Vultr VPS 送你10美金 免费玩4个月