linux内核io调度算法

1. io调度算法简单介绍

noop(elevator) 电梯调度

所有进程的io请求都进入FIFO队列,完全按照队列的顺序进行io的读取,会进行请求的合并以及在队列的重排序,但是主要还是遵循FIFO的原则,算法缺点也很明显,会导致靠后的io请求饥饿,以及对io请求都会进行disk seek(磁盘的定位)产生大量的寻道时间

CFQ (complete fair queue) 完全公平队列

针对同步请求时,CFQ会根据当前进程的io优先级进行调度时间的分配,CFQ会给每个进程分配一个io请求的时间片来处理当前进程的io请求,在同步请求上的公平是体现在同一进程中的

针对进程的异步请求时,CFQ会有一组公共三个level优先级并且内部还有存有自身的优先级的等待队列 RT(real time) BT(best try) ID( idle)。8个RT + 8个BT + 1个ID队列。os根据队列的优先级作为调整因素进行io的读写操作

DEADLINE

该算法实际是对Noop算法的改进。在CFQ队列的前提下增加了增加了读队列、写队列,然后其余的操作是按照CFQ队列进行。并且优先级排序:Read queue > Write queue > CFQ queue,注意读队列会有一个读延时默认5ms的设置,超过这个时间后,会优先考虑该队列里的io操作,写超时是5s级别,之所以这么设计的前提是,大部分系统调用时,读操作都是进行io等待,而写操作不需要内核进行响应,应用程序就可以直接返回了,os在根据调度将写操作进行

ANTICIPATORY

该io调度算法在DEADLINE的前提下,增加了一个特殊处理。就是每个io读请求后的特定时间窗口内(默认6ms可调整)存在临近扇区的io操作,那么会将读io操作合并进行处理。

2.对于应用进行io调度算法的选择

首先我们需要了解各算法的优劣势以及结合应用的特点并且要清楚知道储存介质是HDD或SSD。

CFQ的缺点很明显,由于是完全公平队列,那么必然会存在io请求饥饿的情况,但它确是很合适通用服务器的io算法选择。随机的io读写,当我们在不知道应用具体情况下时,可以使用这种linux2.6的内核版本默认的io算法

Noop电梯调度算法,缺点也是同样的显而易见,io请求饥饿以及每次请求都需要寻道。但是如果针对的是ssd硬盘。这种算法是最简单也是最有效的,因为ssd不存在传统hdd的寻道时间

DEADLINE算法,是针对CFQ以及Noop的优化,优点很明显,在读多写少的应用场景下该算法可以发挥很好的性能,但是如果是针对一些磁盘异步写binlog日志或者刷盘处理的应用需要慎重使用,因为该算法可能存在丢失数据的风险。

ANTICIPATORY算法由于其他算法都是针对零散的随机读写操作进行的优化而该因为存在一个读窗口时间,在随机IO以及针对大量的顺序读时是很好的io算法选择

除了以上分析以外,任何我们理论上的结论都需要我们以实际的实验的benchmark为准!

3.具体linux如何查看以及设置io算法

可以看到[deadline]是目前os选择的io算法。我这里只显示了三种算法,这是具体根据linux内核版本决定的,而且上面的介绍都是针对一定Linux内核版本来说。如果要确认具体的行为实现请一定参考内核源码,本人功力有限。

选择具体的io算法:

echo deadline > /sys/block/sda/queue/scheduler 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值