SPDK NVMe-oF Target

简介: SPDK NVMe-oF Target

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等技术内容,立即学习

相关文章
|
6月前
|
存储 固态存储 数据库
SSD接口选择指南:PCIe与SATA性能大比拼
【4月更文挑战第21天】
1403 0
|
固态存储 IDE 开发工具
【实战经验分享】如何对SSD固态硬盘下发SCSI command?
目前可以供用来下发SCSI/ATA Command的工具有很多,比如BusHound, Hdparm, Sg3, Msecli等。其中Msecli是Micron自己的专门用来管理Micron SSD的命令行接口, 对于其他家的SSD是无效的。我们这里主要用的Sg3这个工具
|
3月前
|
存储 固态存储 Linux
在Linux中,什么是SSD和HDD,作用分别是什么?
在Linux中,什么是SSD和HDD,作用分别是什么?
|
6月前
|
存储 固态存储 API
spdk关于nvme模块的实例helloword代码
spdk关于nvme模块的实例helloword代码
RK3399平台开发系列讲解(高速设备驱动篇)6.54、PCIe对PCI配置空间的扩展
RK3399平台开发系列讲解(高速设备驱动篇)6.54、PCIe对PCI配置空间的扩展
352 0
RK3399平台开发系列讲解(高速设备驱动篇)6.54、PCIe对PCI配置空间的扩展
|
Linux
【PCIe 6.0】PCIe 6.0 新特性 - DMWr (Deferrable Memory Write) 详解
【PCIe 6.0】PCIe 6.0 新特性 - DMWr (Deferrable Memory Write) 详解
1236 0
【PCIe 6.0】PCIe 6.0 新特性 - DMWr (Deferrable Memory Write) 详解
|
固态存储 测试技术 BI
基于TMS320C6657+ZYNQ7035/45平台-PL端 NVMe 的 exFAT 文件系统 FPGA IP
基于广州星嵌电子科技有限公司TMS320C6657+ZYNQ7035/45评估板的PL端实现标准NVMe 1.3协议的Host端,即纯逻辑实现NVMe Host IP设计分享。
基于TMS320C6657+ZYNQ7035/45平台-PL端 NVMe 的 exFAT 文件系统 FPGA IP
|
存储 固态存储 Java
你所不知道到的NVMe
作者:查斌 马涛
2119 0
你所不知道到的NVMe
|
存储 固态存储 Java
不用闪存了,Optane SSD为何还要28%的OP?
3D XPoint的容量超配比例,为啥跟SSD这么像?
1984 0
|
存储 开发工具 IDE
存储基础:ATA、SATA、SCSI、SAS、FC
一、概述 关于存储,作为一名运维工程师我觉得是很有必要去花点时间去了解一下的!磁盘是服务器、存储设备的主要存储媒介之一,非常重要! 按照存储介质类型一般分为机械磁盘(HDD、传统磁性硬盘)、固态磁盘(SSD,主要使用闪存颗粒来存储)、混合磁盘(HHD,磁性硬盘和闪存集成到一起的硬盘)。
2487 0