2、RDMA基础回顾:RDMA概念、InfiniBand与RoCEv2协议栈、队列对与操作语义

2.1 RDMA的核心概念:绕过内核,直达远端内存

RDMA(Remote Direct Memory Access,远程直接内存访问)是一种允许应用程序在不经过操作系统内核、不占用CPU周期的情况下,直接从一台服务器的内存读取或写入另一台服务器内存的网络通信技术。传统TCP/IP通信中,数据需要经过内核协议栈的多次拷贝(发送缓冲区→内核→网卡→网络→对端内核→接收缓冲区),而RDMA通过网卡硬件(RNIC,RDMA Network Interface Card)和专用协议,实现了内核旁路(Kernel Bypass)与零拷贝(Zero-Copy)传输。

理解RDMA的关键在于三个“直接”:

  • 直接内存访问:网卡硬件直接读写主机内存中的用户缓冲区,无需CPU介入数据搬移。
  • 直接协议处理:传输层(包括可靠连接、拥塞控制)由网卡硬件完成,而非内核软件。
  • 直接应用间通信:应用程序通过用户态队列对(QP)直接发起异步操作,无需系统调用。

核心收益:延迟从传统TCP的数十微秒降至1~3微秒,CPU占用率几乎为零,带宽可达100Gbps以上。这使得RDMA成为高性能计算、分布式存储(如NVMe-oF)和AI训练集群的关键网络技术。

2.2 InfiniBand与RoCEv2协议栈:两种主流实现路径

RDMA并非单一协议,而是多种技术实现的总称。目前业界最主流的两条路径是InfiniBand(IB)和RoCEv2(RDMA over Converged Ethernet version 2)。两者在协议分层上存在显著差异,直接影响拥塞控制机制的设计。

InfiniBand拥有完整的专用协议栈,从链路层到传输层均为IB规范定义,物理层使用IB专用线缆和交换机,提供无损传输保证。RoCEv2则构建在标准以太网之上,其网络层使用IP头,传输层使用UDP头(目的端口4791),因此可以运行在普通以太网交换机上,但需要依赖优先级流控(PFC)或显式拥塞通知(ECN)来模拟无损环境。

下表对比了两者的协议栈差异:

协议层 InfiniBand RoCEv2
传输层 IB Transport(RC/UC/UD等) UDP(目的端口4791)+ IB Transport
网络层 IB Global Routing Header(GRH) IPv4/IPv6
链路层 IB Link Layer(专用帧格式) 以太网(Ethernet)
物理层 IB专用线缆/光模块 标准以太网物理层
流控机制 链路级流控(无损) PFC(逐跳)或ECN(端到端)

RoCEv2由于复用了IP和UDP头,使得网络可以路由跨三层,但同时也引入了IP网络固有的拥塞丢包风险。因此,RoCEv2的拥塞控制(如DCQCN)比InfiniBand的基于信用的流控更为复杂,需要端到端的ECN标记和发送端速率调整。

InfiniBand vs RoCEv2 协议栈对比 InfiniBand 协议栈 IB Transport Layer RC / UC / UD / XRC IB Network Layer Global Routing Header (GRH) IB Link Layer 专用帧格式 + 链路级信用流控 IB Physical Layer 专用线缆 / 光模块 (EDR/HDR/NDR) 无损传输保证 链路级信用机制,无丢包 RoCEv2 协议栈 IB Transport Layer RC / UC / UD (封装在UDP中) UDP Layer 目的端口 4791 IP Layer IPv4 / IPv6 路由 Ethernet Link Layer 标准以太网帧 + 802.1p优先级 依赖PFC/ECN实现无损 否则可能丢包,需拥塞控制 对比 RoCEv2 复用以太网/IP/UDP,但拥塞控制复杂度显著高于 InfiniBand

2.3 队列对(QP)与操作语义:RDMA通信的基本执行单元

RDMA通信的核心抽象是队列对(Queue Pair,QP)。每个QP由一对队列组成:发送队列(Send Queue,SQ)和接收队列(Receive Queue,RQ)。应用程序通过向SQ/RQ提交工作请求(Work Request,WR)来驱动通信,网卡硬件异步执行这些请求,完成后在完成队列(Completion Queue,CQ)中生成完成事件(Completion Queue Entry,CQE)。

QP的通信语义主要分为三种类型:

  • 可靠连接(RC,Reliable Connection):一对一的可靠传输,支持RDMA读写操作,提供端到端确认和重传,是高性能场景最常用的类型。
  • 不可靠连接(UC,Unreliable Connection):一对一的不可靠传输,无确认和重传,延迟更低但可能丢包。
  • 不可靠数据报(UD,Unreliable Datagram):一对多的不可靠传输,类似UDP,支持多播,但报文大小受限(通常不超过MTU),且不支持RDMA读写。

RDMA操作语义分为两大类:通道语义(Channel Semantics)和内存语义(Memory Semantics)。通道语义即传统的发送/接收操作(Send/Recv),需要接收端预先发布接收缓冲区;内存语义则允许发送端直接读写对端内存,无需对端应用参与,包括RDMA Read(读取远端内存)、RDMA Write(写入远端内存)和RDMA Write with Immediate(携带立即数的写操作)。

2.4 典型场景:分布式键值存储中的RDMA应用

以分布式键值存储系统(如Redis Cluster的RDMA加速版)为例,客户端需要频繁执行Get/Set操作。传统TCP实现中,每次操作需要经过内核协议栈、中断处理、上下文切换,延迟约50~100微秒。使用RDMA后,整体流程变为:

  1. 客户端应用创建QP并连接到服务端QP(通过CM建连或预先配置)。
  2. 客户端将Get请求封装为RDMA Write,直接写入服务端预先注册的请求缓冲区。
  3. 服务端应用轮询CQ发现新请求,处理后使用RDMA Write将响应数据直接写回客户端的响应缓冲区。
  4. 客户端轮询CQ获取结果,全程无内核参与,延迟降至2~5微秒。

该场景中,QP的RC类型保证了请求不丢失,而内存语义使得服务端无需为每个请求都执行Recv操作,大幅降低了CPU开销。

2.5 常见误区与设计复盘

误区一:认为RoCEv2与InfiniBand拥塞控制机制相同。实际上,InfiniBand依靠链路级信用流控天然无损,拥塞控制相对简单;RoCEv2运行在标准以太网上,必须依赖ECN标记和发送端速率调整(如DCQCN),两者机制差异巨大。

误区二:忽略QP数量与CQ资源的规划。每个QP都会占用网卡硬件资源,过多的QP可能导致缓存溢出和性能下降。建议根据并发连接数合理配置QP数量,并使用共享CQ(Shared CQ)来减少中断开销。

复盘要点:在设计RDMA应用时,应优先明确使用哪种操作语义。若需要低延迟且对端可配合,优先使用RDMA Write/Read;若对端不可预知或需要动态消息,则使用Send/Recv。同时,必须提前注册内存区域(Memory Region,MR)并获取其L_Key/R_Key,这是RDMA访问的前提。