SPDK块设备

2023-11-06

SPDK视角每个App由多个子系统(subsystem)构成,同时每个子系统又包含多个模块(module),子系统和模块的注入都是可插拔的,通过相关的宏定义声明集成到SPDK组件容器里(其中子系统的注入可通过声明SPDK_SUBSYSTEM_REGISTER,块设备模块的注入可通过声明SPDK_BDEV_MODULE_REGISTER)

目前SPDK已支持的子系统包括:accel、bdev、iscsi、nbd、nvmf、scheduler、scsi、sock、vhost、vmd,其中块设备子系统需要依赖accel、sock和vmd

在块设备子系统内部,每个模块都代表了一种块设备类型,目前已支持的块设备类型有:aio、compress、crypto、delay、error、ftl、gpt、iscsi、lvol、malloc、null、nvme、opal、ocf、passthru、pmem、raid、rbd、split、uring、virtio_blk、virtio_scsi、bdev_zoned_block,这里主要看的是NVMe块设备。

子系统及模块的初始化是在App启动阶段进行的(代码参考spdk_app_start及bootstrap_fn),需要初始化的子系统和模块可通过json形式进行声明,比如这里想要引入NVMe块设备

{"subsystems": [{"subsystem": "bdev", 
   "config": [{
      "method": "bdev_nvme_attach_controller",
      "params": {
         "name": "Nvme0",
         "trtype": "pcie",
         "traddr": "0000:0a:00.0"
       }
   }]
}]}

App启动加载完成之后,便可以对NVMe块设备进行访问(基于NVMe用户态驱动)

IO设备注册

SPDK的整个IO链路中,大部分组件都是以IO设备的方式对外提供服务的,为了便于对IO设备进行访问,SPDK提供了spdk_get_io_channel函数来建立与设备的通信管道,同时在管道内部维护了与设备相关的上下文信息(可通过spdk_io_channel_get_ctx获取),通过该上下文对象可辅助完成相关的IO动作。为此我们需要先把功能组件注册成IO设备(通过spdk_io_device_register)

块设备子系统在初始化过程中会将spdk_bdev_mgr注册成IO设备,以便通过其IO Channel来获取对应的spdk_bdev_mgmt_channel实例(作为上下文对象提供thread_local粒度的对象池功能,用于缓存spdk_bdev_io)

同时,NVMe bdev模块还会将nvme_bdev_ctrlrs注册成IO设备,通过其IO Channel可获取对应的nvme_poll_group实例,其内部维护了一个poller来轮询指定分组绑定的qpair集合。

除此之外,其他IO设备则是在驱动绑定的时候进行注册的(代码可参考connect_attach_cb回调函数)

相关IO设备的说明如下:

  1. nvme_ctrlr
    nvme_ctrlr主要用于描述设备控制器信息,其会注册一个poller函数(bdev_nvme_poll_adminq)来对adminq做周期性轮询。
    除此之外,通过其所提供的IO Channel还可获取每个NS对应的qpair实例,并将其加入指定的轮询分组(通过spdk_nvme_poll_group_add)
  2. nvme_bdev
    nvme_bdev是在对NS进行populate过程中创建的(代码参考nvme_ctrlr_populate_namespace),通过其所提供的IO Channel可获取每个NS对应的nvme_io_path信息,进而定位具体的IO QPair
  3. spdk_bdev
    spdk_bdev也是在此期间构建的,并注入到spdk_bdev_mgr对应的集合中(代码参考spdk_bdev_register)

块设备使用

块设备的使用主要遵循以下3个操作步骤

  1. 获取块设备描述符
    对此,SPDK提供了spdk_bdev_open_ext功能函数来对目标块设备进行open,并返回其对应的设备描述符spdk_bdev_desc
  2. 建立通信管道
    拿到设备描述符之后,可通过spdk_bdev_get_io_channel建立与目标块设备的通信管道,其会对图片中的每个IO设备形成访问,来创建用于IO通信的qpair实例,并通过指定的poller对其进行轮询。
  3. 通过管道对块数据进行读写
    对此,SPDK提供了spdk_bdev_write和spdk_bdev_read函数以便于向目标块设备提交对应的BIO请求。

 原文链接:https://zhuanlan.zhihu.com/p/461512223  

(免费订阅,永久学习)学习地址: Dpdk/网络协议栈/vpp/OvS/DDos/NFV/虚拟化/高性能专家-学习视频教程-腾讯课堂

更多DPDK相关学习资料有需要的可以自行报名学习,免费订阅,永久学习,或点击这里加qun免费
领取,关注我持续更新哦! ! 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SPDK块设备 的相关文章

随机推荐

  • Python3-类型标注支持

    typing为Python的一个标注库 此默认支持PEP 484和PEP 526指定的类型提示 最基本的支持由Any Union Tuple Callable TypeVar和Generic类型组成 有关完整的规范 请参阅PEP 484 有
  • 本人亲自整理的极客时间设计模式之美的硬核笔记

    由于笔记内容过多 我把它放到语雀上了 点击我 以下内容是为了让搜索引擎 检测到这篇文章 要阅读体验 请点击上面的连接 点击我 去我的语雀看 对了 我看到语雀那里有投诉的功能 请读者不要去点 程序员不要为难程序员 你去点了 就再也无法看到我的
  • 分布式存储Ceph介绍及搭建

    一 存储的类型 1 单机存储设备 DAS 直接附加存储 是直接接到计算机的主板总线上去的存储 IDE SATA SCSI SAS USB 接口的磁盘 所谓接口就是一种存储设备驱动下的磁盘设备 提供块级别的存储 NAS 网络附加存储 是通过网
  • Scratch2.0在线注册用户并使用帮助

    教学目标 1 在Scratch2 0中注册一个账号 2 登录后 进行再线学习 3 利用帮助进行自主学习 了解Scratch作品的创作过程 教学过程 一 注册用户 第一步 https scratch mit edu 打开官网 点 加入Scra
  • cuda编程学习2——add

    cudaMalloc 分配的指针有使用限制 设备指针的使用限制总结如下 1 可以将其传递给在设备上执行的函数 2 可以在设备代码中使用其进行内存的读写操作 3 可以将其传递给在主机上执行的函数 4 不能在主机代码中使用其进行内存的读写操作
  • Rust Diesel SQLite Windows

    问题描述 windos下想用Rocket使用SQLite3 自带案例 example todo 提示链接不到sqlite3 lib 原因分析 找到两个相关的issues https github com SergioBenitez Rock
  • 配置JAVA_HOME环境变量

    打开到环境变量 1 右击此电脑选择属性 2 选择高级系统设置 3 选择环境变量 配置JAVA HOME环境变量 1 新建系统变量 1 在系统变量中找到Path 如果没有就新建一个 然后新建两个变量
  • 第一章:VUE3学习(一)---Nodejs安装以及环境变量配置

    Nodejs安装以及环境变量配置 1 下载Nodejs 1 1最新版下载 1 2历史版本下载 2 安装 3 验证 4 环境变量配置 5 npm下载设置 6 测试 6 设置国内镜像提高下载速度 1 下载Nodejs 1 1最新版下载 直接官网
  • 用QT写一个类似的安装向导界面

    本文目录 功能描述 功能实现 框架 功能1 点击同意协议 才能进行下一步 功能2 选中指定路径的文件夹 并遍历该文件夹下所有的文件 功能3 设置进度条 功能4 两种激活方式 完整代码 功能描述 1 点击同意协议 才能进行下一步 2 选择一个
  • 2020软件测试学习自学路线分享,附完整资料,绝对有用哟

    2020软件测试学习路线图 内附自学路线 视频 工具经验 面试篇 划重点 资源链接 黑马程序员社区 想毕业后做测试相关的工作的 找学习资源找的头大 还好终于找到这么优质的可以系统地学习测试知识的途径 想学测试的小伙伴看看 真的可以跟着一步步
  • 误差向量幅度(EVM)

    转自 http blog sina com cn s blog 6c46cb860100otm3 html 误差向量幅度 EVM 误差向量 包括幅度和相位的矢量 是在一个给定时刻理想无误差基准信号与实际发射信号的向量差 Error Vect
  • 微信小程序添加插件腾讯位置服务路线规划,找不着的solution

    第一个 找到网页点击添加插件 提示类别不一样pass 第二个 在后台管理添加插件 提示找不着 pass 这两方法都不行 解决方法是 开发者后台登陆后 右上角服务 进入微信服务市场 选择开发者资源 然后选择插件 搜索腾讯位置服务路线规划 亲测
  • 3045 Lcm与Gcd构造

    已知 gcd a b n lcm a b m 求min a b 是多少 通过gcd的了解我们可以知道 两个数a k1 n以及b k2 n并且gcd k1 k2 1 ab n m m a b n ab k1 k2 n n 于是可以得到 m k
  • Yii Framework 开发教程(44) Zii组件-Resizable示例

    CJuiResizable可以使包含在其中的UI组件支持缩放功能 它封装了 JUI Resizable插件 CJuiResizable基本使用方法如下 php view plain copy print
  • Anaconda Prompt的用法

    Windows 开始菜单 打开Anaconda Prompt 这个窗口和cmd窗口一样的 用命令 conda list 查看已安装的包 从这些库中我们可以发现NumPy Matplotlib Pandas 说明已经安装成功了 下一步可以测试
  • ACM入门攻略(紫书入门,不间断更新)

    声明 本文仅供参考 并且假定读者已经可以熟练运用C语言及其相关知识 大神请走开 谢谢配合 目录 一 ACM入门的相关准备 书籍 OJ 编程语言 常用网站或工具 二 入门阶段的学习路线及其策略 全文以紫书为例 1 紫书第五章语言篇写题策略 2
  • JS之对象-对象声明及静态方法

    声明对象 1 原型实例化 声明对象的方式1 原型实例化 let obj1 new Object obj1 name obj1 张三 obj1 getName function return this name console log obj
  • 八十七.查找与排序习题总结(二)

    查找与排序习题总结 一 查找与排序习题总结 三 题一 调整数组顺序 奇数在左 偶数在右 调整数组的顺序使奇数位于偶数前面 输入一个整数数组 调整数组中数字的顺序使得所有奇数位于数组的前半部分 所有偶数位于数组的后半部分 要求时间复杂度为O
  • Rot.js 随机地牢,迷宫地图生成

    js 插件随机地牢 迷宫地图生成 插件git https github com ondras rot js tree master dist 使用 1 我们的游戏是在网页内进行的 一个基本的 HTML 文件就足够了
  • SPDK块设备

    SPDK视角每个App由多个子系统 subsystem 构成 同时每个子系统又包含多个模块 module 子系统和模块的注入都是可插拔的 通过相关的宏定义声明集成到SPDK组件容器里 其中子系统的注入可通过声明SPDK SUBSYSTEM