RDMA 技术基于传统以太网的网络概念,但与以太网网络中的同类技术存在差异。关键区别在于,RDMA 提供了一种消息服务,应用程序可以使用该服务直接访问远程计算机上的虚拟内存。RDMA 通过绕过软件协议栈和避免不必要的数据复制来实现低时延、降低 CPU 占用率、减少内存带宽瓶颈和提供高带宽。RDMA 提供基于通道的 I/O,该通道使得应用程序可以使用 RDMA 设备直接读取和写入远程虚拟内存。
在传统的以太网应用场景中,运行在用户态的应用程序通过调用套接字(socket)API 从操作系统请求网络资源,然后使用这些 API 执行数据收发。RDMA 应用也依赖操作系统,但只是使用操作系统建立通道,而后允许用户态的程序直接操作硬件交互信息,无须内核态程序的进一步协助。这些信息交互方式可以是 RDMA Read、RDMA Write、Send 和 Receive。另外,RDMA协议 InfiniBand 和 RoCE 还支持多播传输。
目前 RDMA 已经是一个比较成熟的架构,主要应用在高性能计算(HPC)领域和大型数据中心中,典型的应用场景包括分布式神经网络计算(比如 TensorFlow+MPI+RDMA)和大数据存储(比如 HDFS+RDMA+NVMe)等。
RDMA的控制通路需要进入内核态准备通信所需的各种资源,比如创建和配置后面章节会介绍的各 RDMA 基本元素(如 CQ、QP 等),主要操作由软件完成,硬件接受配置。数据通路专门负责数据收发,由软件和硬件合作完成RDMA Write(写)、RDMA Read(读)、Send(发送)和 Receive(接收)等操作。

以 Send 和 Receive 操作为例,一次 RDMA 通信的过程简单描述如下。

上图展示了使用 RDMA 方案时,用户数据在两个运行在不同机器上的应用程序之间传递的过程。图中的机器 1 为发送端,机器 2 为接收端。包括在网线/光纤上的数据传输,整个数据传递过程共进行了 3 次数据复制,按照编号依次如下。
① 发送端网卡通过 DMA 操作,从主机内存的用户空间将数据复制到自己的硬件内部缓存中,并进行封装,即添加各层协议报头和校验信息。
② 发送端网卡通过网线/光纤将封装好的数据发送给接收端的网卡。
③ 接收端网卡接收到数据后,先进行数据解析,即把各层协议报头和校验信息剥离,然后将硬件缓存中的数据通过 DMA 操作复制到主机内存的用户空间。
本地内存零复制,即省去了数据在主机内存的用户空间和内核空间之间复制的步骤,降低了整个数据收发过程的时延。
内核旁路(bypass),即数据通路绕过内核,避免了系统调用和上下文切换的时间开销。
把数据包的封装和解析工作交由网卡来实现,降低了 CPU 负载。
在一个系统中,内核协议栈方案和 RDMA 方案是可以共存的。RoCE 类型的 RDMA 网卡可以同时支持以太网和 RDMA。下图从数据通路的角度比较了在同一系统中运行的(APP1 使用的)以太网方案和(APP2 使用的)RDMA 方案的区别。可见 RDMA 方案的数据通路已经进行了充分的简化,几乎卸掉了所有的包袱。

不过,相对于以太网方案,RDMA 方案对网卡提出了新的要求,主要有两点。
通信领域出现率最高的性能指标就是带宽和时延。简单来说,所谓带宽是指单位时间内能够传输的数据量(比如 100Gbit/s),而时延指的是数据从本端发出到被对端接收所消耗的时间。相比传统以太网,RDMA 技术实现了更低的时延,所以 RDMA 能够在很多对时延要求较高的场景中(比如分布式神经网络多个计算节点间的数据同步)得以发挥作用。

InfiniBand(直译为“无限带宽”,缩写为 IB)是一个用于高性能计算的计算机网络通信标准,它具有极高的吞吐量和极低的时延,但是 InfiniBand无法兼容现有以太网,如果企业想部署的话,除了需要专用网卡之外,还要重新购买配套的网络交换设备。

基于融合以太网的 RDMA(RDMA over Converged Ethernet,RoCE)
InfiniBand 架构规范定义了如何通过 InfiniBand 网络执行 RDMA,而 RoCE 则定义了如何通过以太网网络执行 RDMA。
RoCE 有RoCEv1 和RoCEv2 两个版本。RoCEv1 的网络层使用了InfiniBand规范,链路层使用以太网协议,因此允许同一个以太网广播域中的两台主机进行通信。RoCEv2使用了“UDP+IP”作为网络层,是一个“网络层+链路层”协议,因此 RoCEv2 网络中的数据包可以被路由。RoCE 被认为是 InfiniBand 的“低成本解决方案”,将InfiniBand 传输层的报文封装成以太网数据包进行收发(也就是说 RoCE 仍然使用 InfiniBand 传输层)。由于 RoCE 可以使用以太网交换设备,因此在企业中的应用比较多,但是其在相同场景下相比 InfiniBand 会有一些性能方面的损失。
RoCE 与 InfiniBand 有如下几个技术差异。
在以太网链路层上使用 RDMA 应用程序时,应注意以下几点。
获取此网卡当前支持的 RoCE 版本
cma_roce_mode -d mlx5_0 -p 1 iWARP(Internet Wide Area RDMA Protocol)是 IETF 定义的基于 TCP 的 RDMA,它和 RoCE v2 都可以路由。因为 TCP 是面向连接的可靠协议,这使得 iWARP 在面对有损网络场景时,相比 RoCEv2 和 InfiniBand 具有更好的可靠性,在大规模组网时也有明显的优势。但在大规模数据中心和大规模应用程序(比如大型企业网、云计算、Web 2.0 应用程序等)中使用 iWARP 时,大量连接的内存需求以及 TCP 的流量和可靠性控制将会导致可扩展性和性能相关的问题,并且会耗费很多的内存资源。总体来看,RoCE 在时延、吞吐量和 CPU 开销方面明显优于 iWARP。此外,RoCE 规范中定义了多播,而当前的 iWARP 规范没有定义如何执行多播 RDMA。
需要注意的是,虽然存在软件实现的 RoCE 和 iWARP,但是真正商用时上述几种协议都需要专门的硬件(网卡)支持。本文中测试和分析代码时所使用的 RDMA 网卡都为支持 RoCEv2 协议的网卡。
InfiniBand 体系结构定义了组网通信所需的多种设备:通道适配器(channel adapter)、交换机(switch)、路由器(router)和子网管理器(subnet manager)。其中子网管理器属于虚拟设备,它可以在其他任何一台设备上实现。每个终端(endnode)设备必须至少有一个通道适配器(HCA 或 TCA)。一个子网中至少有一个子网管理器用于配置和维护链路。所有的通道适配器和交换机必须包含子网管理代理(subnet management agent,SMA),用于处理与子网管理器的通信。除了子网管理器,RoCE 类型的网络中也需要上述这些组件。

HCA 即安装在主机上的 RDMA 网卡,用于将一个主机设备连接到一个 RDMA 网络上。一个 HCA 可以有多个物理端口(port),每个端口有自己的本地标识符(local identifier, LID)或 LID 范围。另外,每个端口还有自己的发送和接收缓存(buffer),因此所有端口可以并行发送和接收。
子网管理器为 HCA 的每一个物理端口配置子网内的本地地址,即 LID。HCA 中的子网管理代理和子网管理器通信,共同实现子网管理功能。
厂商会给每一个 HCA 分配独一无二的标识符,称为 GUID(globally unique identifier)。子网管理器分配给 HCA 的 LID 并不是永久的(断电重启后可能会变),所以 GUID 就成了永久识别某一个 HCA 的主要标识符。另外,厂商还给每一个端口分配了一个端口 GUID。
HCA 支持 InfiniBand 定义的所有软件 Verbs。Verbs 是一种抽象表示,它定义了客户端软件和 HCA 功能之间所需的接口。Verbs 不直接指定操作系统的应用程序编程接口(API),而是定义了一系列操作,提供给操作系统供应商开发相应的API。
TCA 为 I/O 设备(比如硬盘控制器)提供其到 RDMA 网络的连接,支持每个设备的特定操作所需的 HCA 功能子集。
InfiniBand 子网管理器为连接到InfiniBand 网络的每个端口分配 LID,并基于分配的 LID建立路由表。子网管理器属于软件定义网络(SDN)的概念,它消除了互连的复杂性,支持创建非常大规模的计算和存储基础设施。子网管理器配置本地子网并确保其持续运行。每个子网中必须至少有一个子网管理器,用于管理所有交换机和路由器的配置,并在链路断开或出现新链路时重新配置子网。
子网管理器可以位于子网中的任何设备内,它通过与每台设备上的子网管理代理通讯来进行工作。一个子网中可以有多个子网管理器,但只能有一个子网管理器处于活动状态。不在活动状态的子网管理器(即备用子网管理器),会同步保存处于活动状态的子网管理器转发的信息副本,并验证活动状态的子网管理器是否仍在运行。如果处于活动状态的子网管理器停机了,备用子网管理器将接管它的工作,以确保整个子网不会停摆。
在 RoCE 类型的网络中,不存在子网管理器。
InfiniBand 交换机在概念上类似于标准以太网交换机,但其设计旨在满足 InfiniBand 的性能要求。它们实现 InfiniBand 链路层的流量控制以防止丢包,有避免阻塞和自适应路由的功能,并支持高级服务质量(QoS)。许多交换机包含了子网管理器的功能。交换机包含多个端口,并根据协议第二层本地路由报头中包含的 LID,将数据包从一个端口转发到另一个端口。交换机只会管理和转发数据包,不会消耗或产生数据包。与通道适配器(HCA 和 TCA)一样,交换机必须包含子网管理代理功能,以处理子网管理报文。交换机可以被配置为转发单播数据包(到单个设备)或多播数据包(到多个设备)。
RoCE 类型的网络中使用的是以太网交换机。
InfiniBand 路由器将数据包从一个子网转发到另一个子网,而不消耗或产生数据包。与交换机不同,路由器根据全局路由报头(global route header,GRH)中包含的 IPv6 网络层地址来转发数据包。在将数据包发送到下一个子网中时,路由器会按照目标子网中合适的 LID 来修改数据包中的本地路由报头(local route header,LRH),重新组装每个数据包。
路由对终端来说并不是透明的,因为终端发包时必须指定路由器的 LID 和最终目标的GID。
每一个子网都有独一无二的子网ID,称为子网前缀。子网管理员会把这个子网前缀赋值给这个子网中所有的端口(包含在端口的 PortInfo 属性中)。这个子网前缀和端口的 GUID结合,就成了端口的GID。端口也可以有其他的GID。
从路由器的角度看,GID 中的子网前缀部分就代表了穿过路由器的路径。路由器依据数据包的目的 GID 和转发表来决定把数据包转发到哪个或哪些端口。
RoCE 类型的网络中使用的是以太网路由器。
从功能上看,LID(local identifier)和 GID(globally identifier)的概念类似于“以太网和 IP 网”中的 MAC 和IP,分别用于子网内的目标寻址和子网间的目标寻址。
根据InfiniBand 协议,两台设备间建立连接时,需要知道对方的 QP 号和端口,其中对端口的识别根据 LID 和GID(后者可选)进行。
InfiniBand 定义的 LID 是一个 16 位的标识符。LID 有以下特征。
条路径。HCA A 和 HCA C 之间存在多条路径。如果 HCA A 被分配了基本 LID 4,LMC =2,则其 LID 的范围是 4、5、6、7。如果 HCA C 被分配了基本 LID 8,LMC=2,则其 LID 的范围就是 8、9、10、11。对于 RoCE 类型的网络,LID 无效,所有端口的 LID 都为 0x0000。

GID 是一种 128 位的单播或多播标识符,用于标识端口或多播组。
GUID(globally unique identifier)是全局唯一的 EUI-64 标识符,共 64 位。其中的 24 位表示厂商 ID,另外 40 位是扩展标识符,由生产设备的厂商来分配。
GID 有以下特征。

![]()
下一篇:必须掌握的 Linux 命令