收藏: 浅析SPDK技术和知识点

2023-11-12


640?wx_fmt=gif&wxfrom=5&wx_lazy=1

固态存储设备正在取代数据中心。如今新一代的闪存存储,比起传统的磁盘设备,在性能、功耗和机架密度上具有显著的优势。这些现有的优势将会继续增大,使闪存作为下一代存储设备进入市场。


用户使用现在的固态设备,比如 Intel SSD DC P4600 Series Non-Volatile Memory Express(NVMe)驱动,面临一个主要的挑战:因为固态设备的吞吐量和延迟性能比起传统的磁盘好太多,如今总的处理时间中,存储软件占用了更大的比例。


换句话说,存储软件栈的性能和效率在整个存储系统中越来越重要。随着存储设备继续发展,它将面临远远超过现今使用的软件体系结构的风险(即存储设备受制于相关软件的不足而不能发挥全部性能)同时,在接下来的几年里,存储设备将会继续飞快发展到令人难以置信的程度。


为了提供一个完善的、端对端的参考存储体系结构—— Storage Performance Development Kit(SPDK)应运而生。SPDK已经证明很容易达到每秒钟数百万次I/O读取,通过使用多个处理器核心和多个NVMe  SSD进行存储,而不需要额外的硬件。

SPDK在BSD license许可协议下通过Github分发提供其全部的Linux参考架构的源代码(http://www.spdk.io)。


SPDK如何工作?


达到这样的超高性能运用了两个关键技术:运行于用户态和轮询模式。让我们进一步了解这两个软件工程术语。


首先,我们的设备驱动代码运行在用户态。这意味着,根据定义,驱动代码不会在内核中运行。避免内核上下文切换和中断可以节省大量的处理开销,从而允许更多的时钟周期被用来做实际的数据存储。无论存储算法(去冗,加密,压缩,空白块存储)多么复杂,浪费更少的时钟周期意味着更好的性能和很低的延迟。


这并不是说内核会增加不必要的开销;相反,内核增加了那些可能不适用于专用存储堆栈的通用计算用例相关的开销。SPDK的指导原则是通过减少每一处额外的软件开销来达到最低时延和最高效率。


其次,轮询模式驱动(Polled Mode Drivers,PMDs)改变了I/O的基本模型。在传统的I/O模型中,应用程序提交读写请求后睡眠,一旦I/O完成,中断就会将其唤醒。


PMDs的工作方式则不同,应用程序提交读写请求后继续执行其他工作,以一定的时间间隔回过头来检查I/O是否已经完成。这种方式避免了中断带来的延迟和开销,并使得应用程序提高I/O的效率。在旋转设备时代(磁带和机械硬盘),中断开销只占整个I/O时间的很小的比例,因此给系统带来了巨大的效率提升。


然而,在固态设备的时代,持续引入更低延迟的持久化设备,中断开销已然成为了整个I/O时间中不能被忽视的部分。这个问题在更低延迟的设备上只会越来越严重。系统已经能够每秒处理数百万个I/O,所以消除数百万个事务的这种开销,能够节省额外的CPU资源。

SPDK由众多子组件组成,相互链接并共享用户态操作和轮询模式操作的共有部分。 每一个子组件的创建都是为了客户在构造端到端SPDK体系结构时遇到的特定功能和性能需求。同时,每一个子组件也可以被集成到非SPDK架构中,允许用户利用SPDK中用到的经验和技术来加速自己的软件。


640?wx_fmt=png

图1 SPDK Architecture 

(该构架图主要对应了SPDK 18.07发布版本)


从下往上构建,主要的组件包括:


驱动(Drivers)


NVMe Driver:SPDK的基础组件,这个高优化无锁的驱动有着高扩展性、高效性和高性能的特点。 


Intel QuickData Technology:也称为Intel I/O Acceleration Technology(Inter IOAT,英特尔I/O加速技术),这是一种基于Xeon处理器平台上的copy offload引擎。通过提供用户空间访问,减少了DMA数据移动的阈值,允许对小尺寸I/O或NTB的更好利用。


NVMe over Fabrics(NVMe-oF)initiator:从程序员的角度来看,本地SPDK NVMe驱动和NVMe-oF启动器共享一套共同的API命令。这意味着,例如本地/远程复制将十分容易实现。

 存储服务 


Storage Services(存储设备)


Block device abstration layer(bdev):这种通用的块设备抽象是连接到各种不同设备驱动和块设备的存储协议的粘合剂。并且还在块层中提供灵活的API,用于额外的用户功能,如磁盘阵列、压缩、去冗等等。


Blobstore:为SPDK实现一个高精简的文件式语义(非POSIX)。这可以为数据库、容器、虚拟机或其他不依赖于大部分POSIX文件系统功能集(比如用户访问控制)的工作负载提供高性能基础。

‍‍‍

Blobstore Block Device:由SPDK Blobstore分配的块设备,是虚拟机或数据库可以与之交互的虚拟设备。这些设备得到SPDK基础架构的优势,意味着零拷贝和令人难以置信的可扩展性。


Logical Volume:类似于内核软件栈中的逻辑卷管理,SPDK通过Blobstore的支持,同样带来了用户态逻辑卷的支持,包括更高级的按需分配、快照、克隆等功能。


Ceph RADOS Block Device(RBD):使Ceph成为SPDK的后端设备,比如这可能允许Ceph用作另一个存储层。‍‍‍


Linux Asynchrounous I/O(AIO):允许SPDK与内核设备(比如机械硬盘)交互。


存储协议(Storage Protocols)


iSCSI target:建立了通过以太网的块流量规范,大约是内核LIO效率的两倍。现在的版本默认使用内核TCP/IP协议栈,后期会加入对用户态TCP/IP协议栈的集成。


NVMe-oF target:实现了NVMe-oF规范。将本地的高速设备通过网络暴露出来,结合SPDK通用块层和高效用户态驱动,实现跨网络环境下的丰富特性和高性能。支持的网络不限于RDMA一种,FC,TCP等作为Fabrics的不同实现,会陆续得到支持。

vhost target:KVM/QEMU的功能利用了SPDK NVMe驱动,使得访客虚拟机访问存储设备时延迟更低,使得I/O密集型工作负载的整体CPU负载减低,支持不同的设备类型供虚拟机访问,比如SCSI, Block, NVMe块设备。


常见问题问答


SPDK不适合于所有的存储体系结构。一些常见问题的解答也许会帮助用户判断SPDK组件是否适合自己的体系结构。


  • Q: SPDK是否基于Linux或FreeBSD?

  • A:SPDK主要在Linux上测试和支持。硬件驱动被FreeBSD和Linux支持。


  • Q: SPDK的硬件平台是否要求是Intel体系结构?

  • A: SPDK被设计为充分利用Intel平台的特性,并针对Intel芯片和系统进行测试和调整。


  • Q: SPDK的高性能路径是否运行在用户态?

  • A: SPDK通过更多地在用户态下运行从网卡到磁盘的高性能路径,提高性能和效率。通过将具有SPDK功能(比如NVMe-oF目标,NVMe-oF启动器,Blobstore)的应用程序结合起来,整个数据通路能够在用户空间运行,从而提供显著的高效率。


  • Q: SPDK的体系结构可以合并无锁的PMDs到它的线程模型吗?

  • A: 因为PMD持续运行在它们的线程中(而不是睡眠或者不用时让出处理器),所以它们有特殊的线程模型需求。


  • Q:SPDK现在是否使用DPDK处理网络数据包的工作负载?

  • A: SPDK和DPDK共享早期的编程模型,所以现在使用DPDK的用户可能会发现与SPDK紧密整合可以带来非常大的益处。同样地,正在使用SPDK的用户如果为网络处理添加DPDK功能,也可能会带来重大的改进。


文章分享结束了。文章参考来源(作者:Jonathan S、翻译:徐雯昀、贡献者:曹刚),为了让更多读者比较全面了解SPDK技术,笔者整理了“详解DPDK和SPDK技术知识点”资料,目录介绍如下所示:

1、DPDK背景介绍 1

2、DPDK架构和关键技术 4

2.1概念和术语 4

2.2 DPDK架构介绍 6

2.3 大页技术 9

2.4 轮询技术 9

2.5 CPU亲和技术 9

2.6 DPDK的应用模型 10

3、DPDK技术应用优势 10

4、DPDK初始化和转发流程 10

4.1 初始化流程 11

4.2 批量转发流程 11

5、DPDK技术原理简介 11

5.1 环境抽象层概述 12

5.2 核心组件分析 13

5.3 DPDK环境抽象层 15

5.3.1 LIBC与EAL的区别 15

5.3.2 EAL加载过程 16

5.3.3 内存分片介绍 18

6、DPDK内存管理功能介绍 19

6.1 Malloc函数库介绍 19

6.2 Ring 函数库介绍 20

6.2.1单个生产者入队 24

6.2.2单个消费者出队 26

6.2.3多个生产者入队 28

6.2.4多个消费者的出队 33

6.3 Mempool函数库介绍 33

6.3.1内存对齐的约束 33

6.3.2 CPU本地Cache 35

6.4 Mbuf函数库 37

6.5 DPDK内存对象分布 38

7、DPDK Poll模型驱动 43

8、DPDK多进程分析 50

8.1 进程的创建 51

8.2 调度与切换 52

8.3 地址空间共享 52

9、DPDK技术总结 54

10、DPDK和VOS的关系 57

11、SPDK背景介绍 61

12、SPDK软件体系结构 62

12.1 SPDK主要组件 64

12.1.1 SPDK驱动层 64

12.1.2 块设备层 64

12.1.3 存储服务层 65

12.1.4 存储协议层 65

12.2 SPDK技术总结 67

12.3 SPDK存储的应用策略 68

12.4 SPDK存在问题 68

13、SPDK特点和其他技术 68

13.1 SPDK应用编程框架 69

13.2 SPDK应用案例 69

13.3 Optane结合SPDK技术 70

13.4 SPDK中国峰会介绍 70

13.5 SPDK开源友好性 71

14、SPDK和当前技术对比 72

14.1 基于OS的文件操作 72

14.2 基于SPDK架构的文件操作 73

14.3 SPDK测试对比分析 74

14.3.1 带宽测试结果对比 74

14.3.2 IOPS测试结果对比 75

14.3.3 时延测试结果对比 76

15、SPDK存储模型Blobstore 76

15.1 blobstore介绍 76

15.2 blobstore中的对象 77

15.3 blobstore关键数据结构 78

15.4 blobstore元数据物理分布 86

15.5 元数据页的分配计算 87

16、相关技术介绍 90

16.1 RDMA高性能网络框架 90

16.2 用户态IO技术UIO 90

16.3 Virtio技术介绍 91

16.4 NVMf技术介绍 93

16.5 Linux文件系统架构介绍 93

17、SPDK关键技术分析 94

17.1 Message传递与并发 94

17.1.1 技术原理 94

17.1.2 消息传递基础架构 95

17.1.3 事件架构介绍 95

17.2 SPDK用户态内存管理 96

17.3 块设备层编程 97

17.4 编写Blcok设备模块 97

17.4.1 创建一个新的组件 98

17.4.2 创建bdevs 98

17.5 JSON-RPC服务介绍 98

17.6 NVME驱动介绍 98

17.7 NVMe热插拔技术 99


感兴趣的读者可以通过“阅读原文”获取“详解DPDK和SPDK技术知识点”详情。

推荐阅读:详解DPDK技术知识点



温馨提示:

请识别二维码关注公众号,点击原文链接获取“详解DPDK和SPDK技术知识点”资料总结

640?wx_fmt=jpeg

640?wx_fmt=gif&wxfrom=5&wx_lazy=1

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

收藏: 浅析SPDK技术和知识点 的相关文章

  • 【以太网硬件二十一】USXGMII是什么?-Part2

    个人主页 highman110 作者简介 一名硬件工程师 持续学习 不断记录 保持思考 输出干货内容 目录 PCS功能细节 XGMII到USXGMII的映射 带内配置和状态信号 自协商相关 电气特性 PCS功能细节 USXGMII把并行的X
  • Apache Flink Flink Time & Window 解析

    一 Window Time 介绍 Apache Flink 以下简称 Flink 是一个天然支持无限流数据处理的分布式计算框架 在 Flink 中 Window 可以将无限流切分成有限流 是处理有限流的核心组件 现在 Flink 中 Win
  • call、apply、bind的区别

    为什么要改变this的指向 var name codereasy let obj name 张三 say function console log this name obj say setTimeout obj say 10 正常情况下
  • linux I/O优化 磁盘读写参数设置

    转载 http wlservers blog 163 com blog static 120622304201241715945256 关于页面缓存的信息 可以用 cat proc meminfo 看到 其中的Cached 指用于pagec
  • Java Maven安装及环境配置教程

    一 安装 1 安装包 apache maven 3 6 3 安装包下载地址 2 下载安装包然后直接解压就行 注意 文件的位置路径不能有中文 二 环境配置 1 用户变量 双击Path 点击新建 将如下复制进去 然后点击确定 MAVEN HOM
  • opencv实战项目 手势识别-手部距离测量

    手势识别系列文章目录 手势识别是一种人机交互技术 通过识别人的手势动作 从而实现对计算机 智能手机 智能电视等设备的操作和控制 1 opencv实现手部追踪 定位手部关键点 2 opencv实战项目 实现手势跟踪并返回位置信息 封装调用 3
  • Spark数据分析之pyspark

    一 大数据简史 从hadoop到Spark 1 hadoop的出现 1 问题 1990年 电商爆发以及机器产生了大量数据 单一的系统无法承担 2 办法 为了解决 1 的问题许多公司 尤其是大公司领导了普通硬件集群的水平扩展 3 执行 had
  • HashCode方法的调用对Java锁的影响

    在回顾以前写的锁升级的代码时 意外发现hashCode方法的调用会对锁产生影响 于是做了几个测试并查阅了一些资料 把最终的结果记录于此 结论 首先上结论 一个对象在调用原生hashCode方法后 来自Object的 未被重写过的 该对象将无
  • qt可停靠控件和工具栏(Dock Widgets and Toolbars)

    可停靠控件能够停靠在QMainWindow中或者作为一个独立窗口浮动 QMainWindow提供了四个可停靠控件的地方 上方 下方 左方 右方 Microsoft Visual Stadio程序和Qt Linguist程序使用大量的可停靠窗
  • python 函数中的省略号

    1 省略号在python里也是个对象 2 赋值号后面省略号 给该变量赋值一个default值 具体python的机制我不清楚 应该是在类里面定义好的 或者参数省略 3 冒号后面省略号 表示函数的定义内容不写了 函数的定义内容不写了 相当于p
  • PTA6(python)

    python程序设计06 面向对象 7 1 求两点之间距离 7 2 类的定义和使用 7 3 优异生查询 类和对象 7 4 新型计算器 7 5 学生类的使用 7 6 三维向量运算 7 7 继承类应用 7 8 有关队列操作 7 9 有关堆栈操作
  • python调用everything批量查找表格中的文件名在磁盘中是否存在

    python调用everything批量查找表格中的文件名在磁盘中是否存在 介绍 Everything 配置 使用openpyxl读写文件 读文件 写文件 BeautifulSoup的使用 创建 beautifulsoup 对象 soup
  • 基础实验篇

    uORB是PX4 Pixhawk系统中非常重要且关键的模块之一 是用于无人机模块间通信的协议机制 本篇将详细介绍uORB并详细拆解uORB消息读写与自定义实验流程 三 基础实验篇 uORB消息读写与自定义实验 三 01 基于RflySim平
  • 代码随想录一刷-Day01

    代码随想录一刷 Day01 LeetCode704 二分查找 这道属于是入门必刷了 但是虽然能做出来 在细节上还是不够注意 public int search int nums int target if nums null nums le
  • @excel注解_EasyPOI 详细教程以及注解的使用

    因为项目的原因需要用到POI来操作Excel 文档 以前都是直接使用POI来操作的 但是最近听到easypoi的存在 所以自己简单的尝试了下 别说 他还真的挺好用的 Easypoi介绍 Easypoi 为谁而开发 不太熟悉poi的 不想写太
  • LocalDate的用法与String互转

    一 LocalDate常用用法 1 1 申明定义 LocalDate formatDate LocalDate of 2020 2 5 自定义 LocalDate today LocalDate now 获取当前日期 1 2 getX 获取
  • WebRTC实时音视频技术的整体架构介绍

    WebRTC 简介 WebRTC 名称源自网页实时通信 Web Real Time Communication 的缩写 是一个支持网页浏览器进行实时语音通话或视频聊天的技术 是谷歌2010年以6820万美元收购Global IP Solut
  • Echarts 无数据时显示“暂无数据”

    当我们的图表遇到接口数据为空或者筛选之后无数据的情况 会显示成这样 就比较丑 所以需要更换成指定的某些文字做提示 通过配置title 曲线救国 title show true text 暂无数据 left center top center
  • JAVA小练习149——需求: 一家三口都要工作, 儿子工作负责绘画, 妈妈可以在儿子的工作上进行增强---上涂料, 爸爸的工作就是在妈妈的基础上增强---上画框

    interface Work public void work class Son implements Work Override public void work System out println 在画画 class Mother
  • python实践:让所有奇数都在偶数前面,而且奇数升序排列,偶数降序排序

    给定一个任意长度数组 实现一个函数 让所有奇数都在偶数前面 而且奇数升序排列 偶数降序排序 如字符串 1982376455 变成 1355798642 class Solution def SortNum self num list par

随机推荐

  • js查找数组重复元素

    方法一 利用sort方法 先使用sort方法将数组排序 再来判断找出重复元素 function res arr var temp arr sort sort function a b if a b temp indexOf a 1 temp
  • 数值分析复习笔记-第七章-非线性方程求根

    Chapter7 非线性方程求根 7 1 前言 本质 对一些n次代数多项式or超越方程 它们的根是难以通过解析方法求得 因此需采取数值方法 主要有 二分法 不动点迭代法 迭代加速 牛顿迭代法 牛顿法 割线法 7 2 二分法 数学基础 零点定
  • 多边形等分算法

    多边形等分
  • Python基础-- 9函数(中)

    一 函数的返回值 返回值就是函数执行以后返回的结果 通过return来指定函数的返回值 return后面可以跟任意对象 返回值甚至可以是 个函数 二 文档字符串 在定义函数时 可以在函数内部编写文档字符串 文档字符串就是对函数的 说明 he
  • Linux中TAB补全显示设备空间不足问题

    今天在使用linux中习惯性的使用tab键进行补全信息 发现无论在何处按下tab都会显示这样报错 图中因为我用了xshell工具 这里报错是中文的 这个时候要检查下自己的空间是否充足 可使用df查看设备目录使用空间大小 可以将一下不用的目录
  • 概率论的几种常考分布总结

    两点分布 0 1分布 X b 1 p 二项分布 X b n p k 0 1 2 n 指数分布 参数为 线性分布 参数为a b 泊松分布 X k 0 1 2 n
  • 程序员常犯的5个非技术性错误

    一个好的软件开发人员需要培养两种技能 技术技能和非技术技能 不幸的是一些开发者只注重技术的部分 以致养成一些陋习 下面是最常犯的5个非技术性错误 0 缺乏自律 Jim Rohn曾经说过 自律是目标和成果之间的桥梁 我一直认为 不论是成为一名
  • 半导体芯片测试介绍:CP、FT、STL

    CP测试 Chip Probing 对Wafer进行电性能测试 挑选出好的Die 可以减少封装和测试的成本 也可以透过Wafer的良率 检查fab厂制造的工艺水平 FT测试 Final Test 芯片封装完成之后 通过分选机和测试机的配合使
  • Android 兼容8.0 App全局字体调节、禁止App字体随系统字体大小而更改

    在APP中 字体的大小单位一般会用sp 然而在改变系统字体大小时 App字体就会随着系统字体大小改变而改变 这就可能造成APP布局的错位 造成这种情况的原因是 sp单位除了受屏幕密度影响外 还受到用户的字体大小影响 通常情况下 建议使用sp
  • 【周末闲谈】什么是云计算?

    个人主页 个人主页 系列专栏 周末闲谈 第一周 二进制VS三进制 第二周 文心一言 模仿还是超越 第二周 畅想AR 文章目录 前言 什么是云计算 大数据 云计算是分布式计算的一种 云计算为我们提供的三种服务 基础设置即服务 laaS 软件运
  • Unicode汉字编码表

    1 Unicode编码表 Unicode只有一个字符集 中 日 韩的三种文字占用了Unicode中0x3000到0x9FFF的部分 Unicode目前普遍采用的是UCS 2 它用两个字节来编码一个字符 比如汉字 经 的编码是0x7ECF 注
  • 几种任务调度的 Java 实现方法与比较

    I 几种任务调度的 Java 实现方法与比较 综观目前的 Web 应用 多数应用都具备任务调度的功能 本文由浅入深介绍了几种任务调度的 Java 实现方法 包括 Timer Scheduler Quartz 以及 JCron Tab 并对其
  • project facets java转成web项目

    前言 用Eclipse开发项目的时候 把一个Web项目导入到Eclipse里会变成了一个Java工程 将无法在Tomcat中进行部署运行 方法 1 找到 project文件 找到里面的
  • [GUI]stm32搭载3.5寸SPI-TFT屏移植LittleVGL

    唠几句 记录下移植笔记 新项目用到LVGL 也是首次接触GUI库 所以Emmmm 学呗 之前都是直接在LCD屏上画点 画线 画圆 画个矩形 画个多边形 显示个字符串 显示张图片而已 没有用过GUI库 在网上找了点学习资料 然后把LVGL库的
  • Springboot企业级部署解决方案

    使用springboot的童鞋们 有没曾经想把项目打包成 bin conf libs logs 等这样的结构然后直接运行的 但是找了很多办法都不够完美 因为G是个完美主义 好了直接来看解决方案 1 修改执行打包的子工程的pom xml文件
  • Emojify - v2参考答案

    Emojify Welcome to the second assignment of Week 2 You are going to use word vector representations to build an Emojifie
  • Android允许EditText获取焦点,但是不弹出系统键盘的方法

    1 以下方法可以避免弹出系统软键盘 但是scanPayDialog里面的editText也失去了焦点 scanPayDialog getWindow setSoftInputMode WindowManager LayoutParams S
  • RK3568 Debian10 固态硬盘自动挂载

    目录 需求 实现 步骤 附录 Example Field definitions 参考资料 Platform RK3568 OS Debian10 Kernel v4 19 219 Module Wdxsky SSD NVME 950 12
  • 基于js+echarts实现数据可视化大屏展示

    vue echarts大屏数据可视化展示点击进入 写在前面 本项目中使用的是echarts图表库 ECharts 提供了常规的折线图 柱状图 散点图 饼图 K线图 用于统计的盒形图 用于地理数据可视化的地图 热力图 线图 用于关系数据可视化
  • 收藏: 浅析SPDK技术和知识点

    固态存储设备正在取代数据中心 如今新一代的闪存存储 比起传统的磁盘设备 在性能 功耗和机架密度上具有显著的优势 这些现有的优势将会继续增大 使闪存作为下一代存储设备进入市场 用户使用现在的固态设备 比如 Intel SSD DC P4600