​使用SPDK lib搭建自己的NVMe-oF Target应用​

news2024/7/4 5:50:23

一. 背景

NVMe是一种抽象的传输协议层,旨在提供可靠的NVMe命令和数据传输。NVMe over Fabric (NVMe-oF) 实现了NVMe标准在PCIe总线上的扩展,可以支持数据中心的网络存储,它支持多种传输方式包括FC,RDMA和TCP。NVMe-oF服务(应用) 是SPDK中非常重要的组成部分,也是SPDK感兴趣和使用最多的模块之一。在20.01版本中,我们增加了NVMe-oF example进一步展示它的实现,方便用户的理解和使用,包括搭建自己的NVMe-oF Target应用。

二. 为什么需要nvmf example?

SPDK已经有了NVMe-oF target应用,为什么还要增加一个example呢?主要有以下几点目的:

  1. 更直观的展示SPDK thread的实现。
  2. 展示如何使用SPDK lib实现一个NVMe-oF target应用。
  3. 快速验证nvmf功能。

事实上,SPDK不仅仅提供APP,还提供用户态driver和lib,因此用户也可以根据实际的需求选择直接用我们的APP,还是用SPDK提供的lib自己开发,nvmf example就提供了一个这样的平台,展示如何使用SPDK lib实现自己的nvmf。

SPDK thread的实现:它是SPDK framework的重要组成部分,也是实现SPDK无锁的基础。这个example更直观的展示了如何使用SPDK lib实现SPDK thread layer,以及thread的调度算法。

NVMe-oF target的实现:对有些用户而言,他们考虑的更多的是如何把nvmf target集成到自己的APP中。而example展示了如何使用SPDK lib实现自己的nvmf target.

快速验证:这个特性对用户和开发者而言同样有用。可以利用这个example去快速验证自己对于SPDK thread或者target的一些改进与想法。

三. 剖析nvmf example

3.1 SPDK thread

example演示了如何使用SPDK lib创建自己的thread framework,它的很多实现和SPDK nvmf target非常相似,所以,这也能帮助用户更容易地去理解SPDK的framework。Example的实现在nvmf_init_threads中,它的实现流程如图1所示,我们需要先厘清图中一些概念,这样方便用户理解。如果我们把SPDK thread理解成系统中的pthread,那么reactor就可以理解为系统中的core,他负责spdk thread的运行和调度。Reactor的创建会依据APP指定的coremask,然后通过spdk_env_thread_launch_pinned(core, fn, arg)绑定到对应的core上,同时它会指定一个运行函数。

SPDK thread的创建主要依赖两个函数:

  • I. spdk_thread_lib_init_ext(thread_op_fn, thread_op_supported_fn, ctx_sz);
  • II. spdk_thread_create(name, cpumask);

函数1用来初始化thread lib以及指定SPDK thread的调度方法。我们深入去发掘就会发现初始化thread lib其实就是创建thread message pool,因为SPDK thread相互交流通过thread message实现。

函数2用来创建SPDK thread实体,同时它会根据函数1指定的调度函数将thread挂到cpumask指定的reactor上。

总结起来,使用spdk lib创建thread framework分为三步:

  1. SPDK thread lib init并指定thread调度函数;
  2. 创建reactor;
  3. 创建SPDK thread;

图1 SPDK thread

nvmf_init_threads之后,example就可以在SPDK thread上运行,通过spdk_thread_send_msg(hread, fn, arg)让fn去对应的thread上执行。

3.2 NVMe-oF target

example展示的是如何使用SPDK lib创建一个nvmf target。关键函数是nvmf_target_advance_state,它的实现流程如图2所示,nvmf target基于SPDK thread和bdev实现。SPDK thread已经通过nvmf_init_thread实现了,而spdk_subsystem_init配合makefile可以决定nvmf target支持哪些bdev。通过流程图可以看到nvmf target实现起来并不复杂。这是因为在这里我们只是创建了必须的部分,例如nvmf target实体和discovery subsystem,而其他subsystem和namespace等等,我们统统都是交由RPC的方式去创建的。SPDK正在逐渐去掉配置文件的方式,所以,在这个example中就只支持RPC的方式。RPC的初始化在nvmf_subsystem_init_done,通过 spdk_rpc_initialize和spdk_rpc_set_state实现。

图2 Target初始化流程图

3.3 快速验证

Example都有这样的功能,可以快速地去验证我们的想法。例如example中的thread reschedule。在提交这样的功能之前,可以先在example上实现来说明和验证你的想法,那么别人就可以更清楚地理解你想要实现的功能。当然,反过来也是一样的,实现的功能加入到example中可以让用户更清楚地了解它。

四. 总结

本文通过对nvmf example的剖析,像大家展示了如何使用SPDK lib创建自己的nvmf target应用,希望既能让大家更容易去理解SPDK 的框架也能更清楚如何去使用SPDK lib。

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

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

相关文章

【已解决】移动号码在移动网上营业厅更换为8元保号套餐

有很多人的副卡基本是为了接收银行卡短信,平时基本不打电话和用流量,每个月固定消费在18-30左右,很浪费。今天发现在网上营业厅就可以修改8元保号套餐,分享给大家。 保号套餐 有以下两种: 解决办法: 1、…

redis非关系型数据库

redis非关系型数据库,缓存型数据库 关系型数据库和非关系型数据库的区别 关系型数据库 关系型数据库是一个结构化的数据库。 记录方式:行和列 行的作用:记录对象的属性 列的作用:声明对象 表与表之间是有关联的&#xff1a…

LR学习笔记——初识lightroom

文章目录 介绍图库界面修改照片界面 介绍 Lightroom是Adobe公司开发的一款用于图片后期处理制作的软件,被称为Adobe Photoshop Lightroom。其增强的校正工具、强大的组织功能以及灵活的打印选项可以帮助加快图片后期处理速度,将更多的时间投入拍摄。 相…

Web自动化测试工具的关键功能

当涉及到 Web 应用程序开发和维护,自动化测试工具发挥着至关重要的作用。这些工具不仅仅简化了测试过程,还有助于保障软件质量、提高生产力和减少人力资源的投入。以下是Web自动化测试工具提供的关键功能: 1. 自动化脚本录制和回放功能 Web 自…

口袋参谋:如何通过布局“问大家”,快速提高宝贝转化!

问大家对于中小卖家来说,是非常适合的,因为我们完全可以靠对问大家的布局,提高宝贝的转化率。 问大家的作用 问大家主要是方便买家在购买前,了解商品的一些问题,而作为该不该购买的参考。对于卖家来说,是…

GaussDB新特性Ustore存储引擎介绍

1、 Ustore和Astore存储引擎介绍 Ustore存储引擎,又名In-place Update存储引擎(原地更新),是openGauss 内核新增的一种存储模式。此前的版本使用的行存储引擎是Append Update(追加更新)模式。相比于Append…

亚马逊第二个大语言模型 Olympus 即将上线

据外媒爆料,亚马逊正在训练他的第二个大语言模型——Olympus,很有可能在今年12月份上线。亚马逊计划将Olympus接入在线零售商店、Echo等设备上的Alexa语音助手,并为AWS平台提供新的功能。据说这个大语言模型规模达到2万亿(2000B&a…

C#入门(13):特性Attribute

C# 特性(Attributes)是用于在运行时为程序元素(如类、方法、属性等)添加声明性信息的一种方式。这些信息可以在程序运行时通过反射(Reflection)访问。特性可以用来控制程序行为、添加元数据或者影响程序的运…

为何公司强调流程员工总是觉得反感?

在企业管理中,流程设计对于提高效率和降低风险至关重要。然而,很多企业在流程设计时常犯一些常见的错误,导致基层员工对流程感到烦扰,甚至产生抵触情绪。本文将通过分析一个企业的报销流程问题,探讨如何优化流程以提高…

mysqlbinlog使用记录

首先要确认mysql启用了binlog功能。一般默认启用。 mysql> select log_bin; ----------- | log_bin | ----------- | 1 | ----------- 然后确认binlog目录 mysql> select log_bin_basename; ---------------------------- | log_bin_basename | -----…

【【VDMA彩条显示实验之四 含C语言代码】】

VDMA彩条显示实验之四 含C语言代码 VTC 手册简介 所有的视频都需要有时序 有时序的地方就需要有 时序控制器 VTC的 主要作用是 产生 视频时序 相对于上一节 在这里 我们会理解的更多 观察 这个 HB 信号 其实这个和上一节的图片差不多 在 行同步信号 前面就是前沿 在 行同步…

【数据结构初阶】单链表SLlist

描述 不同于顺序表,顺序表的数据是存储在一个连续的空间里的 而链表它是链接起来的结构体地址。 所以我们不用像顺序表一样先创建一块空间出来,而是创建一个能存数据节点和节点与下一个节点之间的连接; 所以:“一个能存数据节点…

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(六)

新增菜品 1.1 需求分析与设计1.1.1 产品原型1.1.2 接口设计1.1.3 表设计 2.2 代码开发2.2.1 文件上传实现2.2.2 新增菜品实现 2.3 功能测试 1.1 需求分析与设计 1.1.1 产品原型 后台系统中可以管理菜品信息,通过 新增功能来添加一个新的菜品,在添加菜品…

BUUCTF [BJDCTF2020]just_a_rar 1

BUUCTF:https://buuoj.cn/challenges 题目描述: 来源:https://github.com/BjdsecCA/BJDCTF2020 密文: 下载附件,解压得到一个.rar压缩包。 解题思路: 1、根据压缩包的名字提示我们使用4位纯数字进行破解。使用ARCH…

006 OpenCV腐蚀膨胀

目录 一、环境 二、形态学原理 三、代码演示 一、环境 本文使用环境为: Windows10Python 3.9.17opencv-python 4.8.0.74 二、形态学原理 在图像处理中,腐蚀和膨胀是两种基本的形态学操作,它们可以有效地用于图像的噪声减少、形状分析和…

目标检测 Faster RCNN全面解读复现

Faster RCNN 解读 经过R-CNN和Fast RCNN的积淀,Ross B. Girshick在2016年提出了新的Faster RCNN,在结构上,Faster RCNN已经将特征抽取(feature extraction),proposal提取,bounding box regression(rect refine)&…

红海云签约广州无线电集团,头部国企人力资源数字化转型全面加速

广州无线电集团创立于1995年2月28日,是在1960年(国家第二个五年计划期间)隶属于国家第四机械工业部(后国家电子工业部)的国营第七五〇厂的基础上整体注册而成,其历史可以追溯至1956年在公私合营背景下组建的…

JDY蓝牙注意事项

波特率设置:9600,不接受115200,或者38400. 不同于WiFi测试,jdy蓝牙不接受AT"指令,可以使用“ATVERSION"指令测试 安信可公司的那个蓝牙指令在这里没有用,不知道是不是生产的公司不一样

宽瞬时带宽放大器SKY66051-11、SKY66052-11、SKY66041-11、SKY66317-11(RF)适用于通讯网络

一、2300至2700 MHz宽瞬时带宽高增益线性驱动放大器:SKY66051-11 SKY66051-11是一款具有高增益和高线性度的宽瞬时带宽、完全输入/输出匹配驱动放大器。通过使用外部元件,增益可在30dB至36dB范围内调整。紧凑型33 mm PA专为工作频率为2300至2700 MHz的4…