《存储IO路径》专题:块设备层多队列blk-mq架构

我们想象一下,你是一个餐厅的厨师,你要准备很多不同的菜肴,而每种菜肴需要不同的食材和烹饪时间。如果每道菜都按照需要的顺序来准备,那么你的工作效率一定会非常低。为了提高效率,你会怎么做呢?

在linux架构中,Multi-Queue Block Layer就像是一个聪明的餐厅管理员,它可以让厨师们同时处理多个订单,而不用等待前面的订单完成。这个机制在Linux内核中实现了多个I/O调度队列,每个队列处理特定类型的I/O操作。这样,当一个进程发出I/O请求时,Multi-Queue Block Layer可以将请求分配到对应的队列中,让I/O操作并行执行,大大提高了系统的性能。

在Linux中,blk-mq架构是block layer的一种改进,它通过支持多个I/O调度队列来提高系统的并发性和响应性。Multi-Queue Block Layer在内核版本3.14之后引入,并在后续版本中得到了进一步的发展和完善。

在blk-mq架构中,每个块设备都维护了多个I/O调度队列,每个队列对应于一个特定的优先级。当系统接收到I/O请求时,根据请求的优先级将其分配到对应的队列中。每个队列都采用自己的I/O调度策略,比如先进先出(FIFO)、最短作业优先(SFS)等。这种机制可以使得不同优先级的I/O请求能够得到更好的处理和响应。

下面是一个简单的示例代码,展示了Multi-Queue Block Layer的基本原理:

#include <linux/blkdev.h>  /* 初始化块设备 */  
struct gendisk *disk;  /* 初始化块设备分区 */  
struct hd_struct *part;  /* 初始化块设备请求队列 */  
struct request_queue *queue;  /* 初始化块设备I/O调度器 */  
struct elevator_type *elevator;  /* 初始化I/O调度参数 */  
elevator_param_t elevator_params[];  /* 初始化I/O调度队列 */  
struct blk_queue_layer queue_layer;  /* 分配I/O调度队列 */  
queue_init_queue(&queue_layer, disk, part, queue, elevator, elevator_params);

在上述代码中,我们首先初始化了块设备、分区、请求队列和I/O调度器等组件。然后,我们通过调用queue_init_queue函数来初始化一个blk_queue_layer结构体,该结构体表示一个I/O调度队列层。该函数接受多个参数,包括块设备、分区、请求队列、I/O调度器和I/O调度参数等。在函数内部,会根据指定的参数创建一个新的I/O调度队列,并将其添加到对应的块设备的I/O调度队列层中。

在传统的Linux系统中,块设备层和IO调度器主要是针对HDD(hard disk drivers)设计的。由于HDD设备的随机IO性能很差,吞吐量大约是几百IOPS(IOs per second),延迟在毫秒级,所以当时IO性能的瓶颈在硬件,而不是内核。但是,随着高速SSD(Solid State Disk)的出现并展现出越来越高的性能,百万级甚至千万级IOPS的数据访问已成为一大趋势,传统的块设备层已无法满足这么高的IOPS需求,逐渐成为系统IO性能的瓶颈。为了适配现代存设备(高速SSD等)高IOPS、低延迟的IO特征,新的块设备层框架Block multi-queue(blk-mq)应运而生。

  • Multi-Queue Block Layer分为两层,Software Queues和Hardware Dispatch Queues.
  • Softeware Queues是per core的,Queue的数目与协议有关系,比如NVMe协议,可以有最多64K对 IO SQ/CQ。Software Queues层做的事情如上图标识部分。
  • Hardware Queues数目由底层设备驱动决定,可以1个或者多个。最大支持数目一般会与MSI-X中断最大数目一样,支持2K。设备驱动通过map_queue维护Software Queues和Hardware Queues之间的对接关系。
  • 需要强调一点,Hardware Queues与Software Queues的数目不一定相等,上图1:1 Mapping的情况属于最理想的情况。

在实际应用中,blk-mq架构可以显著地提高系统的并发性和响应性。通过支持多个I/O调度队列,它可以更好地处理不同优先级的I/O请求,并根据不同的I/O负载情况和系统配置进行调优和优化,以获得更好的性能和响应性。

blk-mq的映射关系是指将软件队列(software queue)映射到硬件派发队列(hardware dispatch queue)的机制。这种映射关系是通过固定的映射关系来实现的。

在blk-mq架构中,每个硬件队列都对应一个或多个软件队列,这个对应关系是在驱动初始化时通过配置来设定的。通常情况下,每个硬件队列会对应多个软件队列,这种映射关系可以避免请求队列锁竞争和远端内存访问问题,从而提高Block Layer的IOPS吞吐量。

当用例空间向块设备执行IO操作时,BLK-MQ会存储和管理这些IO请求,并在用户空间、文件系统和块设备驱动程序之间扮演中间件的角色。BLK-MQ通过软件阶段队列和硬件分配队列来实现请求的调度和管理。当请求到达块设备层时,它将会尝试最短路径,即直接发送到硬件队列。

然而,存在两种情况不会这样做:

一是存在IO调度器则不能这样做;

二是如果我们想让请求合并也不行这样做。

这两个情况下请求将会被发送到软件队列。在软件队列中的请求处理之后,它将被放到硬件队列,后面即是硬件直接访问硬件处理这些请求。

blk-mq的映射关系解决了blk-sq架构中请求队列锁竞争和远端内存访问问题,极大的提高了Block Layer的IOPS吞吐量。同时,通过将软件队列映射到硬件派发队列,可以更好地处理不同优先级的I/O请求,并根据不同的I/O负载情况和系统配置进行调优和优化,以获得更好的性能和响应性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/129704.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SSM的家政服务网站

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

windows 下载安装 mysql

windows 下载安装 mysql 官网地址&#xff1a;https://dev.mysql.com/ 下载地址&#xff1a;https://cdn.mysql.com//Downloads/MySQLInstaller/mysql-installer-community-8.0.34.0.msi 点击 Downloads 点击 MySQL Community (GPL) Downloads 点击 MySQL Installer for Window…

usb学习笔记

框架 usb 驱动是基于usb core 的&#xff0c;设备插上之后&#xff0c;host 层自然会进行识别&#xff0c;设备驱动通过core层的接口操作设备&#xff0c;而不用直接面对usb硬件。对于应用层需要封装成一个usb 的设备。 驱动是基于urb 数据进行操作的。 49 static void usb_mo…

Windows环境下Springboot3+Graalvm+Idea 打包成原生镜像 踩坑

https://github.com/oracle/graal/https://github.com/graalvm/graalvm-ce-builds/releases/对应关系graalvm-ce-java17-windows-amd64-X.X.X.zipnative-image-installable-svm-java17-windows-amd64-X.X.X.jar本人使用:graalvm-ce-java17-windows-amd64-23.0.1.zipnative-imag…

第4章_瑞萨MCU零基础入门系列教程之瑞萨 MCU 源码设计规范

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取&#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总&#xff1a; ht…

【C++11】{}初始化、std::initializer_list、decltype、STL新增容器

文章目录 1. C11简介2. 统一的列表初始化2.1 &#xff5b;&#xff5d;初始化2.2 std::initializer_list 3. 声明3.1 auto3.2 decltype 4. nullptr5. 范围for循环6. 智能指针7. C11STL中的一些变化8. 演示代码 1. C11简介 在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1…

英语单词(1)

1.void:空的 2.main:主要的 3.class:类 4.system:系统 5.out: 输出 6.print:打印 7.public:公共的,公用的 8.static:静态的,静止的 9.oracle:甲骨文公司 10.eclipse: java编程语言

生存游戏手游推荐,适合长期玩的生存类手游

今天小编为大家带来了生存游戏手游推荐&#xff0c;适合长期玩的生存类手游。许多朋友现在喜欢冒险&#xff0c;想体验荒野生活&#xff0c;但在现实中&#xff0c;由于各种原因可能实现不了。游戏中的生存可以满足玩家对狂野生存的幻想&#xff0c;让现实中未实现的梦想在虚拟…

element-ui switch开关组件二次封装,添加loading效果,点击时调用接口后改变状态

先看效果&#xff1a; element-ui中的switch开关无loading属性&#xff08;在element-plus时加入了&#xff09;&#xff0c;而且点击时开关状态就会切换&#xff0c;这使得在需要调用接口后再改变开关状态变得比较麻烦。 思路&#xff1a;switch开关外包一层div&#xff0c;给…

大学生网页设计制作作业实例代码 (全网最全,建议收藏) HTML+CSS+JS

文章目录 &#x1f4da;web前端期末大作业 (1500套) 集合一、网页介绍二、网页集合 三、作品演示A电影主题B漫画主题C商城主题D家乡主题E旅游主题F餐饮/美食主题G环境主题H游戏主题I 个人主题K体育主题L博客主题M汽车主题N文化主题P美妆主题Q企业主题R教育主题S其他主题 &#…

C++在C语言基础上的优化

目录 一、命名空间 1、命名空间的定义 2、命名空间的使用 二、输入&输出 三、缺省参数 1、缺省参数的概念 2、缺省参数的分类 四、函数重载 五、引用 1.引用的概念 2.引用的特性 3、引用和指针的区别 六、内联函数 七、基于范围的for循环 一、命名空间 命名空…

穷举深搜暴搜回溯剪枝(4)

一)单词搜索: 直接在矩阵中依次找到特定字符串 79. 单词搜索 - 力扣&#xff08;LeetCode&#xff09; 画出决策树&#xff0c;只需要做一个深度优先遍历: 1)设计dfs函数:只需要关心每一层在做什么即可&#xff0c;从这个节点开始&#xff0c;开始去尝试匹配字符串的下一个字符…

使用Xshell远程访问工具连接到Linux

首先需要查看Linux地址&#xff0c;在Linux主界面中右键选择“Open in Terminal” 输入“ifconfig”指令查看IP地址 打开Xshell&#xff0c;输入相关信息&#xff0c;建立连接 点击连接&#xff0c;按照提示输入用户名 root和你自己安装centos7时设置的密码&#xff0c;用…

OpenCV_CUDA_VS编译安装

一、OpenCV 我这里是下载的OpenCV4.5.4&#xff0c;但是不知道到在vs里面build时一直报错&#xff0c;后面换了4.7.0的版本测试&#xff0c;安装成功。 Release OpenCV 4.5.4 opencv/opencv GitHub 这个里面有官方预编译好的OpenCV库&#xff0c;可以直接食用。 扩展包&am…

React 展开运算符

0x00 前言 CTF 加解密合集CTF Web合集网络安全知识库溯源相关 文中工具皆可关注 皓月当空w 公众号 发送关键字 工具 获取 0x01 展开运算符 1. 展开数组 <script type"text/javascript">let arr1 [1,3,5,7,9]let arr2 [2,4,6,8,10]console.log(...arr1)&l…

TCP IP网络编程(四) 基于TCP的服务器端、客户端

文章目录 理解TCP、UDPTCP/IP协议栈链路层IP层TCP/UDP层应用层 实现基于TCP的服务器端、客户端TCP服务器端的默认函数调用顺序进入等待连接请求状态受理客户端连接请求TCP客户端的默认函数调用顺序基于TCP的服务器端、客户端函数调用关系 实现迭代服务器端、客户端实现迭代服务…

RK3399平台开发系列讲解(内核调试篇)spidev_test工具使用

🚀返回专栏总目录 文章目录 一、环境二、执行测试三、回环测试四、字节发送测试五、32位数据发送测试沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 在 Linux 系统上,“spidev_test” 是一个用于测试和配置 SPI(Serial Peripheral Interface)设备的命令行工具。…

Java拓展--空间复杂度和时间复杂度

空间复杂度和时间复杂度 文章目录 空间复杂度和时间复杂度空间复杂度时间复杂度**评价排序算法****时间频度****什么是时间频度****忽略常数项****忽略低次项****忽略系数** **时间复杂度****什么是时间复杂度****计算时间复杂度的方法****常见的时间复杂度** **常见的时间复杂…

Weblogic(CVE-2017-10271)与 Struts2(s2-045) 反序列化漏洞复现

文章目录 Java 反序列化漏洞复现weblogic环境搭建漏洞复现 Struts2(s2-045)环境搭建漏洞复现**漏洞利用** Java 反序列化漏洞复现 weblogic Weblogic < 10.3.6 ‘wls-wsat’ XMLDecoder 反序列化漏洞&#xff08;CVE-2017-10271&#xff09; ​ Weblogic的WLS Security组…

【ARM CoreLink 系列 2 -- CCI-400 控制器简介】

文章目录 CCI-400 介绍DVM 机制介绍DVM 消息传输过程TOKEN 机制介绍 下篇文章&#xff1a;ARM CoreLink 系列 3 – CCI-550 控制器介绍 CCI-400 介绍 CCI&#xff08;Cache Coherent Interconnect&#xff09;是ARM 中 的Cache一致性控制器。 CCI-400 将 Interconnect 和coh…