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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

写一封情书

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

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

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

打赏作者

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

抵扣说明:

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

余额充值