https://lwn.net/Articles/709202/ 

文卿

BFQ(Budget Fair Queuing)I/O调度器自2014年起被内核社区讨论了无数次。通过修改调度算法、添加很多启发式策略,BFQ能够让I/O设备提供更好的响应,特别是针对传统的机械硬盘设备。尽管有这些明显的优势,但BFQ一直没有被内核主线接受。然而最近的一些信息显示阻碍BFQ进入主线代码的障碍就要被移除了。

过去几年对于BFQ调度器的反对主要集中在如下几点。首先BFQ刚开始尝试进入内核主线的时候,内核中已经有很多I/O调度器了,大家都认为应该将BFQ的功能集成到已有的CFQ调度器中。2016年2月,BFQ作者尝试将BFQ功能添加到CFQ中,但是这一尝试存在很多缺陷,后来就不了了之了。此外,大家认为用BFQ来替换已经经过大量使用和测试的CFQ是不妥当的。而最大的问题是,BFQ使用的是此前的内核API,而这些API并不支持多队列。

多队列功能是用来解决块设备扩展性问题的一个特性。该特性允许I/O请求被放入不同CPU的队列中并被这些CPU处理。因此内核开发者当然希望尽可能多的块设备代码能够建立在这些已有的架构上。BFQ利用新的多队列API存在一个问题,即当前的多队列不支持I/O调度器。因为多队列特性开发之初主要为了解决高性能块设备的扩展性问题,缺少对传统机械硬盘的考虑。因此,在此基础上集成一个I/O调度器的工作确实有一定的困难。

当然如果传统机械硬盘会被慢慢淘汰,那么我们也不用考虑这一问题了。但现实是传统机械硬盘还要继续存在很长一段时间。因此为多队列代码提供一个I/O调度器是有意义的一件事。

最近Jens Axboe开始尝试在多队列代码中添加I/O调度器的支持。同时BFQ的作者也开始尝试将BFQ调度器移植到最新的代码上。

最后我们要说,BFQ即将进入内核主线!