优化磁盘IO调度方式
原理
文件系统在通过驱动读写磁盘时,不会立即将读写请求发送给驱动,而是延迟执行,这样Linux内核的IO调度器可以将多个读写请求合并为一个请求或者排序(减少机械磁盘的寻址)发送给驱动,提升性能。我们在前文介绍工具iostat时,也提到了合并的统计,这个值就是由这个过程统计获得。
目前Linux版本主要支持3种调度机制:
- CFQ,完全公平队列调度
早期Linux内核的默认调度算法,它给每个进程分配一个调度队列,默认以时间片和请求数限定的方式分配IO资源,以此保证每个进程的IO资源占用是公平的。这个算法在IO压力大,且IO主要集中在某几个进程的时候,性能不太友好。
- DeadLine,最终期限调度
这个调度算法维护了4个队列,分别为读队列、写队列、超时读队列和超时写队列。当内核收到一个新请求时,如果能合并就合并,如果不能合并,就会尝试排序。如果既不能合并,也没有合适的位置插入,就放到读或写队列的最后。一定时间后, IO调度器会将读或写队列的请求分别放到超时读队列或者超时写队列。这个算法并不限制每个进程的IO资源,适合IO压力大且IO集中在某几个进程的场景,比如大数据、数据库使用HDD磁盘的场景。
- NOOP,也叫NONE,是一种简单的FIFO调度策略
修改方式
查看当前的调度方式:
# cat /sys/block/$DEVICE-NAME/queue/scheduler noop deadline [cfq]
[ ]中即为当前使用的磁盘IO调度模式。

操作系统不同,返回的值或默认值可能不同。
如果需要修改,可以采用echo来修改,比如要将sda修改为deadline:
# echo deadline > /sys/block/sda/queue/scheduler
父主题: 优化方法