BLOCK层代码分析(2)BLOCK MQ基本原理

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请求进行分发的。

BLOCK层代码分析(2)BLOCK MQ基本原理_第1张图片

        其中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发送,同时在软件队列和硬件队列之间会做映射,软件队列发送到对应的硬件队列上,最终硬件队列与真实的硬件队列一一对应。确保对同一个硬盘,不在受限于一个请求队列,而是通过多个硬件队列最终下发。提高了并发性的同时让硬件的能力得到发挥。

BLOCK层代码分析(2)BLOCK MQ基本原理_第2张图片

 5 小结

        从BLOCK SQ到BLOCK MQ的变化,使BLOCK层软件框架能够适应更快的硬盘和控制器,提升了存储IO的性能。其实随着硬件的不断变化(包括硬盘和控制器),BLOCK层的框架一直也在不断变化,比如之前硬盘比较慢,于是增加IO调度层进行合并和排序,但随着SSD硬盘和NVME盘出现,在IO调度层进行合并排序不一定能起到优化的效果,反而可能浪费时间,因此又产生跳过IO调度层的需要等。

 

你可能感兴趣的:(BLOCK_SCSI,BLOCK,MQ,SQ)