4、RDMA技术基础:InfiniBand、RoCE、iWARP等协议栈简介,以及RDMA操作类型(Send/Recv、Read/Write)

4.1 为什么需要RDMA:从传统网络栈的瓶颈说起

在GPU Direct RDMA场景中,数据需要绕过CPU、绕过内核,直接从GPU显存传输到远端GPU或网卡。传统TCP/IP协议栈在传输数据时,数据要经历“用户缓冲区→内核Socket→协议栈处理→网卡”的多次拷贝,每次拷贝都伴随CPU中断和上下文切换。对于动辄数百GB的深度学习训练集或HPC科学计算数据,这种开销是不可接受的。

RDMA(Remote Direct Memory Access)的核心思想是:让网卡硬件直接读写远端主机内存,数据路径上不经过CPU、不经过操作系统内核、不占用用户态缓冲区。为此,RDMA协议栈必须提供三种关键能力:

  • 内核旁路(Kernel Bypass):应用通过用户态驱动直接与网卡交互,避免系统调用。
  • 零拷贝(Zero-Copy):数据在网卡与内存之间直接搬运,无需中间缓冲。
  • CPU卸载(CPU Offload):传输控制、可靠连接、乱序重组等由网卡硬件完成。

核心理解:RDMA不是一种“更快的TCP”,而是将网络传输的“数据搬运”职责从CPU转移到网卡硬件。CPU只负责发起操作和接收完成通知,中间的数据流动完全由RDMA网卡(HCA或RNIC)自主完成。

传统TCP/IP路径 应用缓冲区 内核Socket 协议栈处理 网卡驱动 物理网卡 CPU中断 上下文切换 多次拷贝 RDMA路径 应用注册内存 用户态驱动 RDMA网卡 硬件DMA引擎 远端内存 无CPU参与 零拷贝 硬件直通 对比 RDMA核心:内核旁路 + 零拷贝 + CPU卸载,数据从应用内存直达远端内存 传统路径每次传输需CPU介入4~6次,RDMA全程仅需发起和完成两次通知

4.2 三大RDMA协议栈:InfiniBand、RoCE、iWARP

RDMA是一种技术理念,具体落地有三种主流协议栈。它们共享相同的上层接口(Verbs API),但底层传输介质和封装方式完全不同,这直接影响了它们在GPU Direct场景中的适用性。

特性 InfiniBand RoCE v2 iWARP
物理层 专用IB网络(IB交换机/线缆) 以太网(需无损或PFC配置) 标准以太网(TCP/IP兼容)
网络层 IB自有寻址(LID/GID) IP/UDP封装(RoCE v2) TCP/IP协议栈
传输层 IB传输层(可靠/不可靠) UDP + IB传输层 TCP(依赖内核或硬件卸载)
性能 最低延迟(<1μs),最高带宽 延迟接近IB(需无损网络) 延迟较高(TCP处理开销)
GPU Direct适用性 最佳(原生支持) 优秀(需网卡支持) 一般(较少用于GPU Direct)
成本 高(专用硬件) 中(利用现有以太网) 中低(标准以太网)

4.3 协议栈分层与封装差异

理解三者差异的关键在于数据封装层级。InfiniBand从物理层到传输层都是专用设计,不依赖IP;RoCE v2将IB的报文封装在UDP/IP中,从而可以路由;iWARP则直接映射到TCP连接上。

// 三种协议栈的报文封装对比(简化示意)
InfiniBand:  [ LRH | GRH(可选) | BTH | 数据 | ICRC | VCRC ]
RoCE v2:     [ Ethernet | IP | UDP | BTH | 数据 | ICRC ]
iWARP:       [ Ethernet | IP | TCP | DDP | RDMAP | 数据 ]

重要误区:RoCE v2虽然使用UDP封装,但它不是标准UDP传输。RoCE的可靠性由IB传输层(BTH中的OpCode和PSN)保证,UDP只是“搬运工”。因此RoCE网络必须配置无损以太网(PFC优先级流控)或ECN,否则丢包会导致性能断崖式下降。

4.4 RDMA核心操作类型:Send/Recv与Read/Write

RDMA提供两类基本操作模型,理解它们对GPU Direct编程至关重要。

4.4.1 Send/Recv(双边操作)

Send/Recv类似传统消息传递,但双方都必须参与:发送方调用ibv_post_send发送数据,接收方必须提前ibv_post_recv准备好接收缓冲区。接收方不知道数据何时到达,需要预先注册WQE(Work Queue Element)。

  • 语义:类似“邮箱”模型——发件人投递,收件人必须事先挂好空邮箱。
  • 特点:接收方需要预先分配缓冲区,存在“消息到达但缓冲区未准备好”的同步问题。
  • 适用场景:控制消息、短消息、动态长度数据。

4.4.2 Read/Write(单边操作)

Read/Write是RDMA的“杀手锏”——一方主动读写另一方内存,对端CPU完全无感知。发起方需要知道对端的内存地址(虚拟地址)和RKey(内存保护密钥),直接通过网卡硬件发起DMA读写。

  • RDMA Read:从远端内存读取数据到本地缓冲区。
  • RDMA Write:将本地数据写入远端内存(带立即数版本可携带通知)。
  • 特点:对端CPU零参与,无需预置接收缓冲区,适合批量数据传输。
  • 适用场景:GPU显存数据交换、参数服务器更新、存储卸载。

GPU Direct中的典型组合:控制面用Send/Recv(如任务分发、同步信号),数据面用Write/Read(如梯度传输、显存拷贝)。例如NVIDIA NCCL中,节点间小消息走Send/Recv,大块张量传输走RDMA Write。

4.5 操作流程与WQE/QP概念

无论哪种操作,RDMA编程都围绕队列对(QP)展开。每个QP由发送队列(SQ)和接收队列(RQ)组成,应用通过提交WQE描述操作,网卡硬件执行后产生CQE(完成队列元素)通知应用。

// RDMA Send操作的基本流程(伪代码)
1. 创建QP:      ibv_create_qp()
2. 注册内存:    ibv_reg_mr()  // 获取lkey/rkey
3. 准备WQE:     ibv_post_send() // 填写sge指向数据缓冲区
4. 硬件执行:    网卡DMA读取数据并发送
5. 完成通知:    ibv_poll_cq()  // 获取CQE确认完成

// RDMA Write操作(单边,对端无感知)
1. 创建QP并建立连接(exchange QP信息)
2. 获取对端内存地址和rkey(通过带外方式,如TCP)
3. ibv_post_send() 填写:
   opcode = IBV_WR_RDMA_WRITE
   remote_addr = 对端显存地址
   rkey = 对端内存密钥
4. 网卡硬件直接写入对端内存,对端CPU零参与

4.6 案例:GPU Direct场景下的协议栈选择

假设一个8节点DGX A100集群,每节点8张A100 GPU,需要做AllReduce梯度同步。实际部署中:

  1. 首选方案:InfiniBand HDR(200Gbps)+ GPUDirect RDMA。NVIDIA官方认证路径,CUDA运行时直接通过cudaMemcpyPeerAsync配合IB Verbs实现GPU间通信,延迟最低。
  2. 替代方案:RoCE v2 + 支持GPUDirect的网卡(如Mellanox ConnectX-6)。需在交换机上启用PFC和ECN,保证无损网络。性能可达IB的90%以上,但成本显著降低。
  3. 不推荐:iWARP用于GPU Direct。因为iWARP依赖TCP,TCP的拥塞控制和重传机制引入的延迟和CPU开销会抵消GPU Direct的优势。

选型建议:新建HPC/AI集群且预算充足,选InfiniBand;已有大规模以太网且追求性价比,选RoCE v2并做好网络调优;iWARP更适合传统数据中心存储场景,GPU Direct场景应避免。

4.7 常见误区与复盘

  • 误区1:RoCE和普通UDP一样可以丢包。事实:RoCE依赖无损网络,任何丢包都会触发重传,性能下降可达10倍以上。必须配置PFC/ECN。
  • 误区2:RDMA Write不需要对端参与,所以不需要同步。事实:虽然对端CPU不参与数据传输,但内存生命周期需要同步——对端必须保证目标内存区域有效且未被释放,否则可能写入非法地址。
  • 误区3:Send/Recv比Write/Read更可靠。事实:在可靠连接(RC)服务类型下,两者可靠性相同,都由硬件重传保证。区别仅在于参与方数量和编程模型。
  • 误区4:所有RDMA网卡都支持GPUDirect。事实:GPUDirect RDMA需要网卡支持BAR1映射和GPU内存注册,只有特定型号(如Mellanox CX-5及以上、Broadcom等)才支持。

关键复盘:RDMA操作类型的选择直接影响GPU Direct性能。Send/Recv需要接收方预置缓冲区,在GPU显存中频繁分配/释放代价高昂;而RDMA Write可以直接写入预先分配的GPU显存池,配合CUDA事件同步,能实现真正的异步零拷贝传输。实际项目中,建议将GPU显存划分为固定缓冲区池,用Write/Read做数据面传输,用Send/Recv做控制面同步。