在上一期中,我们介绍了如何在虚拟化环境中,利用SPDK和vHost来充分发挥本地NVMe盘的性能。但是,当虚拟化进化到云计算时代,更多的场景是使用云网络中的远端云盘(虚拟化块存储)。
在前面的专题中,我们已经充分理解,虚拟机访问远端云盘时,需要通过以太网,访问协议可以为标准的iSCSI,或非标准协议,如下图所示:
正如iSCSI实现了以太网上承载SCSI,大大提升了扩展性一样,NVMe标准作为SCSI的下一代存储访问标准,能不能通过以太网等方式,让它突破机箱内部的PCIe总线限制,实现远端存储的挂载呢?实际上,早在2016年,NVMe标准组织就制定了新的标准——NVMe over Fabric。
NVMe over Fabric 有三种标准:
1. NVMe over FC。FC也就是我们前文中分(pi)析(pan)过的FibreChannel网络,属于Brocade和CISCO的卡特尔垄断领域(卡特尔,辛迪加,托拉斯和康采恩是4种垄断组织的形式,详解可参见《西方经济学》教科书)。从技术层面分析,FC网络在扩展性方面也有难以克服的缺陷,因而,NVMe over FC属于非主流的一种实现;
2. NVMe over RDMA。RDMA(Remote Direct Memory Access)最初是基于IB(InfiniBand)网络的,而IB网络设备掌控在Mallenox(现为NVidia的子公司),其垄断程度比FC有过之而无不及。
3. NVMe over RoCE。RoCE (RDMA over Converged Ethernet)是在以太网上运行RDMA的一种方式,可以让远端主机的CPU无感知的情况下,读写远端主机授权的地址空间的数据。由于以太网是开放和易扩展的,RoCE很快成为了RDMA的主流实现。
那么,为什么我们可以通过RDMA的方式,将NVMe协议拉远到远端的主机呢?
让我们回顾一下关于RDMA的这张经典的架构图:
在支持RDMA的应用中,可以调用RDMA相关的API,给定远端主机的内存地址,从而绕过远端主机CPU对远端主机上指定的地址进行读写。
而NVMe协议最初是通过PCIe实现的。我们知道,PCIe的所有操作,最终将指向对PCIe配置空间(Configuration Space)的读写。一个普通PCIe设备的配置空间结构如下图:
对PCIe设备进行编程时,实际上就是对BAR(Base Address Registers)加上上图中的偏移量得到的寄存器地址进行读写的过程。当然,无论是在用户态还是内核态,都需要将这个寄存器地址在TLB中进行映射后,才能在程序代码中使用。
我们发现了什么?原来,我们只需要在远端主机操作系统初始化时,将NVMe盘控制器的PCIe配置空间映射的地址,授权给支持RoCE的网卡可读写,并在RDMA的命令字中,将远端主机上,NVMe盘控制器的PCIe配置空间的地址作为remote address参数,就可以操作远端主机的NVMe盘了!
由于NVMe Over RoCE的引入,使得云存储的性能进一步提升,时延也降低到了us级别。实际上,在公开运营的公有云上,为了满足超高性能和低延迟的工作负载,已经出现了基于NVMe Over RoCE的极速型云盘等产品。
云存储技术在前沿技术的加持下,也成为了拥有无限未来的少年。
愿他能拥有星辰大海。