SPDK简介及基本使用

一.概述

随着硬盘、闪存技术的高速发展,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架构
注意:图中各颜色有不通含义

整个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等)不同层次的操作接口,可以供用户直接调用完成设备识别,控制,数据传输等。

  • 9
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SPDKNVMe库可以使用vhost来实现NVMe设备的虚拟化。vhost是一种虚拟化技术,它允许虚拟机通过网络直接访问物理设备,从而实现高性能的I/O传输。 在SPDK中,使用vhost来实现NVMe设备的虚拟化需要进行以下步骤: 1. 创建vhost控制器。首先需要在主机上创建一个vhost控制器,用于管理虚拟化NVMe设备的访问。可以使用Linux内核提供的vhost-net模块来创建vhost控制器。 2. 绑定NVMe设备。将物理NVMe设备与vhost控制器进行绑定,使得虚拟机可以通过vhost控制器来访问物理NVMe设备。可以使用SPDK提供的vhost命令行工具来进行绑定操作,具体命令如下: ``` $ ./vhost -r /dev/nvme0n1 -c /tmp/vhost_ctrl ``` 其中,`/dev/nvme0n1`是要绑定的物理NVMe设备的名称,`/tmp/vhost_ctrl`是vhost控制器的路径。 3. 启动vhost控制器。使用vhost命令行工具启动vhost控制器,使得虚拟机可以通过vhost控制器来访问物理NVMe设备。具体命令如下: ``` $ ./vhost -u 1 -c /tmp/vhost_ctrl ``` 其中,`-u 1`表示启动一个编号为1的vhost控制器。 4. 在虚拟机中配置vhost设备。在虚拟机中配置vhost设备,使得虚拟机可以通过vhost控制器来访问物理NVMe设备。具体配置方法可以参考QEMU的文档。 通过上述步骤,就可以使用vhost来实现NVMe设备的虚拟化了。虚拟机可以通过vhost控制器来访问物理NVMe设备,从而实现高性能的I/O传输。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值