SPDK 加速框架介绍

作者:Yang Ziye
文章来源:DPDK与SPDK开源社区

加速内存操作的利器
—SPDK 加速框架介绍

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

SDPK加速框架介绍

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

I. 抽象层:

提供统一的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。


图 1 SPDK Acceleration Framework的

抽象和现状

II. 具体实现层:

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

a. module/accel/ioat: 这个目录中的代码主要实现了怎么管理,加载使用CBDMA (Crystal Beach DMA) 设备。SPDK 用户态IOAT代码的具体实现位于SPDK repo [2]的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 设备,总有自己的一些初始化,销毁或者使用的方法。这样就可以完全把每个驱动使用的细节对上层用户隐藏起来。


图 2 SPDK IDXD 驱动管理

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

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

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

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

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

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

III. 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)以及相关的使用场景。目前这个加速框架的开发在不断的更新和完善中。对于客户比较关心的性能问题,比如利用SPDK 加速框架中的IDXD 模块(即使用DSA的设备)。等到Intel 发布SPR (Sapphire Rapids [5])平台后,我们会在后续的微信文章中进行相应的介绍。


  • 本站原创文章仅代表作者观点,不代表SDNLAB立场。所有原创内容版权均属SDNLAB,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用,转载须注明来自 SDNLAB并附上本文链接。 本站中所有编译类文章仅用于学习和交流目的,编译工作遵照 CC 协议,如果有侵犯到您权益的地方,请及时联系我们。
  • 本文链接https://www.sdnlab.com/25328.html
分享到:
相关文章
条评论

登录后才可以评论

SDNLAB君 发表于21-09-10
0