出自:https://www.thomas-krenn.com/de/wikiDE/images/e/e0/Linux-storage-stack-diagram_v4.10.png
一、block层
block层在加入了blk-mq之后,发生了很大的变化。由于blk-mq的加入,在smp中能够有效利用多硬件队列的储存设备的高并发特性,之前io performance瓶颈在于储存设备,随着pci-e ssd的出现,瓶颈转移到了linux kernel中,kernel中由于存在锁的争用,导致开销非常大,严重影响了io performance,具体可以参考:https://lwn.net/Articles/552904/和http://kernel.dk/blk-mq.pdf。blk-mq通过多软件队列解决了这个问题:每个cpu(非ht出来的cpu)分配一个软件队列,同时每个软件队列对应一个block层硬件队列(block层的概念),block层硬件队列再map到存储外设的硬件dispatch队列。这样的话,就消除了锁的争用,提高performance。
随着blk-mq的加入,对kernel代码的影响主要是3个方面:1)nvme等block下层驱动可以进行简化。一些功能可以替换成blk-mq层的实现,比如软件队列到硬件队列的map,trequest分配时使用的tag的维护。2)block层上层使用block层api方式发生改变。通过blk_mq_make_request进入到blk-mq进行bio的处理,同时也绕过了io schduler。3)block层本身的变化。主要包括blk-mq io scheduler的加入,dm和multi path的修改。
二、