SPDK加速框架介绍

加速内存操作的利器

--SPDK 加速框架介绍

SPDK从去年7月(20.07 release)开始,开始发布SPDK 加速框架(SPDK acceleration framework)的模块,这个模块可以对支持内存操作卸载的硬件(诸如I/OAT或者DSA)进行抽象和封装,使得上层软件层可以简便的使用,从而卸载CPU的一些工作量。

SDPK加速框架介绍

图1给出了SPDK 加速框架(Acceleration Framework)的抽象图,主要分为以下几个部分:

1. 抽象层:

提供统一的API接口。SPDK的Acceleration Framework 主要支持以下几种的内存加速操作:

  • a. 内存拷贝(ACCEL_COPY)
  • b. 内存填充(ACCEL_FILL)
  • c. 内存比较(ACCEL_COMPARE)
  • d. 内存双播(ACCEL_DUALCAST)
  • e. 内存CRC32C的计算 (ACCEL_CRC32C)
  • f. 内存的DIF操作(ACCEL_DIF)主要用于一些存储协议中的使用,诸如NVMe over Fabrics.
  • g. 内存的拷贝加CRC32C操作 (ACCEL_COPY_CRC32C)

一些常用的API 包括spdk_accel_batch_prep_crc32c,spdk_accel_submit_copy等。目前代码位于如下的位置:

  • 头文件位于:include/spdk/accel_engine.h (外部头文件), spdk_internal/accel_engine.h(内部头文件)。
  • C 代码位于:lib/accel。

SPDK加速框架介绍_第1张图片

图 1 SPDK Acceleration Framework的

抽象和现状

2. 具体实现层:

代码位于和module/accel。其中主要实现了怎么使用各个不同的硬件设备,比如图1中的IOAT和IDXD模块。

a. module/accel/ioat: 这个目录中的代码主要实现了怎么管理,加载使用CBDMA (Crystal Beach DMA) 设备。SPDK用户态IOAT代码的具体实现位于SPDK repo的lib/ioat中。

b. module/accel/idxd: 这个目录中的代码主要实现了怎么管理,加载使用DSA(Data Streaming Accelerator)设备。当然对于这个设备在SPDK中可以有两种模式可以使用:

(1) 即加载SPDK 自己实现的用户态驱动;

(2) 使用kernel idxd 驱动。目前相应的代码实现位于SPDK repo的lib/idxd中。

此外,我们稍微介绍一下IDXD module的管理,如图2所示。首先无论是使用内核还是用户态的IDXD的驱动,SPDK对外都提供统一的接口,代码位于include/spdk/idxd.h。IDXD的管理可以分为管理的API (management API) 和数据面相关的API (Data I/O相关的API) 。

管理的API主要功能上是DSA设备的attach, detach, Work queue 配置等相关的操作;DATA I/O API则是一些内存加速操作卸载的API,诸如copy,crc32c,fill等的卸载。然后我们还定义了transport的抽象,使用内核或者用户态驱动去使用DSA设备,总有自己的一些初始化,销毁或者使用的方法。这样就可以完全把每个驱动使用的细节对上层用户隐藏起来。

SPDK加速框架介绍_第2张图片

图 2 SPDK IDXD 驱动管理

有了SPDK加速框架,具体的SPDK应用包括SPDK内部的各个模块可以直接调用这个框架,而不必关心底层的不同加速硬件的具体实现。这样提高了易用性。

SPDK加速框架的主要使用场景

由于SPDK 整个编程框架的思想是异步(asynchronous),所以SPDK加速库所提供的API 都是异步接口。也就是用户调用了这个函数,并不是相应的内存加速操作直接完成了。只有当用户提供的回调函数被执行的时候,才是这个操作真正完成的时候。所以在使用SPDK加速框架的API的时候,在应用集成的时候,需要把用同步方法使用的内存操作,完成替换成异步的模式,这个需要一定的代码修改。

目前SPDK的加速框架在SPDK 各个模块的集成,主要涉及到以下几个模块:

1. 在SPDK bdev中的使用。比如目前在SPDK malloc bdev中,使用了加速框架的ACCEL_COPY的API (spdk_accel_submit_copy)。比如在SPDK nvme bdev模块中,使用了加速框架的ACCEL_CRC32相关的API (spdk_accel_submit_crc32cv),主要用于crc32c计算的卸载。

2. 在SPDK nvmf中的使用。主要使用在NVMe-oF target的TCP transport中,集成了加速框架的ACCEL_CRC32相关的API (spdk_accel_submit_crc32cv),主要用于NVMe-oF TCP PDU的crc32c计算的卸载。

3. SPDK提供的accel_perf 程序。为了更好展示出SPDK加速框架的使用方法,以及展示一些性能。SPDK library 开发了accel_perf这个工具,代码位于examples/accel/perf中。SPDK 用户可以使用这个工具进行一些测试,并且根据这个应用,构建自己的内存加速的一些解决方案。以下命令给出了accel_perf进行crc32c测试的一个用例。

build/examples/accel_perf -q 128 -o 4096 -t 2 -w crc32c -y

目前这些模块的集成和使用仅仅是一个开始,SPDK项目会不断的进行新的集成和优化。

总结和后续

这篇文章中主要介绍了 SPDK 中的加速框架(acceleration Framework)以及相关的使用场景。目前这个加速框架的开发在不断的更新和完善中。

原文链接:https://blog.csdn.net/weixin_37097605/article/details/119922627

更多DPDK学习资料有需要的可以自行添加进入学习交流君 羊 793599096 免费获取,或自行报名学习,免费订阅,永久学习,关注我持续更新哦!!!

学习地址:http://ke.qq.com/course/5066203?flowToken=1043717

你可能感兴趣的:(linux,运维,服务器,网络协议,网络)