Linux IO调度

来源:互联网 发布:linux 没有service 编辑:程序博客网 时间:2024/06/03 21:57

前言

在计算机系统中IO请求分为两种,一种是读请求,一种是写请求,这两种请求对时间的敏感度有很大的差异。进程会因读请求儿进入休眠状态,如果是和用户交互的应用,休眠时间过长会引起明显的卡顿,用户体验便会下降;写请求则不同,它可被系统暂存在IO缓冲区中,等空闲时在将数据写入指定的IO中。

IO调度方式都需要完成请求合并工作,请求的排序工作会因IO器件的不同而有所不同。具体的IO调度方式有以下几种:


linus电梯IO调度方法


这个名字很熟悉,就不多说了。很直观的可以想象IO请求的过程很像乘坐电梯,所以最初Linux系统就使用的是此调度方法。

在此方法中系统只有一个队列用于存放IO请求,当一个新的IO请求准备加入时,会遍历整个队列,查找是否可能合并的请求。如果找到了可以合并的请求,就进行两个请求的合并,这样就可以将两个IO请求变成一个,缩短IO设备的寻址时间;如果没有找到可以合并的IO请求,那么就将此IO请求放在队列的尾部。IO请求插入完成后,会对队列中的请求按照扇区的方向进行排序。

这种调度方法的缺点是没有很好的解决请求的饥饿问题。在极端情况下,有些请求将得到不到执行。另外队列中没有区分读写请求,这样也会加剧读请求延时对系统的影响。


最终期限IO调度方法(deadline)


此调度方法的出现是为了解决电梯调度方法的饥饿问题。在最终期限IO调度方法中,每个请求都有一个超时时间,读请求默认为500ms,写请求默认为5s。方法中需要维护三个队列,分别是排序队列、写请求队列和读请求队列。排序队列同电梯调度方法中的队列操作方法类似,读写请求队列是FIFO队列。如果这两个队列中有超时的请求,那会马上得到执行,如果没有则从排序队列中取出一个执行,此请求会从两个队列中删除。

这种方法比较好的防止请求饥饿的发生,但不能严格保证请求的相应时间。


预测IO调度方法(as)


因为在很多的应用场景中,代码经常会发送一个读IO请求,在获取结果后再发出IO请求,这两个请求的存放地址会很接近,如果按照先前的两种方法,在这种情况下新的IO请求不会得到及时的执行。预测IO调度方法很好的解决了这个问题。

预测IO调度方法以最终期限IO调度方法为基础,只是在处理完一个请求后并不急于处理下一个请求,而是等待一定的时间(默认为6ms,此值可配置),在此等待时间内可能会有新的无需长时间寻址的IO请求,如果有,在等待完毕后便立即执行。

这样预测IO调度方法的吞吐量就会比最终期限IO调度方法略胜一筹,当然请求执行完后的等待也消耗了一定的时间。


完全公正IO调度方法(CFG)


完全公正IO调度方法是根据操作IO的进行格式来确定队列的格式,每个队列都会进行合并和排序工作,然后方法会让队列轮转起来,比如每个队列执行4个请求后换下一个队列执行,这样就确保每个进程都可以接收到公平的磁盘带宽。


空操作IO调度方法(noop)


这种调度方法是为哪些没有寻道负担的块设备准备的,如闪存卡、SSD等。空操作IO调度方法只完成合并请求的工作,不对队列进行扇区排序。请求的执行会遵循FIFO的模式。


0 0
原创粉丝点击