RDMA的架构
RDMA 的架构可以从两个层面来理解:
软件栈的分层和硬件的工作机制。
它本质上是让一台机器的网卡,能够绕过 CPU 和操作系统内核,直接读写另一台机器的内存。
📚 软件栈:从应用到硬件的“通道”
以你正在用的 RoCEv2 为例,RDMA 的软件栈是层层叠加的:
应用层与 ULP:上层应用(如 NCCL 通信库)不直接操作网卡,而是通过 OFED ULP 库调用 RDMA 功能,实现无缝迁移。
Verbs API:这是应用与 RDMA 硬件交互的标准接口。它管理连接、内存和队列,并把“工作请求”提交给硬件。
接口驱动层与数据引擎层:接口驱动负责配置硬件、管理队列和内存,把请求放入“工作队列”;数据引擎则负责内存队列与硬件之间的数据传输。
传输层与网络层:RDMA 的传输层(IB Transport)直接构建在 UDP/IP 之上(RoCEv2),再往下就是标准的以太网链路。
⚙️ 硬件:网卡内部在做什么?
RDMA 网卡(HCA 或 RNIC)是一个高度集成的“小电脑”,核心部件包括:
PCIe 与网络部件:负责连接主机和网络,完成以太网帧的封装和解析。
报文处理逻辑:处理四类 RDMA 报文(本端/远端请求与响应),进行封装和解析。
DMA 与地址转换:直接访问主机内存,完成虚实地址转换,这是“零拷贝”和“内核旁路”的硬件基础。
可靠传输部件:保证数据按序、可靠地传输,处理 ACK/NAK 和重传。
缓存与处理单元:网卡自带 SRAM 缓存,多个处理单元并行处理队列对(QP),提升并发能力。
🔑 核心机制:队列对(QP)与工作请求
RDMA 通信的“编程模型”围绕队列对(Queue Pair) 展开,它由发送队列(SQ) 和接收队列(RQ) 组成。
提交请求:应用通过 Verbs API 把“工作请求(WR)”放入 SQ 或 RQ。驱动会通知网卡(Doorbell 机制),网卡随后从内存中读取“工作队列项(WQE)”。
硬件执行:网卡硬件根据 WQE 的内容,直接通过 DMA 从内存取数据,封装成 RDMA 报文发送出去。接收方网卡收到后,校验并直接写入指定内存地址。
完成通知:操作完成后,网卡会生成一个“完成队列项(CQE)”放入完成队列(CQ),应用通过轮询 CQ 来获知操作结果。
🔗 关键操作:Send/Recv 与 Write/Read
RDMA 的 Verbs 操作主要分为两类,理解它们的区别对排障很重要:
Send/Recv(双边操作):类似传统 Socket,接收方必须提前把缓冲区“挂”在 RQ 上。发送方不知道数据会放到接收方的哪个内存位置,接收方也不知道数据来自哪里。适合传递控制消息或小数据。
Write/Read(单边操作):请求方完全主动,响应方 CPU 无需参与。请求方需要提前获得响应方的内存地址和密钥(rkey),然后直接发起读写。Write 是“把数据写到对方内存”,Read 是“从对方内存读数据”。这是大模型训练中梯度同步(All-Reduce)的核心操作。
对你正在规划的 5000 卡 RoCE 方案来说,最需要关注的是 Write/Read 操作。因为 All-Reduce 的底层大量依赖单边 Write,而单边操作的性能对网络拥塞极度敏感——一旦丢包触发重传,性能会断崖式下跌。这也是为什么 RoCE 必须不惜代价(PFC、ECN、DCQCN)去构建无损网络的原因。
浙公网安备 33010602011771号