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)自主完成。
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梯度同步。实际部署中:
- 首选方案:InfiniBand HDR(200Gbps)+ GPUDirect RDMA。NVIDIA官方认证路径,CUDA运行时直接通过
cudaMemcpyPeerAsync配合IB Verbs实现GPU间通信,延迟最低。 - 替代方案:RoCE v2 + 支持GPUDirect的网卡(如Mellanox ConnectX-6)。需在交换机上启用PFC和ECN,保证无损网络。性能可达IB的90%以上,但成本显著降低。
- 不推荐: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做控制面同步。