MySQL DBA
分类: LINUX
2013-03-07 14:05:35
CFQ (Completely Fair Queuing 完全公平的排队)(elevator=cfq):
Deadline (elevator=deadline):
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.
1
2
|
$ cat /sys/block/{DEVICE-NAME}/queue/scheduler
$ cat /sys/block/sd*/queue/scheduler
|
1
|
noop anticipatory deadline [cfq]
|
1
2
|
$ echo {SCHEDULER-NAME} > /sys/block/{DEVICE-NAME}/queue/scheduler
$ echo noop > /sys/block/hda/queue/scheduler
|
磁盘队列长度
/sys/block/sda/queue/nr_requests 默认只有 128 个队列,可以提高到 512 个.会更加占用内存,但能更加多的合并读写操作,速度变慢,但能读写更加多的量
等待时间
/sys/block/sda/queue/iosched/antic_expire 读取附近产生的新请时等待多长时间
对读优化的参数
1
|
/proc/sys/vm/dirty_ratio
|
这个参数控制文件系统的文件系统写缓冲区的大小,单位是百分比,表示系统内存的百分比,表示当写缓冲使用到系统内存多少的时候,开始向磁盘写出数 据.增大之会使用更多系统内存用于磁盘写缓冲,也可以极大提高系统的写性能.但是,当你需要持续、恒定的写入场合时,应该降低其数值,一般启动上缺省是 10.下面是增大的方法: echo ’40′> /proc/sys/vm/dirty_ratio
1
|
/proc/sys/vm/dirty_background_ratio
|
这个参数控制文件系统的pdflush进程,在何时刷新磁盘.单位是百分比,表示系统内存的百分比,意思是当写缓冲使用到系统内存多少的时候, pdflush开始向磁盘写出数据.增大之会使用更多系统内存用于磁盘写缓冲,也可以极大提高系统的写性能.但是,当你需要持续、恒定的写入场合时,应该降低其数值,一般启动上缺省是 5.下面是增大的方法: echo ’20′ > /proc/sys/vm/dirty_background_ratio
1
|
/proc/sys/vm/dirty_writeback_centisecs
|
这个参数控制内核的脏数据刷新进程pdflush的运行间隔.单位是 1/100 秒.缺省数值是500,也就是 5 秒.如果你的系统是持续地写入动作,那么实际上还是降低这个数值比较好,这样可以把尖峰的写操作削平成多次写操作.设置方法如下: echo ’200′ > /proc/sys/vm/dirty_writeback_centisecs 如果你的系统是短期地尖峰式的写操作,并且写入数据不大(几十M/次)且内存有比较多富裕,那么应该增大此数值: echo ’1000′ > /proc/sys/vm/dirty_writeback_centisecs
1
|
/proc/sys/vm/dirty_expire_centisecs
|
这个参数声明Linux内核写缓冲区里面的数据多“旧”了之后,pdflush进程就开始考虑写到磁盘中去.单位是 1/100秒.缺省是 30000,也就是 30 秒的数据就算旧了,将会刷新磁盘.对于特别重载的写操作来说,这个值适当缩小也是好的,但也不能缩小太多,因为缩小太多也会导致IO提高太快.建议设置为 1500,也就是15秒算旧. echo ’1500′ > /proc/sys/vm/dirty_expire_centisecs 当然,如果你的系统内存比较大,并且写入模式是间歇式的,并且每次写入的数据不大(比如几十M),那么这个值还是大些的好.