SPDK简介

文章目录
  1. 1. 简介
  2. 2. 软件体系结构概览

SPDK(Storage Performance Development Kit)是Intel发布的存储性能开发工具集。

原文:《Introduction to the Storage Performance Development Kit (SPDK)》

Title: SPDK简介
Author: Yunyao Zhang(张云尧)
E-mail: aidaizyy@gmail.com
Last Modified: 2017-05-09

简介

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

用户使用现在的固态设备,比如Intel® SSD DC P3700 Series Non-Volatile Memory Express(NVMe)驱动,面临一个主要的挑战:因为吞吐量和延迟性能比传统的磁盘好太多,现在总的处理时间中,存储软件占用了更大的比例。换句话说,存储软件栈的性能和效率在整个存储系统中越来越重要。随着存储设备继续发展,它将面临远远超过正在使用的软件体系结构的风险(即存储设备受制于相关软件的不足而不能发挥全部性能),在接下来的几年中,存储设备将会继续发展到一个令人难以置信的地步。

为了帮助存储OEM(设备代工厂)和ISV(独立软件开发商)整合硬件,Inte构造了一系列驱动,以及一个完善的、端对端的参考存储体系结构,被命名为Storage Performance Development Kit(SPDK)。SPDK的目标是通过同时使用Intel的网络技术,处理技术和存储技术来提高突出显著的效率和性能。通过运行为硬件设计的软件,SPDK已经证明很容易达到每秒钟数百万次I/O读取,通过使用许多处理器核心和许多NVMe驱动去存储,而不需要额外卸载硬件。Intel在BSD license许可协议下通过Github分发提供其全部的Linux参考架构的源代码。博客、邮件列表和额外文档可以在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,所以消除数百万个事务的这种开销,能够快速地复制到多个内核中。数据包和数据块被立即分发,等待时间减小到最少,使得延迟更低,一致性延迟更多(抖动更少),吞吐量也得到提高。

SPDK由数个子组件构成,相互连接并共享用户态操作和轮询模式操作的共有部分。当构造端对端SPDK体系结构时,每个组件被构造用于克服遭遇到的特定的性能瓶颈。然而,每个组件也可以被整合进非SPDK体系结构,允许用户利用SPDK中使用的经验和技术来加速自己的软件。

SPDK Architecture

我们从下往上构建:

硬件驱动

NVMe Driver:SPDK的基础组件,这个高优化无锁的驱动提供了高扩展性,高效性和高性能。

Inter 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命令。这意味着,比如本地/远程复制非常容易实现。

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

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

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

存储服务

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

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

存储协议

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

NVMe-oF target:实现了新NVMe-oF规范。虽然这取决于RDMA硬件,NVMe-oF的目标可以为每个CPU核提供高达40Gbps的流量。

vhost-scsi target:KVM/QEMU的功能利用了SPDK NVMe驱动,使得访客虚拟机访问存储设备时延迟更低,使得I/O密集型工作负载的整体CPU负载减低。

SPDK不适应所有的存储体系结构。这里有一些问题可能会帮助用户决定SPDK组件是否适合你们的体系结构。

这个存储系统是否基于Linux或FreeBSD?
SPDK主要在Linux上测试和支持。硬件驱动被FreeBSD和Linux支持。

存储系统的硬件平台是否要求是Intel体系结构?
SPDK被设计为充分利用Intel平台的特性,并针对Intel芯片和系统测试和调整。

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

系统体系结构可以合并无锁的PMDs到它的线程模型吗?
因为PMD持续运行在它们的线程中(而不是睡眠或者不用时让出处理器),所以它们有特殊的线程模型需求。

系统现在是否用DPDK处理网络数据包的工作负载
SPDK和DPDK共享早期的编程模型,所以现在使用DPDK的用户可能会发现与SPDK紧密整合非常有用。同样地,如果正在使用SPDK的用户为网络处理添加DPDK功能可能是个重要的机遇。

开发团队自己是否具有理解和解决问题的专业技能?
Intel没有为相关软件提供支持的义务。当Intel和围绕SPDK的开源社区将付出商业上合理的努力去调出未修改的发布版本软件的潜在错误,任何情况下Intel都没有任务义务为用户提供针对该软件任何形式的维护和支持。

转载请注明原作者和出处。

如果觉得这篇文章对您有帮助或启发,请随意打赏~