SPDK简介

http://aidaiz.com/spdk/

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

简介

固态存储设备正在取代数据中心。目前这一代的闪存存储,比起传统的磁盘设备,在性能(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 ArchitectureSPDK 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都没有任务义务为用户提供针对该软件任何形式的维护和支持。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值