SPDK NVMe-oF Target
NVMe协议制定了本机 高速访问PCIe SSD的规范
,相对于SATA、SAS、AHCI等协议, NVMe协议在带宽、延迟、IOps等方面占据了极大的优势
,但是在价格上目前相对来讲还是比较贵的。不过不可否认的是,配置PCIe SSD的服务器已经在各种应用场景中出现,并成为业界的一种趋势。
此外为了把本地高速访问的优势暴露给远端应用,诞生了NVMe-oF协议
。NVMe-oF Target是NVMe协议在不同传输网络(transport)上面的延伸
。NVMe-oF协议中的transport可以多种多样,如以太网、光纤通道、Infiniband等。当前比较流行的transport实现是基于RDMA的Ethernet transport
、Linux Kernel和SPDK的NVMe-oF Target等,另外对于光纤通道的transport,NetApp基于SPDK NVMe-oF Target的代码,实现了基于光纤通道的transport。
NVMe-oF Target严格来讲不是必需品,在没有该软件的时候,我们可以使用iSCSI Target或其他解决方案来替换。由于iSCSI Target比较成熟和流行,我们有必要把NVMe-oF Target与iSCSI Target进行对比
- 目前NVMe-oF Target在以太网上的实现,需要有支持RDMA功能的网卡,如支持RoCE或iWARP。相比较而言,iSCSI Target更加通用,有没有RDMA功能支持关系不是太大。
- 标准的NVMe-oF Target主要是为了导出PCIe SSD(并不是说不能导出其他块设备),iSCSI Target则可以导出任意的块设备。从这一方面来讲,iSCSI Target的设计目的无疑更加通用。
- NVMe-oF Target是NVMe协议在网络上的扩展,毫无疑问的是如果访问远端的NVMe盘,使用NVMe-oF协议更加轻量级,直接是NVMeoF→NVMe 协 议 到 盘 , 相 反 如 果 使 用 iSCSI Target , 则 需 要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协议一样可以导出非PCIe SSD,使得整个方案兼容。比如SPDK的NVMe-oF Target提供了后端存储的简单抽象,可以虚拟出相应的NVMe盘。在SPDK中可以用malloc的块设备或基于libaio的块设备来模拟出NVMe盘,把NVMe协议导入SPDK通用块设备的语义中。当然远端看到的依然是NVMe盘,这只是协议上的兼容,性能上自然不能和真实的相匹配,但是这解决了通用性的问题
。
SPDK在2016年7月发布了第一款NVMe-oF Target的代码,遵循了NVMe over fabrics相关的规范。SPDK的NVMe-oF Target实现要早于Linux Kernel NVMe-oF Target的正式发布。当然在Linux发行版都自带NVMeoF Target的时候,大家就会有一个疑问,我们为什么要使用SPDK的NVMe-oF Target。
SPDK 的 NVMe-oF Target 和 内 核 相 比 , 在 单 核 的 性 能(Performance/per CPU core)上有绝对的优势
。
- SPDK的
NVMe-oF Target可以直接使用SPDK NVMe用户态驱动封装的块设备
,相对于内核所使用的NVMe驱动更具有优势。 - SPDK NVMe-oF Target完全使用了SPDK提供的编程框架,在所有I/O的路径上都采用了
无锁的机制
,为此极大地提高了性能。 - 对RDMA Ethernet transport的高效利用。
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的实现。
目前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进行整合。
推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习