磁盘I/O,Linux提供了cfq, deadline和noop三种调度策略
cfq: 这个名字是Complete Fairness Queueing的缩写,它是一个复杂的调度策略,按进程创建多个队列,试图保持对多个进程的公平(这就没考虑读操作和写操作的不同耗时)
deadline: 这个策略比较简单,只分了读和写两个队列(这显然会加速读取量比较大的系统),叫这个名字是内核为每个I/O操作都给出了一个超时时间
noop: 这个策略最简单,只有单个队列,只有一些简单合并操作
考虑到硬件配置、实际应用场景(读写比例、顺序还是随机读写)的差异,上面的简单解释对于实际选择没有太大帮助,实际该选择哪个基本还是要实测来验证。不过下面几条说明供参考:
根据多篇文章的说法,deadline和noop差异不是太大,但它们俩与cfq差异就比较大
MySQL这类数据存储系统不要使用cfq(时序数据库可能会有所不同。不过也有说从来没见过deadline比cfq差的情况),尽量使用deadline。
对于虚拟机上面的磁盘,建议采用比较简单的noop,毕竟数据实际上怎么落盘取决于虚拟化那一层
几个vm的默认值是:centos6是cfq,ubuntu12.04是xxxx,centos7和ubuntu14.04是deadline
MySQL数据库环境调整磁盘IO调度算法
最后期限算法(Deadline)除了维护了一个拥有合并和排序功能的请求队列外,额外维护了两个队列,分别是读请求队列和写请求队列,他们都是带有超时的请求队列,当新来一个IO请求时,会被同时插入普通队列和读写队列,然后I/O调度器正常处理普通队列中的请求。当调度器发现读写请求队列中的请求超时的时候,会优先处理这些请求,保证尽可能不产生饥饿请求。对于MYSQL来说,建议设置为Deadline,对MYSQL来说是很好的调度算法。
查看当前系统支持的磁盘IO调度算法
[root@localhost~]#dmesg | grep -i scheduler
io scheduler noop registered
io scheduler anticipatory registered
io scheduler deadline registered
io scheduler cfq registered (default)
default代表当前设备使用的缺省的IO调度算法
也可以用以下命令查看:
[root@localhost ~]# more/sys/block/sda/queue/scheduler
noop anticipatory deadline [cfq]
备注:括号里括起来的即为当前调度算法值
修改当前块设备使用的io调度算法为deadline:
[root@localhost ~]# echo"deadline" > /sys/block/sda/queue/scheduler
备注:修改立即生效
[root@localhost ~]# more/sys/block/sda/queue/scheduler
noop anticipatory [deadline] cfq
如果已经部署了MySQL数据库环境,需要重新启动MySQL。