SPDK简介
基本原理
SPDK的高性能依赖两项核心技术:用户态运行running at user level
和轮询模式驱动Poll Mode Drivers (PMDs)
用户态运行:降低指令周期
将设备驱动代码运行在用户态,是和运行在“内核态”相对而言的。把设备驱动移出内核空间避免了内核上下文切换与中断处理,从而节省了大量的CPU负担,允许更多的指令周期用在实际处理数据存储的工作上。无论存储算法复杂还是简单,也无论进行去重(deduplication),加密(encryption),压缩(compression),还是简单的块读写,更少的指令周期浪费意味着更好的整体性能。轮询模式驱动:
中断式IO处理模式:有IO需要处理时就请求一个中断,CPU收到中断后才进行资源调度来处理IO,采用的是被动的派发式工作。当硬盘速度上千倍的提高后,将随之产生大量IO中断,Linux内核的中断驱动式IO处理(Interrupt Driven IO Process)就显得效率不高了。
定点轮询(polling)模式:使用专门的计算资源(特定的CPU核)用来主导存储设备的轮询式处理——就像专门的出租车道和车流用来处理乘客任务,数据包和块得到迅速派发,等待时间最小化,从而达到低延时、更一致的延时(抖动变少)、更好的吞吐量的效果。
基本架构
硬件驱动
- NVMe driver:SPDK的基础组件,这个高度优化的无锁驱动程序提供了无与伦比的可伸缩性、效率和性能。
- Intel® QuickData Technology(IOAT):基于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 的后端设备。
- Blobstore Block Device:基于SPDK技术设计的Blobstore块设备,应用于虚机或数据库场景。由于spdk的无锁机制,将享有更好的性能。
- Linux* Asynchronous I/O (AIO):允许 SPDK 与硬盘等内核设备交互。
存储服务
- Block device abstraction layer (bdev):通用的块设备抽象。连接到各种不同设备驱动和块设备的存储协议,类似于文件系统的VFS。在块层提供灵活的API用于额外的用户功能(磁盘阵列,压缩,去冗等)。
- Blobstore:SPDK实现一个高精简的类文件的语义(非POSIX)。这可为数据库,容器,虚拟机或其他不依赖于大部分POSIX文件系统功能集(比如用户访问控制)的工作负载提供高性能支撑。
存储协议
- iSCSI target:实现以太网上块流量的既定规范;效率约为内核 LIO 的两倍。当前版本默认使用内核 TCP/IP 协议栈。
- NVMe-oF target:实现了新的NVMe-oF规范。虽然这取决于RDMA硬件,NVMe-oF target可以为每个CPU核提供高达40Gbps的流量。
- vhost-scsi target:KVM/QEMU 的一项功能,可利用 SPDK NVMe 驱动程序,让客户虚拟机以更低的延迟访问存储介质,并降低 I/O 密集型工作负载的总体 CPU 负载。
基本组件
从流程上来看:SPDK中大概有三类子组件:网络前端、处理框架、后端。
网络前端
- 由DPDK、网卡驱动、用户态网络服务构件组成。DPDK给网卡提供一个高性能的包处理框架;网卡驱动提供一个从网卡到用户态空间的数据快速通道;用户态网络服务则破解TCP/IP包并生成iSCSI命令。
处理框架
- 拿到包的内容,并将iSCSI命令翻译为SCSI块级命令。不过,在将这些命令送给后端驱动之前,SPDK提供一个API框架以加入用户指定的功能,即spcial sauce(上图绿框中)。例如缓存,去冗,数据压缩,加密,RAID和纠删码计算等,诸如这些功能都包含在SPDK中。不过这些功能仅仅是为了帮助我们模拟应用场景,需要经过严格的测试优化才可使用。
后端驱动
- 数据到达了“后端”驱动层,在这里SPDK和物理块设备交互(读和写操作)。如前所述,SPDK提供了用户态的PMD[2],支持NVMe设备、Linux AIO设备(传统spinning硬盘)、RAMDISK设备,以及利用到英特尔I/O加速技术的新设备(CBDMA=3D XPoint?)。这一系列后端设备驱动涵盖了不同性能的存储分层,保证SPDK几乎与每种存储应用形成关联。事实上,英特尔在2015年9月首先开源的SPDK部分就主要包含支持NVMe的用户态轮询模式驱动。
编译安装
参考
Introduction to the Storage Performance Development Kit (SPDK)
开启全新存储时代:SPDK文件系统项目实战指南
初识SPDK,从SPDK的软件架构到使用实操
What is SPDK
SPDK简介
https://blog.erhuoyan.cn/2024/08/22/12a17c1581e0/