1. 为什么要使用多队列

在主机中,多cpu运行多个线程,每个线程都能和文件系统交互,文件系统层也是用多线程和bio层交互,但是,块设备层只有一个队列:

在块设备层,来自多个cpu的bio请求被放在同一个队列中,造成阻塞:

因此,提出了多队列的方法,在块设备层也做成多线程:

但是,在块设备层实现多个队列并不能像文件系统一样考虑,因为块设备层需要与硬件交互,这需要硬件也支持多队列,最理想的情况是,硬件支持的队列足够多,上层的每个队列(基于软件的队列),都有硬件队列和其关联。但有些时候,硬件支持的队列有限,就形成如上图的关联关系:上图中有3个硬件队列,但是,上层总共形成了6个队列(cpu到文件系统到bio层,都是6个基于软件的队列),因此,到达块设备层时,块设备会将2个基于软件的队列和1个硬件队列关联起来。

以下是细节图:

2. 更多信息

在编程中,一般用到的变量名和blk_mq 中各部分的对应关系:

图源:https://img-blog.csdnimg.cn/20191110221335681.png

图源:https://img-blog.csdnimg.cn/20191110221243484.png

图源:https://img-blog.csdnimg.cn/2019111022505564.png

blk_mq 中的 io 流:

块设备层的io流:

因为来自上层的多个队列在块设备层被放在不同的队列中,一个需要解决的问题是:当块设备的层提交给下层设备的bio请求完成后,如何从返回的请求(complete IO)中区分其来自块设备中的哪一个队列。一种方法是使用IPI(处理器间中断处理),示意图如下:

IPI(inter-processorinterrupt)是一种特别的中断。在对称多处理器 (SMP)环境下,它可以被任意一个处理器用来对另一个处理器产生中断。IPIs典型地被用来实现高速缓存间的一致性同步(Cache Coherency Synchronization)

https://blog.csdn.net/xkjcf/article/details/7772849

另一个方法是使用一串数字来标记请求来自哪个队列,即:硬件从请求中获得 tag,请求完成后,在返回给 completion IO 池的的请求中也带上该 tag,示意图如下:

3. 使用blk_mq的效果

测试 IOPS 的结果:

可以看到,随着线程的增加,使用 blk_mq 的效果明显比没使用blk_mq的单队列好。

即使在只有一个硬件队列的情况下,增加块设备层的队列也会提升性能:

因为,当块设备层只有一个队列的时候,大部分时间都花在获取设备锁上面。

相关资料:

Linux NVMe Driver学习笔记大合集: 从NVMe驱动代码进行理解,有 blk_mq 的部分;

Multi-Queu on block layer in Linux Kernel: 从代码理解 linux 内核中的 blk_mq 的实现。

参考资料:http://events.static.linuxfound.org/sites/events/files/slides/vault-2016.pdf

blk_mq多队列块设备浅析的更多相关文章

  1. linux驱动开发之块设备学习笔记

    我的博客主要用来存放我的学习笔记,如有侵权,请与我练习,我会立刻删除.学习参考:http://www.cnblogs.com/yuanfang/archive/2010/12/24/1916231.h ...

  2. 乾坤合一~Linux设备驱动之块设备驱动

    1. 题外话 在蜕变成蝶的一系列学习当中,我们已经掌握了大部分Linux驱动的知识,在乾坤合一的分享当中,以综合实例为主要讲解,在一个月的蜕茧成蝶的学习探索当中,觉得数据结构,指针,链表等等占据了代码 ...

  3. [原] KVM 虚拟化原理探究(6)— 块设备IO虚拟化

    KVM 虚拟化原理探究(6)- 块设备IO虚拟化 标签(空格分隔): KVM [toc] 块设备IO虚拟化简介 上一篇文章讲到了网络IO虚拟化,作为另外一个重要的虚拟化资源,块设备IO的虚拟化也是同样 ...

  4. 嵌入式Linux驱动学习之路(二十一)字符设备驱动程序总结和块设备驱动程序的引入

    字符设备驱动程序 应用程序是调用C库中的open read write等函数.而为了操作硬件,所以引入了驱动模块. 构建一个简单的驱动,有一下步骤. 1. 创建file_operations 2. 申 ...

  5. linux块设备驱动之实例

    1.注册:向内核注册个块设备驱动,其实就是用主设备号告诉内核这个代表块设备驱动 sbull_major  =  register_blkdev(sbull_major, "sbull&quo ...

  6. Smart210学习记录------块设备

    转自:http://bbs.chinaunix.net/thread-2017377-1-1.html 本章的目的用尽可能最简单的方法写出一个能用的块设备驱动.所谓的能用,是指我们可以对这个驱动生成的 ...

  7. linux下的块设备驱动(一)

    块设备的驱动比字符设备的难,这是因为块设备的驱动和内核的联系进一步增大,但是同时块设备的访问的几个基本结构和字符还是有相似之处的. 有一句话必须记住:对于存储设备(硬盘~~带有机械的操作)而言,调整读 ...

  8. Linux 块设备驱动 (二)

    linux下Ramdisk驱动 1 什么是Ramdisk Ramdisk是一种模拟磁盘,其数据实际上是存储在RAM中,它使用一部分内存空间来模拟出一个磁盘设备,并以块设备的方式来组织和访问这片内存.对 ...

  9. Linux 块设备驱动 (一)

    1.块设备的I/O操作特点 字符设备与块设备的区别: 块设备只能以块为单位接受输入和返回输出,而字符设备则以字符为单位. 块设备对于I/O请求有对应的缓冲区,因此它们可以选择以什么顺序进行响应,字符设 ...

  10. linux下的块设备驱动(二)

    上一章主要讲了请求队列的一系列问题.下面主要说一下请求函数.首先来说一下硬盘类块设备的请求函数. 请求函数可以在没有完成请求队列的中的所有请求的情况下就返回,也可以在一个请求都不完成的情况下就返回. ...

随机推荐

  1. uni-app路由跳转

    navigateTo redirectTo (1)保留当前页面,跳转到应用内的某个页面,使用uni.navigateBack可以返回到原页面 (如果A->B来回频繁切换,不要A B两个方法都使用 ...

  2. SqlServer中使用游标遍历数据集合

    具体代码如下所示: /***************************************** 实例:打印输出数据表BUS_Test中的Name和Age字段的值 ************** ...

  3. 理解ID3决策树

    决策树是一个树形结构,类似下面这样: 上图除了根节点外,有三个叶子节点和一个非叶子节点. 在解决分类问题的决策树中,叶子节点就表示所有的分类,比如这里的分类就有3种:无聊时阅读的邮件.需及时处理的邮件 ...

  4. 库卡机器人KR240电源模块维修思路讲解

    一.库卡机器人KR240电源模块故障诊断 故障诊断是维修过程中的关键步骤.使用库卡提供的诊断工具或软件,对库卡机器人KR240电源模块进行故障诊断.重点关注电源供应.输出电压.电流等关键参数.通过诊断 ...

  5. 八米云-N1、机顶盒设置静态地址和PPPOE拨号流程

    疑难解答加微信机器人,给它发:进群,会拉你进入八米交流群 机器人微信号:bamibot 简洁版教程访问:https://bbs.8miyun.cn 这里以老毛子路由系统举例: 一.设置静态地址 1.路 ...

  6. Kubernetes - [04] 常用命令

    kubectl 语法 kubectl [command] [TYPE] [NAME] [flags] command:指定在一个或多个资源商要执行的操作.例如:create.get.describe. ...

  7. 【FAQ】HarmonyOS SDK 闭源开放能力 —Map Kit(5)

    1.问题描述: 提供两套标准方案,可根据体验需求选择: 1.地图Picker(地点详情) 用户体验:①展示地图 ②标记地点 ③用户选择已安装地图应用 接入文档:https://developer.hu ...

  8. Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露

    一:背景 1. 讲故事 前面跟大家分享过一篇 C# 调用 C代码引发非托管内存泄露 的文章,这是一个故意引发的正向泄露,这一篇我们从逆向的角度去洞察引发泄露的祸根代码,这东西如果在 windows 上 ...

  9. 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异

    从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异 引言 在开发 Web 应用时,处理 HTTP 错误响应是常见的任务,尤其是在客户端代码中捕获并向用户展示错误信息.然而,当使用 HTTP ...

  10. 项目管理协作工具对比:PingCode vs Leangoo

    多语言适配能力 在全球化协作场景下,多语言支持成为跨国团队的硬性指标.PingCode目前仅支持中文界面,对于涉及多国语言协作的团队存在使用局限.对比Leangoo提供中英文双语界面切换功能,可满足基 ...