SPDK简介

SPDK起源

SPDK(Storage Performance Development Kit)是一个开源项目,旨在提供高性能、低延迟的存储系统开发工具集。SPDK 主要面向数据中心、云计算和嵌入式系统。使用 NVMe SSD 作为后端存储的应用软件加速库。该软件库的核心是实现了用户态、异步、无锁、轮询方式的 NVMe 驱动它的诞生有以下几个主要原因:

存储性能挑战: 随着数据量的爆炸性增长,存储系统性能成为了数据中心和云计算环境
中的关键挑战。传统的存储栈在处理高速闪存等低延迟存储介质时可能面临性能瓶颈。

新型存储介质的出现: 随着各种新型存储介质的兴起,如 NVMe(Non-Volatile Memory 
Express)闪存设备,存储硬件的性能得到了显著提升。然而,传统的存储软件栈可能无
法充分利用这些硬件的潜力。

软件和硬件分离趋势: 在现代数据中心和云计算环境中,软件和硬件分离变得越来越普
遍。SPDK 的设计理念是提供一个可以轻松与不同硬件平台集成的开发工具集,以实现
更好的性能。

高性能存储应用需求: 高性能存储应用,如分布式存储系统、数据库、大数据处理等,
需要能够充分利用低延迟和高吞吐量存储硬件。SPDK 的目标是为这些应用提供高效的
开发框架。

开源社区需求: 在开源社区中,存在对于高性能存储开发工具的需求。SPDK 提供了一
种开源的解决方案,使得开发者能够在其基础上构建自己的高性能存储应用。

综上所述,SPDK 的诞生是为了解决新型存储硬件与传统存储软件栈之间的性能差距,同时满足现代数据中心和云计算环境对于高性能、低延迟存储系统的需求。它的开发旨在提供高效、开源的存储开发工具,使开发者能够更好地利用现代存储硬件的潜力。

什么是NVMe

NVMe,全称为 “Non-Volatile Memory Express”,是一种用于高性能、低延迟存储设备的通信协议和驱动程序接口标准。它旨在充分发挥闪存等非易失性存储介质的潜力,为存储系统提供更好的性能和效率。NVMe 在许多现代存储设备中得到广泛应用,特别是闪存固态驱动器(SSD)。

主要特点和优势包括:

低延迟: NVMe 通过优化数据传输路径和减少命令队列深度等方式,实现了非常低的访
问延迟。这使得数据的读取和写入速度得到显著提升,适用于需要快速响应时间的应用
场景。

高吞吐量: NVMe 通过充分利用高速通道和多核处理器,实现了高数据吞吐量。这使得 
NVMe 设备在处理大量数据时表现出色,适用于大数据、分析和存储密集型工作负载。


多核处理器支持: NVMe 设备可以利用多核处理器来处理并发的 I/O 操作,从而在并行
负载下保持高性能。

高度并发: NVMe 支持多个命令队列和大量的队列项,使多个并发操作能够同时进行。


命名空间: NVMe 允许在单个物理设备上创建多个逻辑命名空间,从而实现逻辑划分和
管理。

强大的错误处理和恢复: NVMe 在错误检测和恢复方面有强大的功能,有助于提高数据
可靠性和可用性。

节能: NVMe 设备通常具有较低的功耗,这有助于提高数据中心的能源效率。

总之,NVMe 是一种面向非易失性存储介质的现代、高性能通信协议和接口标准,它在提供低延迟、高吞吐量的存储性能方面具有显著的优势,被广泛应用于现代数据中心、云计算和个人计算设备中。

什么是NVMe over Fabrics

NVMe over Fabrics(NVMe-oF)是一种技术,将 NVMe 存储设备的性能扩展到网络之上,允许通过网络传输 NVMe 命令和数据,以实现高性能和低延迟的存储访问。传统上,NVMe 设备直接连接到本地主机,但随着数据中心规模和分布式存储需求的增加,将 NVMe 存储设备连接到网络上变得更为重要。NVMe-oF 解决了这一需求,允许在远程设备上访问本地 NVMe 存储设备,而不损失性能。

NVMe-oF 可以在多种网络传输层上运行,包括以太网、光纤通道(FC)、InfiniBand 等。它允许多个主机通过网络并发地与远程 NVMe 存储设备进行通信,实现高效的存储共享和访问。

主要的 NVMe-oF 协议包括以下几种:

NVMe over Fabrics RDMA(NVMe-oF RDMA): 这是一种基于远程直接内存访问
(RDMA)的协议,如 RoCE(RDMA over Converged Ethernet)和 InfiniBand。它允
许低延迟的存储访问,适用于高性能计算和数据中心网络。

NVMe over Fabrics TCP(NVMe-oF TCP): 这是一种基于 TCP/IP 网络协议的实现,可以在以太网上运行。它可能不
如 RDMA 那样低延迟,但更容易在现有以太网基础设施上实现。

NVMe over Fabrics FC(NVMe-oF FC): 这是一种基于光纤通道网络协议的实现,可以通过光纤通道交换网络访问
 NVMe 存储设备。适用于传统光纤通道环境。

NVMe-oF 的优势包括:

高性能和低延迟: NVMe-oF 基于高性能和低延迟的 NVMe 协议,扩展到网络中。
灵活性: 允许将本地 NVMe 存储设备连接到远程主机,实现更好的资源共享和灵活性。
高效的共享存储: 可以实现多主机对共享存储的并发访问,适用于虚拟化、容器等多租户环境。

然而,实施 NVMe-oF 需要对网络和存储设备的支持,以及合适的协议和硬件基础设施。

SPDK关键技术

以下是 SPDK 中一些关键技术:

用户态驱动程序: SPDK 以用户态驱动程序的形式提供了驱动层的功能,避免了内核态和用户态之间的频繁切换,从而
减少了系统调用的开销,提高了性能。

异步 I/O 模型: SPDK 使用异步 I/O 模型来处理 I/O 操作,允许多个 I/O 操作并行执行,从而最大程度地发挥存储设备的
性能。

多线程支持: SPDK 利用多线程技术实现了多个 I/O 操作的并发处理,充分利用多核 CPU 提供的计算能力,提高系统性
能。

I/O 渠道抽象: SPDK 提供了 I/O 渠道抽象,允许多个应用程序之间共享设备资源,同时避免了资源竞争。

BDEV(块设备)抽象层: SPDK 提供了块设备抽象层,允许开发者以块设备的方式访问存储介质,提供了对各种块设备
的统一管理接口。

NVMe 技术支持: SPDK 原生支持 NVMe(Non-Volatile Memory Express)设备,充分发挥了 NVMe 设备的高性能和低
延迟。

RDMA 技术支持: SPDK 支持 RDMA(Remote Direct Memory Access)技术,实现低延迟的远程内存访问,适用于远
程存储访问场景。

BlobFS 和 NVMe-oF: SPDK 提供了 BlobFS 文件系统,以及 NVMe over Fabrics(NVMe-oF)支持,使得存储系统能
够在网络上实现高性能的存储访问。

垃圾回收和写入优化: SPDK 提供了垃圾回收和写入优化的功能,以减少写入放大和提高写入性能。

用户态 NVMe 驱动程序: SPDK 提供了用户态 NVMe 驱动程序,允许在用户态中直接操作 NVMe 设备,避免了内核态
和用户态之间的切换。

总之,SPDK 使用了多种关键技术来实现高性能、低延迟的存储访问。它的异步、多线程、用户态驱动等特性使得开发者能够利用现代存储硬件的潜力,构建高性能的存储应用程序

SPDK BDEV

spdk在上述加速访问NVMe存储的基础上,提供了块设备(bdev)的软件栈,这个块设备并不是linux系统中的块设备,spdk中的块设备只是软件抽象出的接口层。

spdk已经提供了各种bdev,满足不同的后端存储方式、测试需求。如NVMe (NVMe bdev既有NVMe物理盘,也包括NVMeof)、内存(malloc bdev)、不落盘直接返回(null bdev)等等。用户也可以自定义自己的bdev,一个很常见的使用spdk的方式是,用户定义自己的bdev,用以访问自己的分布式存储集群。

spdk通过bdev接口层,统一了块设备的调用方法,使用者只要调用不同的rpc将不同的块设备加到spdk进程中,就可以使用各种bdev,而不用修改代码。并且用户增加自己的bdev也很简单,这极大的拓展了spdk的适用场景。

讲到这里,各位同学应该明白了,spdk目前的的应用场景主要是针对块存储,可以说块存储的整个存储的基石,再其之上我们又构建了各种文件存储、对象存储、表格存储、数据库等等,我们可以如各种云原生数据库一样将上层的分布式系统直接构建在分布式块存储、对象存储之上,也可以将其他存储需要管理的元数据、索引下推到块层,直接用spdk优化上层存储,比如目前的块存储使用lba作为索引粒度管控,我们可以将索引变为文件/对象,在其之上构建文件/对象存储系统

SPDK 与Vhost

SPDK ( Storage performance development kit ) 是由 Intel 发起,用于使用 NVMe SSD 作为后端存储的应用软件加速库。该软件库的核心是实现了用户态、异步、无锁、轮询方式的 NVMe 驱动。

与传统 Linux 内核的 NVMe 驱动相比,它可以大幅度降低 NVMe command 的延迟,同时提高单 CPU 的 IO 处理能力 IOPS,从而形成一套高性价比的解决方案,例如使用 SPDK 的 vhost 解决方案可以应用于公有云中来加速虚拟机中的 NVMe I/O。

增强型 DC2 是滴滴云高性能解决方案中重要的组成部分,我们通过改进 SPDK 中的 vhost 框架来实现高性能 IO,vhost 架构如下:

在这里插入图片描述
SPDK vhost 作为虚拟机存储的后端,以进程的形式在宿主机上运行,通过轮询的方式从共享的 Ring Buffer 中得到虚拟机中的 IO 请求,并进行处理,最后将处理完的数据同样通过 Ring Buffer 的方式通知虚拟机。整个过程不需要锁的保护,没有中断引入的开销,效率极高。这里面主要涉及到下面几个部分:

虚拟机中的存储前端驱动:根据具体使用的协议不同而不同,可能为 virtio blk,virtio scsi,或直接使用原生的 NVMe driver,主要负责接收 IO 请求,并将请求保存到 Ring Buffer 中,等待后端的处理。另一方面,前端驱动还需要处理后端的完成通知。
共享的 Ring Buffer:虚拟机中的前端驱动与宿主中的存储后端共享的内存,用来在两者之间传输数据,命令和执行结果。
SPDK vhost 后端:虚拟机存储的后端实现,真正处理 IO 请求的核心逻辑,通过用户态的存储驱动实现高效的 IO 操作。
传统方案下,虚拟机里面 IO 的处理路径如下:
在这里插入图片描述
可以看到,虚拟机中的 IO 请求需要经过非常长的调用栈才能最终得到处理,并且虚拟机和宿主机中的调用栈有很多重复的部分,这大大地增加了 IO 处理的延时和吞吐量,最终对业务的性能造成很大的影响。通过使用 SPDK+vhost 解决方案,我们可以大大的缩短虚拟机中的 IO 处理路径,从而达到低延时高 IOPS 的目的。使用 SPDK+vhost 方案之后,IO 处理调用路径如下:
在这里插入图片描述

参考:https://zhuanlan.zhihu.com/p/52970477

SPDK(存储性能开发套件)官方文档中文版。 第一章 简介 1 1.1.什么是SPDK? 1 1.2.入门 1 1.3. Vagrant开发环境 3 1.4.更新日志(略) 6 第二章 概念 6 2.1. 用户空间驱动程序** 6 2.2. 来自用户空间的DMA** 7 2.3. 消息传递和并发** 9 2.4. NAND Flash SSD内部 13 2.5. 将I / O提交到NVMe设备** 15 2.5.1 NVMe规范 15 2.5.2 SPDK NVMe驱动程序I / O路径 15 2.6. 使用Vhost-user进行虚拟化I / O. 16 2.6.1 介绍 16 2.6.2 QEMU 17 2.6.3 设备初始化 18 2.6.4 I / O路径 19 2.6.5 SPDK优化 20 2.7. SPDK目录结构概述 20 2.8. SPDK移植指南 22 第三章 用户指南 22 3.1. 系统配置用户指南 22 3.1.1 IOMMU配置 22 3.2. SPDK应用程序概述 23 3.2.1 配置SPDK应用程序 23 3.3. iSCSI Target 26 3.3.1. iSCSI Target入门指南 26 3.3.2. 通过配置文件配置iSCSI Target 27 3.3.3. 通过RPC方法配置iSCSI Target 28 3.3.4. 配置iSCSI启动器 29 3.3.5. rpc配置示例*** 30 3.3.6. iSCSI 热插拔 32 3.4. NVMe over Fabrics Target 32 3.5. Vhost Target(略) 37 3.6 块设备用户指南 38 3.6.1 bdev介绍 38 3.6.2 通用RPC命令 38 3.6.3 Ceph RBD 39 3.6.4 压缩虚拟Bdev模块 40 3.6.5 加密虚拟Bdev模块 41 3.6.6 延迟vbdev模块 41 3.6.7 GPT(GUID分区表) 42 3.6.8 iSCSI bdev 43 3.6.9 Linux AIO bdev 43 3.6.10 OCF虚拟bdev 43 3.6.11 Malloc bdev 44 3.6.12 NULL bdev 44 3.6.13 NVMe bdev 44 3.6.14 逻辑卷Lvol 45 3.6.15 RAID 46 3.6.16 Passthru 46 3.6.17 Pmem 46 3.6.18 Virtio Block 47 3.6.19 Virtio SCSI 47 3.7 BlobFS(Blobstore文件系统) 48 3.7.1 RocksDB集成 48 3.7.2 FUSE插件 49 3.8 JSON-RPC方法(略) 49 第四章 程序员指南 49 4.1. Blobstore程序员指南 49 4.1.1 介绍 50 4.1.2 运作理论 50 4.1.3 设计注意事项 52 4.1.4 例子 54 4.1.5配置 54 4.1.6 组件细节 54 4.2. 块设备层编程指南 56 4.3 编写自定义块设备模块 58 4.3.1 介绍 58 4.3.2 创建一个新模块 59 4.3.3创建虚拟Bdev 60 4.4 NVMe over Fabrics目标编程指南 61 4.4.1 介绍 61 4.4.2 原语结构体 61 4.4.3 基础函数 62 4.4.4访问控制 62 4.4.5发现子系统 62 4.4.6 传输 63 4.4.7选择线程模型 63 4.4.8 跨CPU核心扩展 63 4.4.9 零拷贝支持 63 4.4.10 RDMA 63 4.5 Flash传输层 64 4.5.1 术语 64 4.5.2 使用方法 67 4.6 GDB宏用户指南 69 4.6.1 介绍 69 4.6.2 加载gdb宏 71 4.6.3 使用gdb数据目录 72 4.6.4 使用.gdbinit加载宏 72 4.6.5 为什么我们需要显式调用spdk_load_macros 72 4.6.6 以上可用的宏总结 73 4.6.7 添加新宏 73 4.7 SPDK “Reduce”块压缩算法 73 4.7.1 介绍 73 4.7.2 例子 74 4.8 通知库 78 第五章 基本信息 79 5.1 事件框架 79 5.1.1 事件框架设计注意事项 80 5.1.2 SPDK事件框架组件 80 5.1.3 应用框架 80 5.2 逻辑卷 81 5.2.1 术语 81 5.2.2 配置逻辑卷 84 5.3 矢量数据包处理(略) 86 第六章 杂项 86 6.1 介绍 86 6.2 NVMe的P2P API 86 6.3 确定设备支持 87 6.4 P2P问题 87 第七章 驱动程序 88 7.1 NVMe驱动程序*** 88 7.1.1 介绍 88 7.1.2 例子 88 7.1.3 公共接口 89 7.1.4 NVMe驱动程序设计 89 7.1.5 NVMe over Fabrics主机支持 91 7.1.6 NVMe多进程 91 7.1.7 NVMe Hotplug 92 7.2 I/OAT驱动程序 93 7.2.1 公共接口 93 7.2.2 关键功能 93 7.3 Virtio驱动程序 93 7.3.1 介绍 93 7.3.2 2MB大页面 93 第八章 工具 94 8.1 SPDK CLI 94 8.1.1 安装所需的依赖项 94 8.1.2 运行SPDK应用程序实例 94 8.1.3 运行SPDK CLI 94 8.1.4 可选 - 创建Python虚拟环境 94 8.2 nvme-CLI 95 8.2.1 nvme-cli with SPDK入门指南 95 8.2.2 使用场景 95 第九章 性能测试报告(略) 96 第十章NVMe-oF Target跟踪点*** 96 10.1 介绍 96 10.2 启用跟踪点 97 10.3 捕获事件的快照 97 10.4 捕获足够的跟踪事件 98 10.5 添加新的跟踪点 99
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

写一封情书

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值