Welcome 微信登录

首页 / 数据库 / MySQL / MySQL服务器Linux IO调度器算法的选择

一. IO调度器(IO Scheduler)是操作系统用来决定块设备上IO操作提交顺序的方法。存在的目的有两个,一是提高IO吞吐量,二是降低IO响应时间。然而IO吞吐量和IO响应时间往往是矛盾的,为了尽量平衡这两者,IO调度器提供了多种调度算法来适应不同的IO请求场景。其中,对数据库这种随机读写的场景最有利的算法是DEANLINE。接着我们按照从简单到复杂的顺序,下面是Linux 2.6内核提供的几种IO调度算法。1、NOOP
NOOP算法的全写为No Operation。该算法实现了最最简单的FIFO队列,所有IO请求大致按照先来后到的顺序进行操作。之所以说“大致”,原因是NOOP在FIFO的基础上还做了相邻IO请求的合并,并不是完完全全按照先进先出的规则满足IO请求。
假设有如下的io请求序列:
100,500,101,10,56,1000
NOOP将会按照如下顺序满足:
100(101),500,10,56,10002、CFQ
CFQ算法的全写为Completely Fair Queuing。该算法的特点是按照IO请求的地址进行排序,而不是按照先来后到的顺序来进行响应。
假设有如下的io请求序列:
100,500,101,10,56,1000
CFQ将会按照如下顺序满足:
100,101,500,1000,10,56在传统的SAS盘上,磁盘寻道花去了绝大多数的IO响应时间。CFQ的出发点是对IO地址进行排序,以尽量少的磁盘旋转次数来满足尽可能多的IO请求。在CFQ算法下,SAS盘的吞吐量大大提高了。但是相比于NOOP的缺点是,先来的IO请求并不一定能被满足,可能会出现饿死的情况。3、DEADLINE
DEADLINE在CFQ的基础上,解决了IO请求饿死的极端情况。除了CFQ本身具有的IO排序队列之外,DEADLINE额外分别为读IO和写IO提供了FIFO队列。读FIFO队列的最大等待时间为500ms,写FIFO队列的最大等待时间为5s。FIFO队列内的IO请求优先级要比CFQ队列中的高,,而读FIFO队列的优先级又比写FIFO队列的优先级高。优先级可以表示如下:
FIFO(Read) > FIFO(Write) > CFQ4、ANTICIPATORY
CFQ和DEADLINE考虑的焦点在于满足零散IO请求上。对于连续的IO请求,比如顺序读,并没有做优化。为了满足随机IO和顺序IO混合的场景,Linux还支持ANTICIPATORY调度算法。ANTICIPATORY的在DEADLINE的基础上,为每个读IO都设置了6ms的等待时间窗口。如果在这6ms内OS收到了相邻位置的读IO请求,就可以立即满足。二. Linux操作系统IO调度器算法的查看和修改(以CentOS5.5为例):
[root@dbserver2 ~]# cat /etc/RedHat-releaseCentOS release 5.5 (Final)[root@dbserver2 ~]# uname -aLinux dbserver2 2.6.18-194.el5 #1 SMP Fri Apr 2 14:58:14 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux1.机器为2.6内核,查看IO调度算法设置的方法:
[root@dbserver2 ~]# fdisk -l Disk /dev/sda: 598.8 GB, 598879502336 bytes255 heads, 63 sectors/track, 72809 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytes  Device Boot      Start       End      Blocks Id  System/dev/sda1 *         1          13      104391 83  Linux/dev/sda2              14     65669 527381820 83  Linux/dev/sda3         65670     68219    20482875 83  Linux/dev/sda4         68220     72809    36869175    5  Extended/dev/sda5         68220     70769    20482843+  83  Linux/dev/sda6         70770     72809    16386268+  82  Linux swap / Solaris[root@dbserver2 ~]# [root@dbserver2 ~]# find / -iname "scheduler"/sys/block/sr0/queue/scheduler/sys/block/sda/queue/scheduler查看系统当前IO调度算法
[root@dbserver2 ~]# cat /sys/block/sda/queue/schedulernoop anticipatory deadline [cfq]    ----括号中为当前使用的算法 2.修改IO调度算法:
[root@test80 ~]# echo deadline > /sys/block/sda/queue/scheduler[root@test80 ~]# cat /sys/block/sda/queue/schedulernoop anticipatory [deadline] cfq 可以看到IO调度算法已经修改为deadline三. 针对MYSQL数据库服务器的IO调度算法优化设置:1.CFQ使用于IO大小非常均匀的场景2.比较复杂的OLTP环境最好使用DeadLine算法3.IO性能不是瓶颈的时候可以使用Noop算法4.Anticipatory不适合数据库环境,DB服务器不要使用这种算法。5.新兴的固态硬盘比如SSD、Fusion IO上,最简单的NOOP反而可能是最好的算法,因为其他三个算法的优化是基于缩短寻道时间的,而固态硬盘没有所谓的寻道时间且IO响应时间非常短。Oracle数据迁移方案SQL Server计算列是否占用空间相关资讯      MySQL服务器  MySQL数据库基础教程  Linux调度  IO调度器 
  • 如何配置全世界最小的 MySQL 服务  (12/10/2015 08:59:13)
  • Linux 调度总结  (06/08/2015 08:52:20)
  • Linux如何实现O(1)进程调度  (03/23/2013 07:00:09)
  • MySQL服务器时间同步问题处理  (09/28/2015 07:12:59)
  • Linux任务调度命令(轻松管理Linux  (06/05/2013 08:54:05)
  • Linux系统的中断、系统调用和调度  (11/20/2012 10:16:50)
本文评论 查看全部评论 (0)
表情: 姓名: 字数