【论文阅读】SPDK: A development kit to build high performance storage applications
目录
-
- 工作目的与主要成果
- 1.1 工作背景与目的
- 1.2 SPDK-Storage Performance Development Kit
-
系统架构及其实现
- SPDK架构的组成
- 应用调度机制的设计与实现
- 用户空间 polling 机制的设计与实现
- 用户空间 polling 机制的设计与实现(注:此处可能有笔误,请确认具体需求)
- 存储服务模块的设计与实现
- SPDK架构的组成
-
3.User-space-based NVMe driver implementations and testing
-
- 3.1 Implementation details: Further elaboration will be provided in subsequent sections.
- 3.2 NAND-based NVMe SSD implementation
- 3.2 Xpoint SSD implementation
-
4.总结
-
当前主流的高性能存储服务多依赖于现有高性能存储设备(如NVMe SSD)。然而现有存储软件栈无法满足这种需求-在开发高性能存储应用时的主要性能消耗瓶颈逐渐显现出来。因此本文提出了一种名为SPDK的新方案以解决这一问题。
1.工作动机和主要贡献
1.1 工作背景与动机
云存储的广泛应用促使服务供应商不得不提供高质量的存储服务以支持前端应用的发展需求。例如,在性能指标方面涉及 high I/O operations per second, low latency, 和 controllable resources.
存储服务质量的关键因素在于硬件配置。
硬件方面:曾对服务质量产生重大影响的因素已得到显著改善。
随着NVMe SSD等技术的出现,在这一领域取得了突破性进展。
具体而言,在I/O性能方面,
显著降低了其I/O延迟至数微秒。

软件
context switch: 上下文切换
数据传输在内核与用户空间之间:
中断事件
共享资源于I/O栈中
1.2 SPDK-Storage Performance Development Kit
该系统提供了基于user space libraries的一整套解决方案,并结合多种相关的工具和技术手段来支持构建高性能存储应用。本文的主要贡献体现在以下几个方面:
- SPDK的各种库可以通过OEM厂商或云存储服务提供商进行开发或优化,并构建高效的存储应用。
- 我们详细阐述了SPDK及其内部机制如何使SPDK的性能得以提升。
- 通过实例(如SPDK中的NVMe-oF目标)展示了基于SPDK的解决方案优于现有方案。
2.系统设计与实现
2.1 SPDK的构成
总的来说,SPDK就是各类开发库的集合。

-
app scheduling: 基于事件框架辅助实现异步操作(polling模式)及共享空闲服务器应用。
-
drivers: 涉及用户空间 polling模式NVMe驱动器(无复制操作、高度并行),支持通过DMA引擎优化I/OAT性能。
-
存储服务:通过抽象化实现对所使用的设备进行驱动,并为上层应用提供
用户空间块I/O接口。- 存储协议:基于SPDK实现了的一系列加速存储方案。具体包括:iSCSI目标用于iSCSI服务加速;vhost-scsi/blk目标用于加速虚拟机中的virtio-scsi/blk;NVMe-oF目标用于加速NVMe。
2.2 Application Scheduling
- 产生的背景
通常情况下,在处理简单的应用场景时,我们可以采用单线程模式来进行数据写入操作。然而,在系统规模扩大(scaling up)的情况下,则需要引入多线程机制以支持更多的连接请求。理论上来说,在保证每个连接事件之间相互独立的前提下,则可以通过多线程机制高效地处理大量请求而不发生阻塞。但在实际应用中由于事件之间的相互依赖性以及调度策略的复杂性等原因…application scheduling模块中就提供了一个基于event framework的技术方案来有效解决这一问题。
改写说明

- 概念介绍 :event
为了达成多线程之间高效的信息交互的同时降低同步操作的开销, 利用事件机制进行信息传递
每个CPU内核都有一个事件循环线程(replay thread),它们的主要职责是负责处理即将到来的事件(interarrival events)。
每个事件(event)由绑定的功能指针(function pointer)及其内容提要(content summary)构成(consist of a bound callback and a content summary),并前往特定的CPU核心(target specific CPU core)。
事件(events)可以通过调用spdk_event_allocate()函数创建,并通过调用spdk_event_call()函数被触发。
与传统的单线程单连接方法不同,在这种模型中我们采用明确的异步操作以提高效率(efficiency)。这种异步操作具体表现为非阻塞函数调用(non-blocking function call),并通过回调函数标志(callback function marker)来实现。这也是底层实现轮询机制的基础原因所在。更多细节请参考链接。
概念介绍 :reactor
1$每个reactor都有一个非锁存队列用于接收即将到达的events:各个核心的所有线程都可以将事件插入到其他线程组中的事件循环中$。 2所有事件都按照先进先出的方式依次处理。因为所有的事件都是由相应的核心直接负责处理$。
概念介绍
2.3 User space polled drivers
SPDK通过在用户空间实现设备驱动的方式与内核空间实现了区分...两者的区别请参考链接...的好处如下:
- 在 Kernel 空间中执行需要进行系统调用或数据搬运会产生额外开销,在 User 空间构建则可避免这些开销...从而节省 CPU 循环。
2.SPDK 采用轮询方式而非中断机制以减少内核中断处理程序及上下文切换操作,并给予用户自主分配各进程的 CPU 时间权限...若任务未完成则会返回错误信息并进入下一阶段。
驱动的两个特性:
- 异步输入输出:通过专用的
completion check function实现对完成的I/O任务的获取。同步I/O操作会在I/O请求发送后立即启动对结果的等待流程…由此可见,在I/O队列深度超过1时,采用异步处理能显著提升效率。 - 无锁(lockless)架构:无锁架构意味着每个CPU核心拥有独立的资源池以处理其独有的I/O请求序列…这种设计避免了传统多核系统中由于资源竞争而导致的任务等待现象。
SPDK通过为每个线程分配专属资源池来避免资源竞争…这种设计使得系统能够更加高效地并行处理大量任务。
2.4 Storage service
包含三个部分
blobfsblobstoreuser space block device(BDEV)
Blobstore : 坚持ent, highly resilient block allocator.该方案可作为本地存储系统的持久化管理方案,在发生主电源故障时也能安全可靠地分配资源。
第一条:在本地存储系统的架构中替代传统的文件系统层级设计。
第二条:多层次的应用程序可以选择键值储存(KVS)、本地数据库或者分布式储存系统作为支撑平台
该系统由blobstore构成的文件系统层。目前仅限于单级存储结构,并不支持嵌套存储方案。因此所有存储内容均位于同一层次结构中。该存储方案仅允许单次写入操作。
BDEV :对driver层识别的设备进行抽象。供给上层应用使用。
3.User Space NVMe drivers实现与测试
详细阐述使用user space NV Me driver的实现机制。该实验平台由Intel提供的两种NV Me闪存产品组成:Intel 2D NAND NV Me SSDs (DC P3700) 和 Intel 3D Xpoint NV Me SSDs (DC P4800X)。对比分析SPDKNV MeDriver与Linux内核NV MeDriver在性能方面的差异。
3.1实现:详情见后续文章
3.2NAND NVMe SSD
使用性能比较工具SPDK nvme perf测试。使用单核测试。测试环境如下。

测试结果如下:

3.2 Xpoint
测试工具FIO,环境:

在不同队列深度的情况下测试平均延时:

4.总结
SPDK是一种面向对象的软件库与工具集合,用于设计并构建高性能且可扩展的存储系统。基于SPDK的技术架构支持,OEM(原始设备制造商)以及云计算服务提供商能够显著提升自身存储解决方案的质量与效率,在实际应用中表现出色且易于部署
SPDK: 被开发为存储应用的高性能开发工具
