Linux I/O调度策略
目前Linux主要提供三种IO调度策略:CFQ(Completely Fair Queue,完全公平队列)、DEADLINE和NOOP(No operation),其中:
- CFQ:按照IO请求的地址进行排序,而不是按照先来后到的顺序来进行响应,同时对I/O请求进行合并。(CFQ 为所有进程尽量分配等量的带宽,适合于桌面多任务及多媒体应用。)
- Deadline:DEADLINE算法是基于CFQ实现的,除CFQ原有机制外,它新增超时机制,避免IO饿死的极端情况,同时还对读写请求分别增加了FIFO队列
FIFO(Read) > FIFO(Write) > CFQ。(DeadLine是一种以提高机械硬盘吞吐量为思考出发点的调度算法,适合业务比较单一并且I/O压力比较重的业务,比如Web服务器,数据库应用等。) - NOOP:该算法不会对I/O请求进行排序,只会对I/O请求进行合并。(NOOP 对于闪存设备和嵌入式系统是最好的选择。对于固态硬盘来说使用NOOP是最好的,DeadLine次之,而CFQ效率最低。)
其中,CFQ和DEADLINE主要针对的是机械盘设计的,其对IO请求进行地址重排,可以尽量减少磁盘旋转次数。但对于固态盘,这种机制增加了IO请求在IO队列中的开销。所以,
- SSD推荐使用NOOP。因为它无需移动电子元件,I/O重排对其是一种不必要的开销,不适合CFQ和Deadline。
- HDD使用Deadline或CFQ。这调度策略不会有明显性能差异,但在I/O压力较大情况下,CFQ会导致部分进程I/O延迟过高。
查看Linux系统的 I/O调度器
查看系统支持的I/O调度器
查看Linux系统的I/O调度器一般分成两个部分,一个是查看Linux系统整体使用的I/O调度器,另一个是查看某磁盘使用的I/O调度器。
# dmesg | grep -i scheduler [ 1.508820] io scheduler noop registered [ 1.508827] io scheduler deadline registered [ 1.508850] io scheduler cfq registered (default)
查看某块硬盘使用的I/O调度器
# cat /sys/block/sda/queue/scheduler noop deadline [cfq]
修改磁盘的I/O调度器
Linux下更改的I/O调度器很简单,不需要更新内核,无需重启计算机,可以使用shell命令修改
#其中,sdx设置为实际SSD设备 sudo echo noop > /sys/block/sdx/queue/scheduler