【笔记】linux IO调度策略

I/O scheduler的作用就是为上层应用发过来的IO请求做一个优化,它主要完成两件事:merge and sort。以此达到提高系统吞吐量、缩短响应时间的目的。

更改I/O scheduler有两种方式:

1./sys/block/device_name/queue/scheduler (IOscheduler); /sys/block/device_name/queue/nr_request(queuesize)
2.永久修改?启动时,grup->edit->elevator =scheduler_name



Linux的IO调度策略包括:Deadline scheduler,Anticipatory scheduler,Completely Fair Queuing(CFQ),NOOP
详细介绍参考:Linux I/O调度策略
CFQ是一种通用方案,deadline适用对响应要求高的情景,而NOOP适用SSD、fusion IO。
1.CFQ(completely fair queuing)
    完全公平队列,实现了请求的sort和merge。
    劣势:会存在请求响应时间很长或者被饿死的情况。[1]
2.Deadline
    deadline是为了解决请求响应时间太长,被饿死这种情况而出现的。它也实现了请求的sort和merge
3.NOOP 
    NOOP的全称是no operations,它就是一个简单的FIFO,不过它实现了merge(没有sort),也就是说如果两个请求访问的额磁道地址在一起,那么就会合并它们。适用于寻道时间极小或者没有所谓的寻道时间代价的存储设备
    适用SSD、fusion IO,而不适应HDD。
4.Anticipatory scheduler
    不过现在已经被CFQ取代



 Queue size 用来存在IO请求的队列的大小,理论上来说queue size越大,提升的性能更大,因为有更多的请求被优化了。但是这里需要注意几种情况。
1. 在SSD、Fusion IO这种不需要寻道时间(seek time)的情景下,增大了size并没有多大益处,因为对队列的维护而带来负面影响。
2. 在使用innodb的时候,无论是CFQ还是deadline,都不要设置为太大的queue size。
    有人说innodb内部也对io请求做了根os一样的优化(实际上应该指的就是insert buffer),那么如果在os层把queue size设得太大的话会与innodb内部重复,导致额外的代价,性能或许会更低
    疑问:innodb内部在做IO请求合并时是根据什么标准来合并排序的呢?比如LBA?或是真正的物理地址CHS?)
        INSERT BUFFER安装主键顺序进行排序
3.  Linux的文档中说deadline比CFQ更适合数据库这种情况,但是貌似只有在极大地系统压力情况下deadline才会比CFQ有比较大的性能优势。



参考
http://blog.csdn.net/zbszhangbosen/article/details/7434070

LINUX上MYSQL优化三板斧




请使用浏览器的分享功能分享到微信等