2. RDMA基础

2.1 RDMA的核心思想:绕过内核,直达远端内存

RDMA(Remote Direct Memory Access)的本质,是允许一台主机上的应用程序直接读写另一台远端主机的内存,而整个过程不经过双方的操作系统内核、不占用CPU中断、不产生额外的数据拷贝。传统TCP/IP网络路径中,数据从网卡到内核Socket缓冲区,再拷贝到用户态缓冲区,期间经历多次上下文切换和内存拷贝,CPU开销巨大。RDMA将这条路径彻底“短路”:数据从本地用户态缓冲区出发,由网卡硬件直接封装成网络报文,送达远端网卡后,由硬件直接写入用户指定的内存地址。

RDMA与传统网络路径的本质差异:

  • 传统TCP路径:应用 → Socket → 内核协议栈 → 网卡 → 网络 → 内核协议栈 → Socket → 应用(多次拷贝+CPU中断)。
  • RDMA路径:应用缓冲区 → RDMA网卡(硬件封装)→ 网络 → RDMA网卡(硬件解封装)→ 直接写入远端应用缓冲区(零拷贝、内核旁路)。

这种“内核旁路(Kernel Bypass)”与“零拷贝(Zero-Copy)”机制,使得单条连接即可获得微秒级延迟和数十Gbps吞吐,而CPU占用率几乎可以忽略不计。RDMA网卡(HCA或RNIC)内部维护了所有通信所需的队列与内存映射信息,应用通过 Verbs API(如ibv_post_send)直接与网卡硬件交互,不再依赖操作系统调度。

主机A(发起方) 用户态应用 缓冲区A(源地址) ibv_post_send() 内核(旁路) 不参与数据路径 RDMA网卡(HCA) 硬件封装报文 DMA读取内存 主机B(目标方) 用户态应用 缓冲区B(目的地址) 数据直接写入 内核(旁路) 不参与数据路径 RDMA网卡(HCA) 硬件解封装报文 DMA写入内存 RDMA网络(InfiniBand / RoCEv2) ① DMA读取 ② 网络传输 ③ DMA写入 全程零拷贝 · 内核旁路 · CPU不参与数据搬运

2.2 InfiniBand与RoCEv2:两种主流RDMA网络架构对比

RDMA技术并非绑定某一种物理网络,而是定义了上层语义(Verbs)和报文格式。目前业界最主流的两种实现是InfiniBand(IB)和RoCEv2(RDMA over Converged Ethernet version 2)。两者在物理层、网络层、生态和适用场景上存在显著差异。

对比维度 InfiniBand RoCEv2
物理层 专用IB交换机/线缆(QDR、HDR、NDR等) 标准以太网(25/100/200/400GbE)
网络层 自有IB网络层(无需IP路由) 基于UDP/IPv4或IPv6封装(可路由)
流控机制 端到端基于信用的流控(无损) 依赖PFC优先级流控(需无损以太网配置)
部署成本 高(专用硬件,封闭生态) 中低(复用现有以太网交换机)
性能表现 最低延迟(亚微秒级),最高吞吐 延迟略高(1-3微秒),吞吐接近IB
GPU直连支持 原生支持(GPU↔IB网卡直接DMA) 需网卡支持RoCEv2并配置PFC
典型场景 HPC超算、大规模GPU集群(如NVIDIA DGX) 数据中心、AI训练集群、分布式存储

在GPU直接访问RDMA的场景中,InfiniBand通常提供最稳定的低延迟表现,因为其网络本身设计为无损且无丢包;而RoCEv2则依赖以太网交换机启用PFC(Priority Flow Control)和ECN(Explicit Congestion Notification)来模拟无损环境。若PFC配置不当,RoCEv2在拥塞时可能出现“队头阻塞”和丢包,导致性能断崖式下降。

选型建议:如果GPU集群规模较小(< 200节点)且追求极致性能,优先选择InfiniBand;如果已有大规模以太网基础设施,或需要跨机房路由,RoCEv2是更经济的选择,但必须做好无损网络调优(PFC阈值、ECN标记、流量调度)。

2.3 RDMA核心概念:QP、CQ、MR、PD与WR

要理解GPU如何通过RDMA网卡直接访问远端GPU显存,必须先掌握RDMA的软件抽象模型。这些概念是Verbs API的操作对象,也是网卡硬件内部状态的核心组成。

2.3.1 队列对(QP, Queue Pair)

QP是RDMA通信的基本单元,由发送队列(SQ)和接收队列(RQ)组成。每个QP相当于一条逻辑连接,应用程序通过向SQ提交工作请求(WR, Work Request)来发起发送、读或写操作。QP的状态机包括Reset、Init、RTR(Ready to Receive)、RTS(Ready to Send)等状态,只有状态迁移到RTS后才能正常收发数据。

2.3.2 完成队列(CQ, Completion Queue)

CQ用于异步通知应用程序其先前提交的WR是否已完成。当网卡硬件完成一个发送或接收操作后,会向CQ中写入一个完成队列元素(CQE),应用程序通过轮询(ibv_poll_cq)或事件(ibv_get_cq_event)方式获取完成通知。CQ是RDMA中“零中断”机制的关键——CPU只在需要时主动查询完成状态,而不是被硬件中断打断。

2.3.3 内存区域(MR, Memory Region)与内存窗口(MW)

RDMA要求参与通信的内存区域必须提前注册(ibv_reg_mr),注册后网卡硬件会锁定该内存页并建立DMA映射表,同时返回一个rkey(远程密钥)。远端主机只有持有正确的rkey才能对该内存区域执行RDMA读写操作。MR的注册粒度可以是整个缓冲区,也可以是GPU显存中的一段地址(通过GPUDirect RDMA技术)。

2.3.4 保护域(PD, Protection Domain)

PD用于将QP、MR、AH(地址句柄)等资源进行逻辑分组,只有属于同一PD的资源才能相互关联。例如,一个MR只能被同一PD内的QP使用,这提供了资源隔离和安全性保障。

2.3.5 工作请求(WR)与操作类型

WR是应用程序下发给网卡的具体指令,常见的操作类型包括:

  • IBV_WR_SEND:发送消息(类似TCP send,需要对端预先post接收缓冲区)。
  • IBV_WR_RDMA_WRITE:单边写操作,直接写入对端指定内存地址(需对端提供rkey)。
  • IBV_WR_RDMA_READ:单边读操作,直接读取对端内存(需对端提供rkey)。
  • IBV_WR_ATOMIC_CMP_AND_SWP:原子比较交换操作,用于分布式锁等场景。

单边操作(RDMA Read/Write)与双边操作(Send/Recv)的本质区别:

  • 双边操作:接收方必须提前调用ibv_post_recv发布接收缓冲区,双方CPU都参与控制面交互,类似“电话沟通”。
  • 单边操作:发送方直接指定对端内存地址和rkey,接收方CPU完全无感知,类似“直接拿钥匙开门”。GPU直连场景中,RDMA Write/Read是主流,因为GPU显存地址可以提前注册为MR,远端GPU无需参与控制。

2.4 案例:GPU显存直接注册为MR并通过RDMA Write发送

在NVIDIA GPU集群中,GPUDirect RDMA技术允许GPU显存地址直接注册为MR,数据从GPU显存经PCIe总线直达RDMA网卡,无需先拷贝到CPU内存。以下是一个简化的代码流程(伪代码):

// 1. 分配GPU显存并获取设备指针
cudaMalloc(&gpu_buf, size);
// 2. 注册GPU显存为MR(关键步骤)
struct ibv_mr *mr = ibv_reg_mr(pd, gpu_buf, size,
                               IBV_ACCESS_LOCAL_WRITE |
                               IBV_ACCESS_REMOTE_WRITE |
                               IBV_ACCESS_REMOTE_READ);
// 3. 获取远端QP信息并建立连接(省略连接握手细节)
// 4. 构造RDMA Write工作请求
struct ibv_sge sge = { .addr = (uint64_t)gpu_buf,
                       .length = size,
                       .lkey = mr->lkey };
struct ibv_send_wr wr = { .opcode = IBV_WR_RDMA_WRITE,
                          .send_flags = IBV_SEND_SIGNALED,
                          .wr.rdma.remote_addr = remote_addr,
                          .wr.rdma.rkey = remote_rkey };
wr.sg_list = &sge;
wr.num_sge = 1;
// 5. 提交到发送队列
ibv_post_send(qp, &wr, &bad_wr);
// 6. 轮询完成队列
while (ibv_poll_cq(cq, 1, &wc) == 0);
// 7. 数据已直接写入远端GPU显存

上述流程中,CPU全程只负责控制面操作(注册MR、提交WR、轮询CQ),而数据面(GPU显存→网卡→网络→远端网卡→远端GPU显存)完全由硬件DMA完成。在100Gb/s速率下,传输4KB数据的端到端延迟可低至2微秒以内。

2.5 常见误区与排障复盘

误区1:RDMA就是“更快的TCP”。实际上RDMA改变了I/O模型,要求应用层使用Verbs API而非Socket API,且内存管理方式完全不同(需要注册MR、管理rkey)。

误区2:RoCEv2只要插上网线就能用。RoCEv2必须依赖无损以太网配置,若交换机未启用PFC或PFC阈值设置不当,拥塞时丢包会导致RDMA性能暴跌90%以上。

误区3:GPU显存注册MR后可以随意访问。MR的权限由rkey控制,若rkey泄露,远端主机可任意读写该GPU显存,存在严重安全隐患。生产环境应使用保护域隔离并定期轮换密钥。

典型故障复盘:某AI训练集群使用RoCEv2连接GPU服务器,训练过程中出现周期性性能抖动。排查发现:交换机PFC队列配置为默认值,当多台服务器同时向同一台服务器发送数据时,PFC暂停帧触发频繁,导致网络有效带宽从95%降至40%。解决方案:将PFC队列深度调整为适配RDMA流量的值,并启用ECN主动拥塞通知,同时将GPU通信流量映射到独立优先级队列,最终性能恢复稳定。