基于动态阈值的调度算法分析
原文来自 魏元豪,吴庆波,邵立松,刘 敏,孙立明,针对固态硬盘的拥塞控制 I / O 调度器,国防科技大学。
先简单说说这篇论文的出发点,原文作者认为存储设备上的大量数据的长度并不是随机分布,而是重尾态的分布,故I/O路径中是有大量的小片请求和少量偶尔出现的大块请求。原文作者基于I/O调度层读写请求的统计规律,针对I/O路径局部拥塞缺陷设计了DVI/OS的调度器。

如上图,文中对不同大小的request响应延迟做了一系列测试,得到了一条基本规律,读请求的delay保持在1ms内,写请求延迟则变化范围大。而结合实际,研究表明硬盘文件系统尽量会将同一数据对象连续存入,而资源有限将会导致大部分小请求可以被连续写入,而大请求较小几率连续存储。

文中作者又做了一次关于请求大小数量分布,这是I/O调度层的请求哦!作者解释说因为硬盘的旧化,通用块层针对缓存大小做合并,所以大块请求很多都被合并到128KB和512KB规模。
重头戏在这里:拥塞效应。简而言之,就是大块数据请求的处理时间很长,让后面的请求等待时间较长,原文作者拿R/W=10:1的大规模操作来测试执行结果。一张图让你明明白白,什么是拥塞效应。

很明显的看到1340号请求后面那一段a图中延迟明显增大,而b图中却看见1340-1360后半段全部都是小规模请求,它们如果得到了处理那么延迟时间可能低于1ms。这证明过了Linux内核的NOOP调度器有很高的提升性能的空间。
DVI/OS request scheduler实现原理
首先它们引入了一个量叫做拥塞阈值,其公式为:
拥塞阈值=1/每秒I/O发起次数,单位是ms,它们的想法是如果I/O频率一定,那么每个请求的平均处理时间一定,超过Avg时间就会有阻塞效应产生。所以它们认为的定制了三个阈值来分级区别处理。这个动态阈值调度器通过不断的更新请求的阈值,对I/O路径上的系统繁忙程度调控。
第一级:1ms,图中32kb以下请求delay小鱼1ms,所以就设置一级阈值为1ms,所以对于这样的请求不需要经过优化调度,直接派发处理就完事
第二级:2ms,32kb-64kb还算有一定量级的I/O请求,延迟在1-2s,设置2s为拥塞阈值
第三级:10ms,专门用于区分大块请求。
基于三级阈值的调度器设计
一级阈值下的IOrequest不必处理,若请求频率到达100-500之间,把2ms级别以上的放入排序缓冲区(见下图),剩下的request直接放入FIFO等待处理;若frequency达到了500+,特别是f>1000时,FIFO只保存一级请求,其余的全数放置于大小排序缓冲区。这就实现了动态管理,调度执行顺序让性能提升。
整个调度器的实现过程如下:
每个请求都有时间限制,所以调度器会给每个I/O请求一个ddl,派发模块首先判断是否会有超时,有超时情况存在直接派发(用户体验高于一切),否则就按照原来的策略。如图:

最后验证调度器的优化效果:

这个实验环境是负载上给每个进程400次随机I/O,并发量分别设置为20,40,60,总的来看是并发量多,优势明显,实验数据表明优化比例分别是9.63%,21%,20%。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------以上是我更新的第一篇博客,读国防科技大学计算机学院几个学长的论文,大致分析了一下他们的思路,轻喷!这博客的格式也还不怎么会调,下次多多注意咯

浙公网安备 33010602011771号