《存储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.mzph.cn/news/67434.shtml

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

相关文章

uni-app 之 v-on:click点击事件

uni-app 之 v-on:click点击事件 image.png <template><!-- vue2的<template>里必须要有一个盒子&#xff0c;不能有两个&#xff0c;这里的盒子就是 view--><view>--- v-on:click点击事件 ---<view v-on:click"onclick">{{title}}<…

Git 回顾小结

Git是一个免费开源&#xff0c;分布式的代码版本控制系统&#xff0c;版主开发团队维护代码 作用&#xff1a;记录代码内容&#xff0c;切换代码版本&#xff0c;多人开发时高校合并代码内容 Git常用命令 命令作用注意git -v查看Git版本git init初始化本地Git仓库git add 文件…

澳门服务器有哪些特点

澳门服务器是指位于澳门的服务器,具有以下特点: 地理位置优越:澳门位于珠江口西侧,靠近香港,是中国内地与香港、澳门地区重要的交通枢纽。澳门服务器因此在访问速度和延迟方面表现出色。 稳定的网络连接:澳门拥有完善的网络基础设施,包括高速稳定的互联网连接和先进的通信技术…

数据仓库的流程

数据仓库完全用统计分析框架实现:Spark,MR 但是因为实际生产环境中,需求量非常大, 如果每个需求都采用独立c代码开发方式,重复计算会很多. 提高性能的方法: 1.减少数据量 2. 减少重复计算 例如RDD cache 可以减少重复计算,但是不安全,都在缓存中, persist 都放内存中,但是慢 而…

drf之请求、drf之响应、两个视图基类、5个视图扩展类(不是视图类)、原生django,怎么写向响应头写入数据

1 drf之请求 1.1 drf 之请求Request类 # 新的request对象---》之前聊过一部分# from rest_framework.request import Request# 1 以后视图类的方法中的request都是这个类的对象 # 2 以后使用request.data 取请求体中的数据 # 3 以后使用request.query_params 取请参数中的数…

python提取邮件的附件,以excel为例

配置邮箱、读取基本的邮件内容请参考&#xff1a;python读取并解析邮箱邮件&#xff0c;读取邮件主题、内容、时间 以excel为例&#xff1a; 获取邮件&#xff1a; email_value_config {imap_server: imap.exmail.qq.com, username: xxxxxxxx.com, password: xxxxx, }# 连接…

QTday5

一、客户端 二、服务器 三、配置图像处理环境 四、XMind思维导图

vscode新建vue3文件模板

输入快捷新建的名字 enter 确认后在文件中输入以下内容 {// Place your snippets for vue here. Each snippet is defined under a snippet name and has a prefix, body and// description. The prefix is what is used to trigger the snippet and the body will be expand…

webpack5 (四)

react-cli 中配置 开发环境 const path require(path) const EslintWebpackPlugin require(eslint-webpack-plugin) const HtmlWebpackPlugin require(html-webpack-plugin) const ReactRefreshWebpackPlugin require(pmmmwh/react-refresh-webpack-plugin); //封装处理样…

Django REST framework中的序列化Serializers

序列化器允许将诸如查询集和模型实例之类的复杂数据转换为原生 Python 数据类型&#xff0c;然后可以将它们轻松地呈现为 JSON&#xff0c;XML 或其他内容类型。序列化器还提供反序列化&#xff0c;在首次验证传入数据之后&#xff0c;可以将解析的数据转换回复杂类型。 简单来…

无需租用云服务器:使用Linux本地搭建web服务并实现内网穿透发布公网访问的详细教程

文章目录 前言1. 本地搭建web站点2. 测试局域网访问3. 公开本地web网站3.1 安装cpolar内网穿透3.2 创建http隧道&#xff0c;指向本地80端口3.3 配置后台服务 4. 配置固定二级子域名5. 测试使用固定二级子域名访问本地web站点 前言 在web项目中,部署的web站点需要被外部访问,则…

NoSQL:非关系型数据库分类

NoSQL&#xff0c;全称 Not Only SQL&#xff0c;意为不仅仅是 SQL&#xff0c;泛指非关系型数据库。NoSQL 是基于键值对的&#xff0c;而且不需要经过 SQL 层的解析&#xff0c;数据之间没有耦合性&#xff0c;性能非常高。 非关系型数据库又可细分如下&#xff1a; 键值存储…

前端自动化部署,Devops,CI/CD

DevOps 提到 Jenkins&#xff0c;想到的第一个概念就是 CI/CD 在这之前应该再了解一个概念。 DevOps Development 和 Operations 的组合&#xff0c;是一种方法论&#xff0c;并不特指某种技术或者工具。DevOps 是一种重视 Dev 开发人员和 Ops 运维人员之间沟通、协作的流程。…

前端包管理器:深入理解npm和yarn

引言 前端开发者们都知道&#xff0c;包管理器是我们日常开发中不可或缺的工具。在本文中&#xff0c;我们将深入探讨两个最常用的前端包管理器&#xff1a;npm (Node Package Manager) 和 Yarn。我们将通过一步步的操作&#xff0c;详细解释如何使用这两种工具&#xff0c;以…

Java on VS Code 8月更新|反编译器用户体验优化、新 Maven 项目工作流、代码高亮稳定性提升

作者&#xff1a;Nick Zhu 排版&#xff1a;Alan Wang 大家好&#xff0c;欢迎来到 Visual Studio Code for Java 的 8 月更新&#xff01;在这篇博客中&#xff0c;我们将为您提供有关反编译器支持的更多改进。此外&#xff0c;我们将展示如何创建没有原型的 Maven 项目以及一…

TensorFlow是什么

TensorFlow是一个开源的深度学习框架&#xff0c;由Google开发&#xff0c;用于构建和训练神经网络。它提供了一种简单而灵活的方法来构建各种类型的机器学习模型&#xff0c;包括卷积神经网络、循环神经网络、深度神经网络等。TensorFlow使用图和张量的概念来描述计算流程。 …

【C语言】字符函数,字符串函数,内存函数

大家好&#xff01;今天我们来学习C语言中的字符函数&#xff0c;字符串函数和内存函数。 目录 1. 字符函数 1.1 字符分类函数 1.2 字符转换函数 1.2.1 tolower&#xff08;将大写字母转化为小写字母&#xff09; 1.2.2 toupper&#xff08;将小写字母转化为大写字母&…

SpringMVC之入门

目录 1.SpringMVC工作流程 2.SpringMVC核心组件 2.1 DispatcherServlet 2.2 HandlerMapping 2.3 Handler 2.4 HandlerAdapter 2.5 ViewResolver 2.6 View 3.SpringMVC的入门 3.1 添加相关依赖 3.2 创建Spring-mvc.xml 3.3 配置web.xml 3.4 效果演示 4.静态资源处…

ios 运行ipa包 日志查看方式

方法一&#xff1a; 使用ideviceinstaller工具 # 安装ipa命令 brew install ideviceinstaller ideviceinstaller -i xxx.ipa# 查看运行日志 idevicesyslog# idevicesyslog 查找命令 idevicesyslog | grep test -A 3 -B 2 # 输出关键字所在行后3行&#xff0c;前2行) idevic…

每日一道面试题之什么是上下文切换?

上下文切换是指在计算机操作系统中&#xff0c;当多个进程或线程同时运行时&#xff0c;系统需要将当前运行进程或线程的状态&#xff08;包括程序计数器、寄存器值、内存映像等&#xff09;保存起来&#xff0c;然后切换到另一个进程或线程继续执行的过程。上下文切换通常由操…