基于SPDK的高效NVMe-oF target

作者简介:杨子夜,Intel存储软件开发工程师,主要从事SPDK软件开发工作

文章转载自DPDK与SPDK开源社区

SPDK (Storage performance development kit[1][2][3]) 在2016年7月发布了第一款NVMe-oF target的代码,遵循了NVMe over fabrics 相关的规范 (specification) 。NVMe-oF target 是NVMe协议在不同传输网络 (transport) 上面的延伸。NVMe协议制定了本机高速访问PCIe SSD的规范,相对于SATA,SAS, AHCI等协议,NVMe协议在带宽, 延迟,IOPS等方面占据了极大的优势,当然在价格上目前相对还是比较贵一些。不过无可否认的是,配置PCIe SSD 的服务器已经在各种应用场景中出现,已经成为了业界的趋势。

此外为了把本地高速访问的优势暴露给远端应用, 诞生了NVMe-oF 协议。 NVMe-oF 协议中的 transport 可以多种多样, 诸如 Ethernet, Fibre Channel,Infiniband等。当前比较流行的transport实现是基于RDMA的Ethernet transport, Linux Kernel 和SPDK的NVMe-oF target 都支持, 另外对于FC的transport, Netapp基于SPDK NVMe-oF target的代码,实现了基于FC的transport[3]。

在这篇文章中,我们首先会讨论以下两个问题:
1.NVMe-oF target 是否一定是需要,有什么相应的替代品;
2.为什么要使用SPDK的NVMe-oF target, 和内核提供的实现相比有什么优势?

1. NVMe-oF target 是否是必须品

NVMe-oF target严格来讲不是必需品,在没有该软件的时候,我们可以使用iSCSI target 或者其他解决方案替换。由于iSCSI target 比较成熟和流行,我们有必要进行一下相应的对比,如表1所示。

表1 在以太传输网络上比较NVMe-oF target 和iSCSI target

从表1我们可以看出:

  • 目前NVMe-oF target在Ethernet上的实现,需要有支持RDMA功能的网卡, 比如支持RoCE 或者iWARP。相比较而言,iSCSI 更加通用,有没有RDMA功能关系不是太大;
  • 另外标准的NVMe-oF target 主要是为了目的是为了export PCIe SSD (并不是说不能export 其他块设备), iSCSI target则可以export 任意的block 设备。在这一方面来讲,iSCSI的设计目的无疑更加通用;
  • NVMe-oF target 是NVMe 协议在网络上的扩展,毫无疑问的是如果访问远端的NVMe盘,使用NVMe-oF 协议更加轻量级。直接是NVMe-oF -> NVMe 协议到盘,相反使用iSCSI,则需要 iSCSI ->SCSI -> NVMe 协议到盘。显然在搭载了RNIC + PCIe SSD的情况下,NVMe-oF能发挥更大的优势。

总体而言iSCSI target更加通用,NVMe-oF target的设计初衷则是考虑性能。 当然在兼容性和通用性方面,NVMe-oF target也在持续进步。诸如:

  • 兼容已有的网卡: NVMe-oF新的规范中,已经加入基于TCP/IP 协议的支持。那么NVMe-oF 就可以运行在没有RDMA支持的网卡上。已有的网卡就可以兼容支持iSCSI 以及NVMe-oF 协议, 意味着当用户从iSCSI迁移到NVMe-oF上,可以继续使用旧设备。当然性能来讲,必然没有RDMA网卡支持有优势。
  • 后端存储虚化: NVMe-oF 协议一样可以export 出非PCIe SSD, 使得整个方案兼容。比如SPDK 的NVMe-oF target提供了后端存储的简单抽象。可以虚拟出相应的NVMe 盘。在SPDK 中可以用malloc的bdev或者基于libaio的bdev来模拟出NVMe 盘,把NVMe协议导入到SPDK通用bdev的语义,远端看到的依然是NVMe的盘。当然这个只是协议上的兼容,性能上自然不能和真实的相匹配。不过解决了通用性的问题。

如此,NVMe-oF协议可以做到和iSCSI一样的通用性。当然长时间内,NVMe-oF 和iSCSI还是长期并存的局面。当然ISCSI目前已经非常成熟, 而NVMe-oF则刚刚开始发展,需要不断的完善,并且借鉴iSCSI 协议的一些功能,以支持更多的功能。

2.SPDK高效NVMe-oF target的设计和实现

SPDK的NVMe-oF target 实现要早于Linux Kernel NVMe-oF target的正式发布。当然在新Linux 发行版都自带NVMe-oF target的时候, 大家就会有一个疑问,我们为什么要使用SPDK的NVMe-oF target。 总的来讲SPDK的NVMe- oF target 和内核相比较而言,在单核的性能 ( Performance/ per CPU core) 上有绝对的优势。 这个优势的带来在于以下几个方面:

  • SPDK的NVMe-oF target 可以直接使用SPDK NVMe用户态驱动封装的bdev。相对于内核所使用的内核NVMe 驱动相比,更具有优势。
  • SPDK app编程框架的使用。SPDK NVMe-oF target 完全使用了SPDK所提供的编程框架 (见上次SPDK编程框架文章的介绍), 在所有I/O的路径上都采用了无锁的机制,为此极大的提高了性能。
  • 对RDMA Ethernet transport的高效利用。SPDK目前RDMA transport的实现虽然使用标准的RDMA 编程库 (诸如libibverbs), 但是融入了SPDK的编程框架。目前来讲,每个分给SPDK 的CPU core上运行的reactor 都运行了一个 group poller,这个poller可以负责处理所有所有归属这个CPU core处理的连接(connections), 这些连接贡献一个RDMA的completion queue,所以在多并发连接的情况下可以极大降低了I/O 处理的latency。

总的来讲,SPDK NVMe-oF target的实现还是比较复杂的,代码里面包含着异步编程的理念,包括各种回调函数(call back)。为此笔者稍微做一些简单的梳理:

代码的位置:

    SPDK NVMe-oF target的主程序位于spdk/app/nvmf_tgt 。因为NVMe-oF 和iSCSI 一样都有相应的subsystem (代码位于 spdk/lib/event/subsystems/nvmf) 。 只有在配置文件或者RPC接口中调用了相应的函数,才会触发相应的初始化工作。这部分代码最重要的函数是nvmf_tgt_advance_state,主要通过状态机的形式,来初始化和运行整个NVMe-of target系统。另外一部分代码位于spdk/lib/nvmf, 主要是处理来自远端的NVMe-oF请求,包括transport层的抽象,以及实际基于RDMA transport(rdma transport, rdma.c)的实现。如果想学习SPDK NVMe-oF target 的细节,推荐从位于spdk/lib/event/subsystems/nvmf 目录的nvmf_tgt.c中的spdk_nvmf_subsystem_init函数看起。

3.结语

目前SPDK最新发布的18.04 版本中加入了很多NVMe-oF target的优化,比如连接的组调度; 基于Round Robin 的方式在不同的CPU core之间均衡负载;比如相同core上的连接共享rdma completion queue等等。当然目前NVMe-oF target 还在持续的开发迭代过程中, 一些重要的feature也提上了日程,诸如支持TCP/IP的transport。这个工作分为两部分,一部分是支持基于内核TCP/IP的transport;另外一部分是和用户态的VPP 的TCP/IP 整合。最后欢迎大家踊跃参与SPDK NVMe-oF target的开发,包括提交相应的bug,以及提出改进建议。

Reference:

[1] http://www.spdk.io
[2] https://github.com/spdk
[3] Z. Yang et al., “SPDK: A Development Kit to Build High Performance Storage Applications,” 2017 IEEE International Conference on Cloud Computing Technology and Science (CloudCom), Hong Kong, Hong Kong, 2017, pp. 154-161. https://ieeexplore.ieee.org/document/8241103/
[4] https://www.broadcom.com/company/news/product-releases/2349134


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

登录后才可以评论

SDNLAB君 发表于18-07-04
0