CherieLi Student

spdk

2021-06-02
CherieLi

spdk - Storage Performance Development Kit

SPDK是由英特尔发起的,用于加速NVMe SSD作为后端存储使用的应用软件加速库。这个软件库的核心是用户态,异步,轮询方式的NVMe驱动。相比内核的NVMe驱动,SPDK可以大幅降低NVMe command的延迟,提高单CPU核的IOPS,形成一套高性价比的解决方案,如SPDK的vhost解决方案可以被应用到HCI中加速虚拟机的NVMe I/O。

    SPDK的核心组件之一就是用户态NVMe驱动。

1.用户态驱动

    用户态驱动出现的目的就是减少软件本身的开销,包括这里所说的上下文切换,系统调用等。在用户态目前可以通过UIO(Userspace I/O)或VFIO(Virtual Function I/O)两种方式对硬件固态硬盘设备进行访问。     大页(Hugepage),通过使用HugePage分配大页可以提高性能。因为页大小的增加,可以减少缺页异常。例如,2MB大小的内容(假设是2MB对齐),如果是4KB大小的页粒度,则会产生512次缺页异常,但是使用2MB大小的页,只会产生一次缺页异常。大页的缺点:需要额外配置,需要应用程序事先预估使用多少内存,大页需要在进程启动之前实现启用和分配好内存。

2.SPDK用户态驱动

Linux内核NVMe驱动和SPDK NVMe驱动实现的区别:

功能比较 内核NVMe驱动 SPDK NVMe驱动
工作模式 中断 异步轮询方式
I/O路径是否需要同步 CPU之间需要同步 CPU之间以无锁方式运行
是否需要系统调用 需要 不需要,直接通过
I/O内存页管理 DMA内存页映射 大页,通过hugetlbfs
块设备支持 通过内核通用块设备层 专门为Flash优化(此外SPDK也提供用户态块设备层)

  1)异步轮询方式     SPDK用户态驱动对设备完成状态的检测,是通过异步轮询的方式来实现的,进而避免了对中断的依赖。轮询到操作完成时会触发上层的回调函数,这样使得应用程序无须等待读或写操作的完成,就可以按需发送多个请求,再由回调函数处理。由此来提高应用的读/写性能。   

2)无锁化     在数据通道上去掉对锁的依赖。这里主要考虑以下问题。 ·读/写处理要在一个CPU核上完成,避免核间的缓存同步(可以通过线程亲和性的方法,将某个处理线程绑定到某个特定的核上。同时通过轮询的方式占住该核的使用,避免操作系统调度其他的线程到该核上面) ·单核上的处理,对资源的分配是无锁化的。(mempool,无锁队列,环)   

3)专门为Flash来优化     通过UIO或VFIO把PCI设备的BAR(Base Address Register)地址映射到应用进程的空间,这样SPDK用户态驱动就可以遵循NVMe的规范来初始化NVMe SSD,创建出最基本的I/O发送和完成队列,最终实现对NVMe SSD设备的I/O读或写操作。

3.spdk架构

be5fb39dde6b9ac92ee94c4297cef8e3_835x401 png@900-0-90-f

最下层为驱动层,中间层为通用块层,最上层为存储协议层。

SPDK是专门为NVMe开发的用户空间驱动,放弃原有系统调用模式,是基于以下两个原因:

(1)NVMe设备的IOPS很高,如果按照传统的系统调用,需要先从内核空间返回用户空间,这些开销对NVMe而言就比较大了;

(2)内核块层是通用的,而作为存储产品这些设备是专用的,不需要传统的I/O调度器。

创池前,nvme盘在内核态;创池后,nvme盘被spdk纳管为用户态。
(modprobe命令用于智能地向内核中加载模块或者从内核中移除模块。 modprobe可载入指定的个别模块,或是载入一组相依的模块。)

nvme.conf.in 该文件存在则代表SPDK已经生效,不存在则代表未生效。

install_spdk.sh
spdk_setup.sh

参考文档

https://www.intel.cn/content/www/cn/zh/developer/articles/tool/introduction-to-the-storage-performance-development-kit-spdk.html

https://www.cnblogs.com/whl320124/articles/9969395.html

https://github.com/spdk/spdk

https://rootw.github.io/2018/05/SPDK-all/


上一篇 git学习

下一篇 socket网络编程

Comments

Content