您的位置:首页 > 其它

SPDK简介及基本使用

2018-01-23 15:39 281 查看

一.概述

随着硬盘、闪存技术的高速发展,NVME-ssd已逐渐进入分布式存储的核心领域。伴随着NVME-ssd的出现,涌现出一批新型的存储名词,包括分层存储、分级存储、冷热存储、混合存储等。而这些名词的出现,也意味着ssd在当前大环境下由于其昂贵的价格还无法大量应用。根据预测,ssd价格将在19年末出现大幅下降,藉此,ssd将成为存储领域重要的存储介质。

ssd存储介质正在取代传统数据中心的机械硬盘。ssd无论是从性能、功耗以及密度上都存在巨大的优势,而这些优势将使得ssd成为下一代存储的主要介质。

二.SPDK

众所周知,在Linux起源之初,文件系统io栈针对机械盘进行了众多优化,包括page、cache等多种优化方式。内核采用中断的方式进行DMA将数据从内核态拷贝回用户态,再交由用户程序处理,这是机械硬盘时代的io处理方式。而随着nvme-ssd的出现,如果再采用此种方式就会导致大量的硬盘空闲,浪费硬盘性能。为了帮助上游的应用厂商以及存储厂商更好的发挥ssd磁盘的性能,intel开发了一套基于nvme-ssd的开发套件,SPDK。SPDK的目标是通过使用Intel的网络,处理,存储技术,将固态存储介质出色的功效发挥到极致。

相对于传统IO方式,SPDK运用了两项关键技术:UIO和pooling。

首先,将设备驱动代码运行在用户态,避免内核上下文切换和中断将会节省大量的处理开销,允许更多的时钟周期被用来做实际的数据存储。无论存储算法(去冗,加密,压缩,空白块存储)多么复杂,浪费更少的时钟周期总是意味着更好的性能和时延。这并不是说内核增加了不必要的开销;相反,内核增加了一些与通用计算用例相关的开销,因而可能不适合专用的存储栈。上文也提及到SPDK实际上是为nvme-ssd开发的一套开发组件,并不适用于机械硬盘。

其次,采用轮询模式改变了传统I/O的基本模型。在传统的I/O模型中,应用程序提交读写请求后进入睡眠状态,一旦I/O完成,中断就会将其唤醒。轮询的工作方式则不同,应用程序提交读写请求后继续执行其他工作,以一定的时间间隔回头检查I/O是否已经完成。这种方式避免了中断带来的延迟和开销,并使得应用程序提高了I/O效率。在机械硬盘时代,中断开销只占整个I/O时间的很小的百分比,因此给系统带来了巨大的效率提升。然而,在固态设备时代,持续引入更低时延的持久化设备,中断开销成为了整个I/O时间中不可忽视的部分。这个问题在更低时延的设备上只会越来越严重。系统已经能够每秒处理数百万个I/O,所以消除数百万个事务的这种开销,能够快速地复制到多个core中。数据包和数据块被立即分发,因为等待花费的时间变小,使得时延更低,一致性时延更多(抖动更少),吞吐量也得到了提高。

三.架构



注意:图中各颜色有不通含义

整个spdk开发套件提供了一整套完整的开发库支持。包括:

驱动层:

NVMe driver:SPDK的基础组件,高度优化且无锁的驱动提供了前所未有的高扩展性,高效性和高性能

IOAT:基于Xeon处理器平台上的copy offload引擎。通过提供用户空间访问,减少了DMA数据移动的阈值,允许对小尺寸I/O或NTB(非透明桥)做更好地利用。

块设备层:

NVMe over Fabrics(NVMe-oF)initiator:本地SPDK NVMe驱动和NVMe-oF initiator共享一套公共的API。本地远程API调用及其简便。

RBD:将rbd设备作为spdk的后端存储。

Blobstore Block Device:基于SPDK技术设计的Blobstore块设备,应用于虚机或数据库场景。由于spdk的无锁机制,将享有更好的性能。

Linux AIO:spdk与内核设备(如机械硬盘)交互。

存储服务层:

bdev:通用的块设备抽象。连接到各种不同设备驱动和块设备的存储协议,类似于文件系统的VFS。在块层提供灵活的API用于额外的用户功能(磁盘阵列,压缩,去冗等)。

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

存储协议层

iSCSI target:现在大多使用原生iscsi

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包括了几种存储介质的用户态轮询模式驱动:

NVMe设备;

inux异步IO设备如传统磁盘;

基于块地址的内存应用的内存驱动(如RAMDISKS);

可以使用Intel I/O加速技术设备。

四.编译使用

4.1下载代码

git clone https://github.com/spdk/spdk.git git submodule update –init


4.2 编译dpdk

cd spdk/script
./pkgdep.sh  //在编译之前,需安装依赖
make install T=x86_64-native-linuxapp-gcc DESTDIR=.


4.3 编译spdk

cd ..
make DPDK_DIR=./dpdk/x86_64-native-linuxapp-gcc


4.4 配置spdk

sh scripts/setup.sh


至此,spdk的基本安装已经完成,下面要做的就是插入nvme ssd设备并进行测试。测试代码在examples下。

4.5 实现原理

通过UIO这个的驱动接口,将驱动中共性的一部分放在内核态实现,eal层次通过解析sysfs的相关节点获取设备信息(bar,function等)传递给用户态的设备模型,之后eal层次用mmap建立内核和用户空间的数据传递通道和同步机制,实现了驱动的用户态功能实现。

Spdk提供了多种存储接口(scsi,nvme等)不同层次的操作接口,可以供用户直接调用完成设备识别,控制,数据传输等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spdk nvme-ssd ceph