当前位置: 首页 > news >正文

Linux系统块存储子系统分析记录

1 Linux存储栈

通过网址Linux Storage Stack Diagram - Thomas-Krenn-Wiki-en,可以获取多个linux内核版本下的存储栈概略图,下面是kernel-4.0的存储栈概略图:

2 存储接口、传输速度 和 协议

2.1 硬盘

                《深入浅出SSD:固态存储核心技术、原理与实战》第2版,1.4 SSD基本工作原理,表1-5

                《深入浅出SSD:固态存储核心技术、原理与实战》第2版,9.2 NVMe综述,图9-4

2.2 闪存(Flash)

2.2.1 ONFI 接口

ONFI 2.0: 133MB/s
ONFI 2.1:  166BM/s 和 200MB/s (工作模式不同则速度不同)
ONFI 3.0: 400MB/s
ONFI 4.0: 800MB/s 

                《固态存储:原理、架构与数据安全》5.5 闪存接口,1. ONFI

2.2.2 Toggle接口


Toggle DDR 2.0: 400MB/s
                《固态存储:原理、架构与数据安全》5.5 闪存接口,2. Toggle

2.3 SDIO

3 Linux块设备⼦系统

3.1 简介

本文涉及的内核源码版本是kernel-5.4

3.1.1 功能框图

                《存储技术原理分析》5.1 概述,图5-1

                《Linux设备驱动开发详解:基于最新的Linux4.0内核》13.1 块设备的I/O操作特点,图13.2

3.2 通用块层 / bio layer

3.2.1 简介

In summary, the bio layer is a thin layer that takes I/O requests in the form of bio structures and passes them directly to the appropriate make_request_fn() function.
                A block layer introduction part 1: the bio layer [LWN.net]

Linux通⽤块层提供给上层的接⼝函数是submit_bio。上层在构造好bio请求之后,调⽤submit_bio提交给Linux通⽤块层处理。
                《存储技术原理分析》5.4 请求处理过程

当内核⽂件⼦系统需要与块设备进⾏数据传输或者对块设备发送控制命令时,内核需 要向对应块设备所属的请求队列发送请求对象。这个任务由函数submit_bio来完成。
                《深⼊Linux设备驱动程序内核机制》 11.13 向队列提交请求

3.2.2 数据结构

3.3 request layer 和 I/O调度层

3.3.1 简介

接收通⽤块层发出的I/O请求,缓存请求并试图合并相邻的请求,并根据设置好的调度算法,回调驱动层提供的请求处理函数,以处理具体的I/O请求。
                《存储技术原理分析》5.1 概述

3.3.2 single queue 和 Multiple queue(blk-mq)

Traditionally, most storage devices were made up of a set of spinning circular platters with magnetic coating and a single head (or set of heads, one per platter) that moved along the radius of the spinning disk to read or change the magnetic polarization at any location on any platter. Such a device can only process a single request at a time, and has a substantial cost in moving from one location on the platters to another. The single-queue implementation started out aimed at driving this sort of device and, while it has broadened in scope over the years, its structure still reflects the needs of rotating storage devices.
                Block layer introduction part 2: the request layer [LWN.net]

blk-mq (Multi-Queue Block IO Queueing Mechanism) is a new framework for the Linux block layer that was introduced with Linux Kernel 3.13, and which has become feature-complete with Kernel 3.16.[1] Blk-mq allows for over 15 million IOPS with high-performance flash devices (e.g. PCIe SSDs) on 8-socket servers, though even single and dual socket servers also benefit considerably from blk-mq.[2] To use a device with blk-mq, the device must support the respective driver.
                Linux Multi-Queue Block IO Queueing Mechanism (blk-mq) Details - Thomas-Krenn-Wiki-en

3.3.3 数据结构: request_queue 和 request(请求描述符)

3.3.4 Request affinity

On large, multiprocessor systems, there can be a performance benefit to ensuring that all processing of a block I/O request happens on the same CPU. In particular, data associated with a given request is most likely to be found in the cache of the CPU which originated that request, so it makes sense to perform the request postprocessing on that same CPU.

设置方式
        /sys/class/block//queue/rq_affinity

If it is set to a non-zero value, CPU affinity will be turned on for that device.

                Block layer: solid-state storage, timeouts, affinity, and more [LWN.net]

3.3.5 I/O调度

3.3.6 请求处理的代码流程

3.4 块设备驱动层

3.4.1 数据结构:struct blk_mq_ops;

来自上层的request最终会通过具体存储设备驱动的queue_rq()下发到存储设备上,然后存储设备会进行处理,处理完成后,存储设备会产生一个中断通知CPU,CPU在中断处理程序中进行request的完成操作。

常见存储设备驱动的queue_rq()函数:

3.4.2 request处理超时

每个request下发给存储设备后,留给存储设备的处理时间是有限的,默认是30秒,可以通过/sys/class/block/<disk>/queue/io_timeout修改。

在queue_rq()实例函数(如scsi_queue_rq())中都会调用blk_mq_start_request(),blk_mq_start_request()内核会设置定时器

blk_mq_start_request();-> trace_block_rq_issue(q, rq);-> rq->io_start_time_ns = ktime_get_ns();-> blk_add_timer(rq);-> req->timeout = q->rq_timeout;-> expiry = jiffies + req->timeout;-> mod_timer(&q->timeout, expiry);

超时处理函数为blk_mq_timeout_work,超时时间默认为30秒,超时工作项处理函数为blk_mq_timeout_work

blk_mq_init_queue();   //申请request_queue-> blk_alloc_queue_node();-> timer_setup(&q->timeout, blk_rq_timed_out_timer, 0);-> blk_mq_init_allocated_queue();-> INIT_WORK(&q->timeout_work, blk_mq_timeout_work);-> blk_queue_rq_timeout(q, set->timeout ? set->timeout : 30 * HZ);-> q->rq_timeout = timeout;

 超时处理流程

 具体的超时处理工作留给存储设备驱动来完成。

4 不同存储设备的request处理过程

4.1 SATA、SCSI 和 SAS类存储设备

4.1.1 请求下发的流程

scsi_queue_rq();-> blk_mq_start_request();-> scsi_dispatch_cmd();-> scsi_log_send(cmd);-> scmd_printk(..., "Send: scmd 0x%p\n", cmd);-> scsi_print_command();-> host->hostt->queuecommand();

4.1.2 存储设备处理完成,产生中断,CPU处理中断的流程

在硬件中断被引发时,中断回调函数将会被调⽤,如果是对SCSI命令的响应,则将找到对应的 scsi_cmnd描述符,低层设备驱动处理完这个请求后,调⽤保存在它⾥⾯的scsi_done函数。
                《存储技术原理分析》5.6.1

在scsi_queue_rq()中,scsi_done被赋值为scsi_mq_done。

scsi_queue_rq();-> cmd->scsi_done = scsi_mq_done;

所以中断处理流程如下: 

scsi_mq_done();-> trace_scsi_dispatch_cmd_done(cmd);-> blk_mq_complete_request();-> __blk_mq_complete_request(rq);-> WRITE_ONCE(rq->state, MQ_RQ_COMPLETE);-> __blk_complete_request();-> raise_softirq_irqoff(BLOCK_SOFTIRQ);   //发出软中断

软中断BLOCK_SOFTIRQ的处理函数是blk_done_softirq 

blk_done_softirq();-> rq->q->mq_ops->complete(rq);-> scsi_softirq_done();-> scsi_decide_disposition(cmd);-> scsi_log_completion();-> scsi_print_result(cmd, "Done", disposition);-> scsi_print_command();-> scmd_printk(..., "scsi host busy %d failed %d\n", ...);-> case SUCCESS:  scsi_finish_command(cmd);-> SCSI_LOG_MLCOMPLETE( ... "Notifying upper driver of completion " ...);

4.1.3 实际的dmesg信息

打开SCSI的日志开关:echo 0xffff > /sys/module/scsi_mod/parameters/scsi_logging_level

当系统下有硬盘操作时,就会在dmesg信息里看到如下信息: 

向硬盘发送命令时的dmesg信息:
sd 2:0:0:0: [sda] tag#25 Send: scmd 0x0000000049a58ebd
sd 2:0:0:0: [sda] tag#25 CDB: Write(10) 2a 00 0a 42 60 00 00 00 40 00
......
硬盘收到命令后,对命令进行处理,处理完成后产生中断通知CPU,下面是CPU处理中断时的dmesg信息:
sd 2:0:0:0: [sda] tag#25 Done: SUCCESS Result: hostbyte=DID_OK driverbyte=DRIVER_OK
sd 2:0:0:0: [sda] tag#25 CDB: Write(10) 2a 00 0a 42 60 00 00 00 40 00
sd 2:0:0:0: [sda] tag#25 scsi host busy 1 failed 0
sd 2:0:0:0: Notifying upper driver of completion (result 0)

dmesg信息简单说明 

CDB: Command Descriptor Block 

Write(10)是SCSI的命令,含义如下:
(更多SCSI命令,请看《SCSI Commands Reference Manual》,下载链接:https://www.seagate.com/staticfiles/support/disc/manuals/scsi/100293068a.pdf)

4.2 NVMe

4.2.1 简介

当前有很多种NVMe的实现方式,例如:

  •         NVMe over PCIe
  •         NVMe over RDMA
  •         NVMe over TCP
  •         NVMe over FC

                《深⼊浅出SSD:固态存储核⼼技术、原理与实战》第2版,9.9 NVMe over Fabrics

下面以NVMe over PCIe为例,介绍request的处理流程

4.2.2 NVMe处理命令 的⼋个步骤

第⼀步,主机写命令到内存中的SQ;
第⼆步,主机写SQ的DB,通知SSD取指;
第三步,SSD收到通知后,到SQ中取指;
第四步,SSD执⾏指令;
第五步,指令执⾏完成,SSD往CQ中写指令执⾏结果;
第六步,SSD发送中断通知主机指令完成;
第七步,收到中断,主机处理CQ,查看指令完成状态;
第⼋步,主机处理完CQ中指令执⾏结果,通过DB恢复SSD。

                《深⼊浅出SSD:固态存储核⼼技术、原理与实 战》第2版,9.2 NVMe综述

4.2.3 请求(命令)下发

nvme_queue_rq();-> nvme_setup_cmd();-> trace_nvme_setup_cmd();-> blk_mq_start_request();-> nvme_submit_cmd();-> memcpy(nvmeq->sq_cmds + (nvmeq->sq_tail << nvmeq->sqes), cmd, sizeof(*cmd));    //第⼀步,主机写命令到内存中的SQ;-> nvme_write_sq_db();    //第⼆步,主机写SQ的DB,通知SSD取指

4.2.4 存储设备处理完成,产生中断,CPU处理中断的流程

nvme_irq();             //第七步,收到中断,主机处理CQ,查看指令完成状态;-> nvme_process_cq();-> nvme_ring_cq_doorbell();-> nvme_complete_cqes();-> nvme_handle_cqe();-> trace_nvme_sq();-> nvme_end_request();-> blk_mq_complete_request(req);

相关文章:

Linux系统块存储子系统分析记录

1 Linux存储栈 通过网址Linux Storage Stack Diagram - Thomas-Krenn-Wiki-en&#xff0c;可以获取多个linux内核版本下的存储栈概略图&#xff0c;下面是kernel-4.0的存储栈概略图&#xff1a; 2 存储接口、传输速度 和 协议 2.1 硬盘 《深入浅出SSD&#xff1a;固态存储核心…...

大数据——本地威胁检测的全球方法

大数据似乎是众多专业人士关注的话题&#xff0c;从在自然灾害发生时帮助挽救生命&#xff0c;到帮助营销团队设计更有针对性的策略以接触新客户。 对于安全工程师来说&#xff0c;大数据分析被证明是抵御不断演变的网络入侵的有效防御手段&#xff0c;这得益于基于大量不同网…...

使用postman接口测试

一 、postman断言 1、什么是断言 postman 断言借助JavaScript -js 语言编写代码&#xff0c;自动判断预期结果与实际结果是否一致。 断言代码写在 Tests 的标签中。(新版本在Scripts标签中) 2、断言工作原理 3、常用断言 断言响应状态码 // 断言响应状态码 是否为 200 pm.…...

Ubuntu24.04双系统安装(Linux/windows共存一文打通)

他向远方望去&#xff0c;无法看到高山背后的矮山&#xff0c;只能看到一座座更高的山峰。 目录 ​编辑 一.前言 二.虚拟机和双系统比较 三.Windows/Linux双系统安装 1.Rufus-制作U盘启动盘系统工具安装 2.Ubuntu24.04下载 3.Ubuntu-u盘启动盘制作 4.压缩磁盘留足安装空…...

C++ - deque

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【C】 欢迎点赞&#x1f44d;收藏⭐关注❤️ 文章目录 &#x1f4a1;双端队列简介1. 基本特性2. 与其他容器的比较与 vector与 list 3. 中控数组的设计4. 优缺点优点缺点 5. 应用场景6. 结论 &#x1f4a1;双端队列简…...

国产!瑞芯微米尔RK357核心板革新AIoT设备,8核6T高算力

随着科技的快速发展&#xff0c;AIoT智能终端对嵌入式模块的末端计算能力、数据处理能力等要求日益提高。近日&#xff0c;米尔电子发布了一款基于瑞芯微RK3576核心板和开发板。核心板提供4GB/8GB LPDDR4X、32GB/64GB eMMC等多个型号供选择。瑞芯微RK3576核心优势主要包括高性能…...

中国人寿财险青岛市分公司践行绿色金融,助力可持续发展

中国人寿财险青岛市分公司积极响应国家绿色发展战略&#xff0c;大力推进绿色金融实践。在保险产品创新方面&#xff0c;推出一系列绿色保险产品。如新能源汽车保险&#xff0c;为新能源汽车产业发展提供风险保障&#xff0c;促进交通领域的节能减排。环境污染责任保险则助力企…...

ajax 读取文件

DOMException: Failed to read the responseXML property from XMLHttpRequest: The value is only accessible if the objects responseType is or document (was blob). at XMLHttpRequest.r ( $.ajax({ url: 未来之窗_服务, method: GET, …...

火语言RPA流程组件介绍--开始监听网络请求

&#x1f6a9;【组件功能】&#xff1a;开始监听内置浏览器网络请求&#xff08;提示&#xff1a;本组件仅适用于火语言内置浏览器&#xff09; 配置预览 配置说明 匹配网址 可以添加一个或者多个匹配规则用于筛选需要保存的网络请求. 输入输出 输入类型 万能对象类型(Sy…...

CSS综合案例——新闻详情

一、知识点 1、文字颜色 属性名&#xff1a;color 属性值&#xff1a; 颜色表示方式属性值说明使用场景颜色关键字颜色英文单词red,green,blue学习测试rgb表示法rg(r,g,b)r,g,b表示红绿蓝三原色&#xff0c;取值0-255了解rgba表示法rgba(r,g,b,a)a表示透明度&#xff0c;取…...

【【自动驾驶】车辆运动学模型】

【自动驾驶】车辆运动学模型 1. 引言2. 以车辆重心为中心的单车模型2.1 模型介绍2.2 滑移角 β \beta β 的推导2.2 航向角 ψ \psi ψ推导过程&#xff1a;2.3 滑移角 β \beta β2.3 Python代码实现2.4 C代码实现 3. 前轮驱动的单车模型3.1 模型介绍3.3 Python代码实现3.4 …...

叉尖避障新科技:因泰立科技ILS-T52三维深度成像激光雷达

ILS-T52三维深度成像激光雷达是一款高性能的纯固态式激光雷达&#xff0c;采用激光时间飞行法&#xff0c;提供出色的三维图像成像和深度感知功能。特别适用于无人叉车领域&#xff0c;为叉尖避障提供卓越的三维成像和深度感知功能。它的高精度、自适应自动曝光、小尺寸、低功耗…...

精华帖分享 | 低估值还能涨多久?

本文来源于量化小论坛策略分享会板块精华帖&#xff0c;作者为亮子&#xff0c;发布于2024年3月19日。 这两年&#xff0c;A股给我们的感觉就是成长股坍塌&#xff0c;高股息低估值的股票扛起大旗。表现出来就是中国神华、中海油这样的垄断型央国企大涨&#xff0c;包括移动联通…...

如何制作一个自己的网站?

在今天的互联网时代&#xff0c;网站展示已经是一个很基础的营销工具。不管是企业、还是个人&#xff0c;如何制作一个自己的网站&#xff1f;本文将会提供一个全面的基础制作网页教程&#xff0c;教你如何从零开始制作网页。 网页制作的基础知识&#xff1a;HTML、CSS和JavaS…...

torch报错

The Kernel crashed while executing code in the current cell or a previous cell. Please review the code in the cell(s) to identify a possible cause of the failure. Click here for more info. View Jupyter log for further details. 从日志中可以看出&#xff0c;内…...

深入探索卷积神经网络(CNN):图像分类的利器

深入探索卷积神经网络&#xff08;CNN&#xff09;&#xff1a;图像分类的利器 前言CNN的崛起&#xff1a;为何我们需要它&#xff1f;图像卷积&#xff1a;CNN的基石轮廓过滤器&#xff1a;捕捉边缘特征 图像池化&#xff1a;降低维度的利器CNN的组成&#xff1a;卷积层、池化…...

网站建设中需要注意哪些安全问题?----雷池社区版

服务器与应用安全指南 1. 服务器安全 1.1 操作系统安全 及时更新补丁&#xff1a;确保操作系统始终安装最新补丁&#xff0c;以防范系统漏洞。例如&#xff0c;Windows Server 定期推送安全更新&#xff0c;修复如远程代码执行等潜在威胁。优化系统服务配置&#xff1a;关闭不…...

光控资本:养老金融建设提速 高速铜缆市场空间广阔

养老金融制作提速 金融监管总局办公厅近来印发的《关于大力展开商业保险年金有关事项的奉告》&#xff08;下称《奉告》&#xff09;提出&#xff0c;进一步扩大商业养老金业务试点&#xff1b;开发习惯个人养老金准则的新产品和专属产品&#xff1b;保险公司要坚持长期出资、…...

部署前后端分离若依项目--CentOS7宝塔版

准备&#xff1a; CentOS7服务器一台 通过网盘分享的文件&#xff1a;CentOS 7 h 链接: https://pan.baidu.com/s/17DF8eRSSDuj9VeqselGa_Q 提取码: s7x4 大家有需要可以下载这个&#xff0c;密码61 若依前端编译后文件 通过网盘分享的文件&#xff1a;ruoyi-admin.jar 链…...

ubuntu22.04 R Rstudio conda python 深大

一、配置IP network:version: 2renderer: networkdethernets:eth0:dhcp4: noaddresses:- 172.20.0.52/24gateway4: 172.20.0.2nameservers:addresses: [8.8.8.8, 8.8.4.4] 二、update apt update apt upgrade 三、安装python ubuntu 22.04安装python3 在Ubuntu 22.04上安装…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...