1. BLOCK MQ发展历史
BLOCK MQ即多队列特性,在3.13内核已何如主线,但默认仍是SQ(即单队列)。在4.19时将BLOCK MQ设置为默认设置,在5.0内核后删除原来的SQ,只支持MQ。
2. 基本概念
在介绍BLOCK MQ之前需要知道以下概念:
2.1 请求队列request-queue
请求队列是基于硬盘的,对于每个硬盘对应一个请求队列request-queue,同一个硬盘上的IO会链入到同一个请求队列上。
2.2 软件队列ctx
这个概念也是在BLOCK MQ支持引入的,软件队列ctx是基于per-CPU的,每个CPU上对应一个软件队列ctx;
2.3 硬件队列hctx
这个概念也是由BLOCK MQ引入的,硬件队列hctx是基于设备上报的真实硬件队列(目前都是真实上报),在BLOCK MQ特性将软件队列ctx与硬件队列hctx进行映射。
3 BLOCK SQ原理
在BLOCK MQ之前分析一下BLOCK SQ队列。
对于系统中发往某个硬盘的线程,都是通过该硬盘的请求队列request-queue下发给驱动,然后驱动根据硬件的实际队列数目,将IO请求进行分发的。

其中hq表示hardware queue即硬件队列,发送某个硬盘的各CPU的IO发送线程通过硬盘所对应的请求队列request-queue,发送给驱动,驱动再做分发,发送给控制器的硬件队列。
每个硬盘在IO下发过程,实际在BLOCK层只有一个请求队列,当多个线程下发IO时,虽然硬件队列有多个,但在BLOCK层仍会受限于单个请求队列。
4 BLOCK MQ原理
支持BLOCK MQ后,BLOCK层不在以请求队列request-queue来作为发送队列。每个CPU上存在一个per-CPU的软件队列ctx, 在每个CPU上的发送线程会通过ctx发送,同时在软件队列和硬件队列之间会做映射,软件队列发送到对应的硬件队列上,最终硬件队列与真实的硬件队列一一对应。确保对同一个硬盘,不在受限于一个请求队列,而是通过多个硬件队列最终下发。提高了并发性的同时让硬件的能力得到发挥。

5 小结
从BLOCK SQ到BLOCK MQ的变化,使BLOCK层软件框架能够适应更快的硬盘和控制器,提升了存储IO的性能。其实随着硬件的不断变化(包括硬盘和控制器),BLOCK层的框架一直也在不断变化,比如之前硬盘比较慢,于是增加IO调度层进行合并和排序,但随着SSD硬盘和NVME盘出现,在IO调度层进行合并排序不一定能起到优化的效果,反而可能浪费时间,因此又产生跳过IO调度层的需要等。
博客介绍了块设备多队列技术BLOCKMQ的发展历程,从3.13内核的引入到5.0内核成为默认设置,提升并发性和硬件性能。BLOCKSQ时代,IO请求通过单个请求队列分发,而在BLOCKMQ中,每个CPU有自己的软件队列,映射到硬件队列,实现多队列并发,优化了存储IO性能。
BLOCK MQ基本原理&spm=1001.2101.3001.5002&articleId=121306716&d=1&t=3&u=6f9ccea770824d40a5d3aafc5bc39634)

被折叠的 条评论
为什么被折叠?



