固态存储设备正在取代数据中心。如今新一代的闪存存储,比起传统的磁盘设备,在性能、功耗和机架密度上具有显著的优势。这些现有的优势将会继续增大,使闪存作为下一代存储设备进入市场。
用户使用现在的固态设备,比如 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中用到的经验和技术来加速自己的软件。
图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视频
DPDK 学习资料、教学视频和学习路线图 :https://space.bilibili.com/1600631218
Dpdk/网络协议栈/ vpp /OvS/DDos/NFV/虚拟化/高性能专家 上课地址: https://ke.qq.com/course/5066203?flowToken=1043799
DPDK开发学习资料、教学视频和学习路线图分享有需要的可以自行添加学习交流q 群909332607备注(XMG) 获取
原文链接:https://mp.weixin.qq.com/s/H2sAz-iPbL6rFCUpCAUpWQ