众所周知,NVMe 是一个逻辑设备接口规范,NVM代表非易失性存储器(Non-Volatile Memory)的首字母缩略字,是固态硬盘(SSD)的常见的闪存形式。SSD 通常分为两类接口:和 NVMe。在需要兼容旧组件且性能不是首要考虑因素时,SATA 接口在新一代驱动器中依然可用。SATA 诞生于2000年,原本是为配备旋转盘片和磁头的传统硬盘设计的。
虽然这类设备可提供稳定的数据吞吐量,但由于包含大量机械组件,每次读/写操作都会带来很明显的延迟。这些硬件上的局限也制约了SATA接口规范和其整体性能。
对于企业级应用,SAS 接口通常作为SATA的替代选择,两者都是ATA和SCSI接口的进化版,它们都利用串行链路发送既有命令。无论使用SAS还是SATA,都需要在CPU和磁盘之间配置硬盘驱动器控制器。
随着新一代固态硬盘的推出,其理论性能已接近甚至超越RAM,远超传统HDD,因此就需要一种全新的访问接口来发挥其潜力。
2011年,NVMe(非易失性存储器Express)接口应运而生。这一接口专为利用低延迟和高闪存性能而设计。其物理连接器则根据应用场景不一样:在客户端设备上,由于无需热插拔且重量和空间更为关键,因此M.2尺寸是常见选择。而借助Thunderbolt 3接口,PCIe设备可作为USB-C可插拔设备连接,NVMe驱动器也常以这种形式出现(不过,只有当较新的USB标准支持超过SATA的带宽时,这样的设备作为NVMe驱动器才具有实际意义)。
NVMe驱动器确实具备作为PCIe扩展卡插入PCIe插槽的能力,但这种应用相对少见,因为它占用的是那些通常优先用于安装GPU卡的宝贵插槽。在计算服务器环境中,NVMe驱动器更为常见地以M.2(常作为启动设备使用)和U.2(专门用于数据存储)的形式呈现。
从设计角度来看,NVMe规范定义了一种简洁高效的协议,仅包含13条基础命令。为了最大化并行解决能力,这些命令可以在高达64K个I/O队列上执行,每个队列可容纳64K条命令。这种设计使得NVMe的性能远超SATA规范,高出近三个数量级。
就远程访问存储而言,有两种方法:NAS(网络附加存储)和 SAN(存储区域网络)。对于个人用户及小型团队来说,NAS 是一种理想的选择,而大型组织和企业则更倾向于采用 SAN。
NAS 通常用于小型家用文件服务器环境中,它通过一组用户友好的网络协议来挂载存储,最常见的是使用 NFS(网络文件系统)和 SMB(服务器消息块)协议来访问文件系统。NAS 的一个显著特点是它直接处理文件系统层,并充当文件服务器,这与 SAN 有着本质的区别。
相比之下,SAN 设备则专注于提供块存储服务,而将文件系统层的管理交由客户端负责。这就引出了一个问题:客户端是如何访问远程服务器上的块设备的呢?
在深入探讨之前,我们先来了解一下 SCSI(小型计算机系统接口),这是一个自20世纪80年代起就存在的存储访问标准。跟着时间的推移,其命令集被大范围的应用于多种新型协议,如 SAS(串行连接 SCSI)和 USB 连接 SCSI。在 SAN 中,SCSI 被用作远程访问块存储的协议。具体来说,SCSI 命令会被封装在网络协议中,并在 iSCSI 客户端(发起方)和具有存储资源的 iSCSI 服务器(目标)之间进行交换。实现这一功能的主要传输协议包括 TCP(在 iSCSI 中使用)和光纤通道协议(FCP),而 FCP 本身也能更加进一步通过以太网(FCoE)进行封装。这种灵活性和兼容性使得 SAN 成为了大型企业级存储解决方案的首选。
图 2:SCSI 和 NVMe 作为远程块存储协议,来源:Piyush Gupta
iSCSI和NVMe均被用作远程访问块存储的协议,且两者均依赖于Fabric network(结构网络)作为主要的传输方式。这里的“Fabric network”是一个宽泛的概念,用于描述抽象的基础设施层。无论是通过本地网络连接还是利用隧道技术跨数据中心连接,设备的连接方式并不构成主要考量因素。重点是主机期望网络能在带宽和延迟方面提供最佳性能,以确保数据传输的高效性和实时性。
最初,NVMeoF是作为独立规范发布的,独立于 NVMe。然而,随着其成功的应用与实施,NVMeoF逐渐融入并成为了NVMe标准体系的重要一环。NVMeoF 的引入使得NVMe命令可以通过多种传输方式得以封装,进而将协议的可用性扩展至跨网络结构的主机与存储之间的数据传输。
这一概念与基于SCSI的协议(如iSCSI或iSER)有着异曲同工之妙。原本为本地存储访问设计的命令集,经过重新设计后,如今能够在存储服务器与主机之间利用互联网进行通信。
与iSCSI相似,NVMeoF的发起方和目标方(即客户端与服务器)会建立连接并交换命令。虽然它们的NVMe堆栈主要以软件形式实现,但考虑到目标方常常要为多个发起方提供服务,而发起方又在大多数情况下要访问多个分散的驱动器,因此能通过将命令解封装转移至专用硬件(例如 DPU)来实现更好的性能。
与SCSI相比,NVMe协议支持并行I/O操作,无需进程间锁定,从而大幅度的提升了效率。此外,NVMe还优化了会话交互:单次数据传输仅需一次往返和两次交互,相较于SCSI的两次往返和四次交互,极大地减少了交互次数。这些优势在NVMeoF中得到了充足表现,由于引入了网络延迟,减少往返时间成为了提升整体性能的关键因素。
首先我们介绍用于访问主机内本地存储的内存传输。这种传输方式通过本地总线与存储设备做通信,设备通常与PCIe或其他本地总线技术(如Compute Express Link,简称CXL,或Advanced Extensible Interface,简称AXI)连接。
NVMeoF扩展了NVMe命令集在基于消息的传输中的应用。目前,RDMA和 TCP 传输由NVMe指定,光纤通道上的NVMe(FC-NVMe)则由INCITS(InterNational Committee for Information Technology Standards)组织管理。对于NVMe/TCP,发起方和目标方之间会建立TCP连接,NVM子系统通过此连接进行通信,交换NVMe/TCP协议数据单元。此TCP连接同时用于命令和数据的传输,通常由内核网络堆栈在软件中处理。虽然这种方法具有无需特殊网络配置的便利性,但由于软件处理的引入,它可能会导致性能直线下降并增加额外的计算资源需求。
相比之下,FC-NVMe利用光纤通道的可靠性、并行性和多队列功能,在现有的FC网络上提供高效的消息传输。与NVMe/TCP相比,FC-NVMe由于协议设计更为精简,因此在CPU开销方面表现更为优秀。
然而,有必要注意一下的是,无论是NVMe/TCP还是FC-NVMe-2,它们均未充分的利用能够加速RDMA的现代卸载网卡。为了弥补这一不足,NVMe标准特别指定了RDMA传输方式。RDMA允许数据在应用程序的内存空间与远程主机的内存空间之间直接传输,无需内核的介入。这不仅减少了CPU的开销,还降低了数据传输的延迟,为高性能存储访问提供了强有力的支持。
这里的核心概念在于应用程序(如使用 NVMe 的数据库)和设备(即 NVMe 驱动器)能够直接读取和写入网卡内存缓冲区,绕过传统的内核网络堆栈。
RDMA网络技术通常基于InfiniBand或以太网。InfiniBand是一个高性能的L2网络标准,RDMA是InfiniBand的一个核心功能。而以太网本身并不直接支持RDMA。
InfiniBand网络专为HPC(高性能计算)数据中心设计,提供高吞吐量、低延迟和QoS(服务质量)功能,它使用自己独有的链路、网络和传输协议。在InfiniBand网络中,RDMA数据包通过其特定的传输协议发送。然而,由于InfiniBand网络设备和NIC的供应商相对较少,基于以太网的RDMA解决方案在市场中更受欢迎。
要在以太网上实现RDMA,网络结构必须支持无损传输。标准以太网并不保证这一点,因此就需要进行相应的增强或使用特定的上层传输协议。由于现代网络方法非常灵活,因此在硬件供应商的支持下,能轻松实现这一目标。
所有这些技术共存,并各自提供不同的优势。在数据中心环境中,为实现最佳性能,InfiniBand 或 RoCE 通常是首选。在某些特定场景中,专用集群网络也能作为一个可行的网络解决方案。而在 DCB 配置复杂或需要跨越公共互联网部署时,iWARP 技术可能更为合适。
NVMeoF 的概念是基于SCSI规范慢慢地发展而来的。尽管旧有的技术已被证明是可靠且实用的,但随着固态硬盘的广泛应用,人们对更高效的协议需求日渐增长。直接比较不同的协议可能较为复杂,因为不同的应用程序有不同的需求。因此,寻找一个同时支持 NVMe 和 SCSI over RDMA 的设备成为了一个挑战。然而,无论采用何种传输方式,NVMeoF 无疑是当今SAN网络中的领先技术。
*博客内容为网友个人发布,仅代表博主个人自己的观点,如有侵权请联系工作人员删除。