SPDK源码剖析一hello_world程序

news2024/12/24 0:13:50

SPDK初识之hello_world程序分析

首先是hello_world程序整体框架分析
在这里插入图片描述

int main(int argc, char **argv)
{
    
    rc = parse_args(argc, argv, &opts);
     
    if (spdk_env_init(&opts) < 0) {  // spdk环境初始化,最终调用dpdk环境初始化
    }

    // 扫描设备,将驱动和设备绑定,调用回调函数`probe_cb`和`attach_cb`
    rc = spdk_nvme_probe(&g_trid, NULL, probe_cb, attach_cb, NULL); 

    hello_world(); // IO qpair创建、nvme的读写
    cleanup();  

    return rc;
}

初始化SPDK环境

int spdk_env_init(const struct spdk_env_opts *opts)

函数 spdk_env_init 用于初始化SPDK环境,它接受一个指向 spdk_env_opts 结构体的指针作为参数。这个结构体包含了SPDK环境配置的各种选项。在调用 spdk_env_init 之前,通常需要先通过 spdk_env_opts_init 函数来初始化这个结构体,设置一些基本的配置选项。
最终调用DPDK的接口rte_eal_init来完成SPDK环境的初始化。

扫描设备

SPDK对于传输使用的协议或者总线虚拟化成一个transport,主要包含PCIE、TCP、Fabric、RDMA等类型。
SPDK对设备的管理类似Linux的设备驱动模型:包含总线、设备、驱动三个部分。
SPDK先后注册总线、驱动和transport。
之后提供了两个回调接口。

两个回调接口

probe_cb:
probe_cb 是在SPDK发现新的NVMe控制器后调用的回调函数。
在hello_world示例中,当SPDK发现一个新的NVMe控制器时,它仅打印了一条日志消息来确认控制器的发现。

attach_cb:
attach_cb 是在NVMe控制器成功连接到用户空间驱动程序后调用的回调函数。
在hello_world示例中,attach_cb 做了两件事情:
将初始化好的NVMe控制器添加到全局控制器列表 g_controllers 中,以便SPDK可以跟踪和管理所有已发现的控制器。
将命名空间(Namespace,NS)注册到控制器中。在NVMe中,命名空间是逻辑存储单元,它包含存储设备上的数据。注册命名空间意味着SPDK可以开始对它进行操作。

Qpair

首先明白SPDK中的关键概念:提交队列(Submission Queue)和完成队列(Completion Queue)
在NVMe(非易失性内存表达)协议中,SQ和CQ是两个关键的概念,用于管理NVMe设备上的I/O(输入/输出)操作。

SQ: SQ是NVMe设备上的一个队列,用于存放待处理的I/O请求。 主机(HOST)将I/O请求打包成命令,并放入SQ中。 NVMe子系统会从SQ中读取命令,并处理这些I/O请求。

CQ: CQ是NVMe设备上的另一个队列,用于存放处理完成的I/O请求。当NVMe子系统完成一个I/O请求时,它会生成一个完成命令,并将其放入CQ中。 主机从CQ中读取完成命令,以确认I/O操作的成功或失败。

在NVMe协议中,SQ和CQ的个数并没有要求一一对应。也就是说,一个SQ可以对应多个CQ,或者一个CQ可以对应多个SQ。这种设计增加了系统的灵活性,可以根据具体需求配置SQ和CQ的数量。

然而,在SPDK中,SQ和CQ通常是一一对应的,并且都包含在一个名为“qpair”的结构中。这种做法简化了SPDK的编程模型,使得开发者可以更容易地管理和同步I/O请求的提交和完成

QPair是SPDK(Storage Performance Development Kit)中的一种结构,用于管理NVMe(非易失性内存表达)设备的I/O操作。如下图所示:
在这里插入图片描述
QPair包括两个主要部分:SQ(Submission Queue,提交队列)和CQ(Completion Queue,完成队列)。
为了更有效地管理请求对象,每个QPair都会包含一个free_req对象池,用于缓存nvme_request对象实例。同时,还会包含一个free_tr对象池,用于缓存nvme_tracker对象,每个对象都关联一个cmdId(命令标识),以跟踪每个请求的执行情况。当请求完成时,相应的回调会被触发。

nvme_request对象内部主要维护了spdk_nvme_cmd数据结构,由于SQ和CQ使用不同的物理内存空间,因此在提交命令时需要进行一次数据拷贝。

对于执行失败的请求,QPair不会直接丢弃它们,而是先加入到queued_req队列中,以便后续进行重试处理。当queued_req队列不为空时,新的请求会先提交到这个队列中,确保之前失败的请求先得到处理。

在SPDK中,每个QPair(队列对)会绑定两个Doorbell寄存器,每个寄存器占用4个字节的空间。这些寄存器用于通知NVMe控制器关于I/O操作的状态,并且基于基于MMIO(内存映射I/O)方式更新。具体来说:
第一个Doorbell寄存器用于告知NVMe控制器,提交队列(SQ)中新的I/O命令已准备好执行。
第二个Doorbell寄存器用于通知NVMe控制器,完成队列(CQ)中I/O命令的执行状态已更新。

IO处理

创建IO qpair

创建IO qpair时先创建CQ再创建SQ。

IO读写

SPDK的命令在执行前,每个命令都会附带一个完成后的回调函数。这意味着一旦命令完成并收到对应的完成队列条目(CQE),就会触发这个回调函数。
因此,Hello_world示例利用了这一特性,实现了先写入数据再读取的操作流程。在发送写命令时,它定义了一个回调函数write_complete,并在该函数内部执行了NVMe的读操作,在发送读命令时,定义一个回调函数read_complete,在该函数内部打印数据,并将sequence.is_completed标志设置为1。

在Hello_world函数里,主程序一个while死循环,在循环体内周期性地调用spdk_nvme_qpair_process_completions() 函数。
这个函数会检查NVMe设备的完成队列(CQ),以确定是否有新的完成事件(CQEs)到达。
如果CQ中有新的完成事件,函数会处理这些事件,并调用相应的回调函数。在Hello_world示例中回调函数将sequence.is_completed标志位设置为1,于是死循环退出

//轮询I/O队列对,等待写操作完成
		while (!sequence.is_completed) {
			spdk_nvme_qpair_process_completions(ns_entry->qpair, 0);
		}

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

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

相关文章

KEEPALIVED高可用集群最详解

目录 一、高可用集群 1.1 集群的类型 1.2 实现高可用 1.3 VRRP&#xff1a;Virtual Router Redundancy Protocol 1.3.1 VRRP相关术语 1.5.2 VRRP 相关技术 二、部署KEEPALIVED 2.1 keepalived 简介 2.2 Keepalived 架构 2.3 Keepalived 环境准备 2.3.1 实验环境 2…

酒店民宿小程序开发,提升用户体验,增加收益

近年来&#xff0c;我国旅游业蓬勃发展&#xff0c;推动了酒店民宿的快速发展。目前&#xff0c;酒店行业也结合数字化模式打造出了线上酒店民宿预订小程序。 随着网络时代的到来&#xff0c;大红都开始热衷于在手机上完成各种消费&#xff0c;酒店民宿小程序的开发也顺应了时…

1.1 数据库的定义与作用

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 工&#x1f497;重&#x1f497;hao&#x1f497;&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题.…

Linux服务器:Samba配置

Window配置 安装协议 首先确认自己的电脑有误安装SMB协议&#xff0c;安装方法&#xff1a;控制面板→程序功能 然后选择左侧的安装或关闭Window功能 安装就好了。 修改工作组 然后就是记住、或者修改Window账户所在组了 右键我的电脑属性&#xff0c;去找电脑的工作组&am…

【信创】双系统下删除Windows只保留麒麟系统

原文链接&#xff1a;【信创】双系统下删除Windows只保留麒麟系统 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于在双系统环境下删除Windows操作系统并只保留麒麟系统的文章。在双系统环境中&#xff0c;如果你决定完全转向麒麟系统&#xff0c;删除Windows系统…

BayesPrism 增速 400 倍?!免疫反卷积算法 InstaPrism

生信碱移 BayesPrism 加速 计算细胞类型去卷积是一种重要的分析技术&#xff0c;用于模拟整体基因表达数据的成分异质性。之前小编给大家介绍过一篇子刊文章&#xff0c;其综合比较了多种细胞去卷积算法&#xff08;图1&#xff09;。研究的结果显示&#xff0c;BayesPrism 作…

文献解读-肿瘤测序-第二十八期|《基于Palbociclib的高通量联合药物筛选确定了HPV阴性头颈部鳞状细胞癌的协同治疗选择》

关键词&#xff1a;肿瘤测序&#xff1b;基因测序&#xff1b;变异检测&#xff1b; 文献简介 标题&#xff08;英文&#xff09;&#xff1a;Palbociclib-based high-throughput combination drug screening identifies synergistic therapeutic options in HPV-negative hea…

HTML中的<fieldset>标签元素框的使用

HTML 提供的 <fieldset> 标签用于在表单中分组相关元素。 <fieldset> 标签会在相关元素周围绘制一个框。 <legend> 标签为 fieldset 元素定义标题。 语法如下&#xff1a; <fieldset><legend>标题</legend><!-- 元素内容... -->…

C++第三十六弹---二叉搜索树的性能飞跃:AVL树原理与实现

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1 AVL 树 1.1 AVL树的概念 1.2 AVL树节点的定义 1.3 AVL树的插入 1.4 AVL树的旋转 1.5 AVL树的验证 1 AVL 树 1.1 AVL树的概念 二叉搜索树虽…

韩顺平Java-第十九章:IO流

一 文件 文件是保存数据的地方。 1 文件流 文件在程序中是以流的形式来操作的。 流&#xff1a;数据在数据源&#xff08;文件&#xff09;和程序&#xff08;内存&#xff09;之间经历的路径&#xff1b; 输入流&#xff1a;数据从数据源&#xff08;文件&#xff09;到程…

深度解析 MetaArena 游戏引擎,如何让 GameFi 应用更具生命力?

从去年下边年 Friend.tech 引发的新一轮社交热&#xff0c;到去年年底铭文赛道高潮不断&#xff0c;加密市场情绪不断被点燃。但事实上&#xff0c;链游板块在最近几轮热潮中显得有些冷清&#xff0c;无论是彼时的 GameFi 龙头 Axie Infinity&#xff0c;还是在上一轮 GameFi 热…

PHP微信V3支付完整版:实现与微信退款回调 总结

一、在微信商户平台注册账号并完成相关设置&#xff0c;获取到商户号和API密钥。同时&#xff0c;下载并安装官方提供的PHP SDK。 二、发起支付 使用SDK发起支付请求相对简单。首先&#xff0c;创建一个UnifiedOrder对象&#xff0c;然后设置订单的相关信息&#xff0c;如商品…

【HeadFirst 设计模式】装饰者模式的C++实现

一、案例背景 Starbuzz是以扩张速度最快而闻名的咖啡连锁店。如果你在街角看到它的店&#xff0c;在对面街上肯定还会看到另一家。因为扩张速度实在太快了&#xff0c;他们准备更新订单系统&#xff0c;以合乎他们的饮料供应要求。他们原先的类设计是这样的…… 购买咖啡时&am…

HTTP/1.1

目录 一、比较HTTP/1.0的优点 二、请求报文 1.请求报文 &#xff08;1&#xff09;格式 2.get请求 &#xff08;1&#xff09;请求行 &#xff08;2&#xff09;请求头 &#xff08;3&#xff09;请求体 3.post请求 &#xff08;1&#xff09;请求行 &#xff08;2&…

LLM - 微调(Fine-Tuning) Llama3 以及合并微调模型 教程

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/141218047 在微调 Llama3 大模型时&#xff0c;需要注意一些事项&#xff1a; 合适的预训练模型&#xff1a;不同的预训练模型具有不同的特点和适…

Selenium WebDriver 的 Microsoft Edge 驱动程序【附代码】

1、从 Microsoft Edge 驱动程序的官方网站下载与浏览器版本相匹配的驱动程序。 https://msedgewebdriverstorage.z22.web.core.windows.net/https://msedgewebdriverstorage.z22.web.core.windows.net/ 2、指向驱动程序&#xff08;msedgedriver.exe&#xff09;的路径 serv…

Datawhale X魔搭AI夏令营 AIGC方向Task01学习笔记

目录 一、开通PAL-DSW适用 二、报名可图Kolors-LoRA风格故事挑战赛 三、创建PAL实例 四、跑baseline 五、结果上传魔塔 六、关闭PAL 小白&#xff0c;刚跑通Baseline&#xff0c;初步了解了竞赛。 Datawhale官方的速通教程链接&#xff1a;Task 1 从零入门AI生图原理&am…

利用Matlab实现【图论】中的图

目录 前言 一、图论是什么&#xff1f; 1.基本概念 2.表达形式 二、使用matlab作图 1.作无向图 2.作有向图 总结 前言 本文将讲解如何使用matlab中的函数实现最短路径算法&#xff0c;所提供代码仅供参考&#xff0c;严禁用于数模比赛中使用&#xff01; 一、图论是什么&#…

Linux:进程管理,任务管理,监控系统

1&#xff0c;任务管理 从前台丢到后台&#xff1a;【ctrl】 z&#xff0c;如果正在使用vim&#xff0c;突然想干其他事情&#xff0c;但又不想关闭vim&#xff0c;只需要暂时将vim丢到后台等待即可&#xff08;暂停&#xff09;。 查看后台任务状态&#xff1a;jobs&#xff0…

许多人在网络上“裸奔”,你信吗?

现在网络的热议话题之一&#xff0c;是近年来不仅网络诈骗、电信诈骗比比皆是&#xff0c;而更加让人恐怖的是仅只一个QQ号码就可以查出你所有的个人信息。 ​在时下&#xff0c;我国个人隐私泄漏的现象比比皆是&#xff0c;而且不只是仅几大社交平台才存在着严重的漏洞。早前…