2、RDMA基础回顾:RDMA技术原理、InfiniBand与RoCEv2的区别、队列对与内存注册、可靠连接与不可靠连接
RDMA(Remote Direct Memory Access,远程直接内存访问)的核心思想是允许网卡(RNIC,RDMA Network Interface Card)直接读写远端主机的内存,而无需经过操作系统内核、CPU和协议栈的参与。这一机制从根本上改变了传统网络通信中“数据拷贝—内核中断—协议处理—再拷贝”的低效路径。理解RDMA的基础概念,是深入掌握ECN(Explicit Congestion Notification,显式拥塞通知)拥塞反馈机制的前提——因为ECN的反馈对象正是RDMA传输层中的队列对(QP)和拥塞控制点(如发送端的速率调整)。本章将系统梳理RDMA技术原理、InfiniBand与RoCEv2的差异、队列对与内存注册机制,以及可靠连接(RC)与不可靠连接(UC/UD)的适用场景,为后续章节的ECN深入解析奠定扎实基础。
2.1 RDMA技术原理:从传统网络到内核旁路
核心原理:为什么需要RDMA?
传统TCP/IP网络通信中,一次数据发送需要经历:应用程序调用send()→内核协议栈处理(TCP分段、IP路由、校验和计算)→数据从用户空间拷贝到内核空间→网卡驱动发送→接收端网卡中断→内核协议栈处理→数据从内核空间拷贝到用户空间→应用程序recv()返回。整个过程涉及多次内存拷贝、上下文切换和CPU中断,延迟通常在数十微秒级别,CPU占用率极高。对于高性能计算(HPC)、分布式存储、AI训练等场景,这种开销是不可接受的。
RDMA的突破性设计在于:将数据传输的控制权从CPU和内核转移到网卡硬件。应用程序通过verbs API(如ibv_post_send)直接向网卡下发工作请求(WR),网卡硬件负责完成数据的封装、传输、确认、重传等全部工作。数据从用户空间内存直接DMA到网卡,再通过网络传输到对端网卡,对端网卡直接DMA写入用户空间内存,全程无需CPU参与数据搬运。
RDMA的三大核心特性
- 内核旁路(Kernel Bypass):应用程序与网卡之间建立直接通道,绕过操作系统内核。用户态驱动直接操作网卡硬件资源(如Doorbell寄存器),避免了系统调用和上下文切换。
- 零拷贝(Zero-Copy):数据在网卡与用户内存之间通过DMA直接传输,不需要在用户空间与内核空间之间复制。发送端和接收端都直接操作应用程序注册的内存区域。
- CPU卸载(CPU Offload):传输层的可靠性(ACK/NAK、重传、排序)、流控、分段重组等全部由网卡硬件完成,CPU只负责下发WR和回收WC(工作完成),大幅降低CPU负载。
RDMA的两种语义
RDMA提供两种操作语义:内存语义(Memory Semantics)和消息语义(Message Semantics)。内存语义包括RDMA Read和RDMA Write,直接操作远端内存地址,不需要对端CPU参与;消息语义包括Send/Receive,需要对端预先发布接收请求(RR),类似于传统消息传递。理解这两种语义对后续ECN拥塞控制至关重要——因为RDMA Write是数据中心中最常见的操作,也是拥塞的主要来源。
关键理解:RDMA的本质是“让网卡成为传输协议的执行者”。CPU只负责“告诉网卡做什么”(下发WR),而“怎么做”(封装、传输、确认、重传)完全由网卡硬件完成。这种设计使得单条RDMA连接可以轻松跑满100Gbps甚至400Gbps带宽,而CPU占用率几乎为零。
2.2 InfiniBand与RoCEv2的区别:无损网络与有损网络的博弈
核心原理:两种技术路线的本质差异
InfiniBand(IB)是RDMA的原生网络,从物理层到传输层完全为RDMA设计。IB网络采用基于信用(Credit)的流控机制,每个接收端口维护信用计数器,发送端只有在收到接收端的信用授权后才能发送数据。这种机制保证了IB网络天然无损——数据包一旦发出就不会因缓冲区溢出而丢弃。
RoCEv2(RDMA over Converged Ethernet version 2)则是在标准以太网上承载RDMA。它使用UDP/IP封装(目的端口4791),可以跨越三层路由。但以太网是有损网络,交换机缓冲区有限,当拥塞发生时可能丢包。为了弥补这一缺陷,RoCEv2依赖PFC(Priority Flow Control,优先级流控)和ECN机制来模拟无损环境。
对比分析:IB vs RoCEv2
| 对比维度 | InfiniBand | RoCEv2 |
|---|---|---|
| 协议栈 | IB专有协议(LRH/GRH/BTH) | UDP/IP + IB传输头(BTH) |
| 网络层 | IB子网管理(Subnet Manager) | 标准IP路由(支持L3) |
| 流控机制 | 基于信用的无损流控 | PFC(按优先级暂停)+ ECN |
| 丢包行为 | 不丢包(无损) | 可能丢包(有损,依赖上层重传) |
| 拥塞控制 | IB CC(拥塞控制) | DCQCN、TIMELY、HPCC等 |
| 物理层 | IB专用线缆/交换机 | 标准以太网光模块/交换机 |
| 成本 | 高(专用硬件) | 低(复用现有以太网) |
| 部署规模 | HPC/超算中心 | 数据中心/云环境 |
| ECN支持 | IB BTH中的FECN/BECN字段 | IP头中的ECT/CE位 |
案例拆解:RoCEv2为何需要ECN?
假设一个数据中心部署了RoCEv2网络,使用25Gbps以太网交换机。当多个发送端同时向同一接收端发送数据时,接收端接入交换机的出端口可能发生拥塞。在纯PFC机制下,交换机检测到缓冲区占用超过阈值,会向上一级发送暂停帧,导致整个优先级队列被阻塞——这会造成拥塞树蔓延(Congestion Tree),即一个端口的拥塞扩散到多个上游端口,严重影响网络整体吞吐量。
ECN机制则更加精细:交换机在检测到拥塞时,不是暂停流量,而是在IP头中标记CE(Congestion Experienced)位。接收端收到CE标记后,通过CNP(Congestion Notification Packet)报文反馈给发送端,发送端据此降低发送速率。这种机制避免了PFC的“一刀切”问题,实现了更精准的拥塞控制。后续章节将详细展开DCQCN算法如何利用ECN反馈进行速率调整。
重要提醒:RoCEv2的ECN标记是在IP头中进行的(ECT/CE位),而InfiniBand的拥塞反馈是在BTH(Base Transport Header)中使用FECN(Forward ECN)和BECN(Backward ECN)字段。两者机制不同,但目标一致——让发送端感知拥塞并降速。在部署RoCEv2时,必须确保交换机支持ECN标记,且正确配置了CNP生成逻辑。
2.3 队列对与内存注册:RDMA通信的基石
核心原理:队列对(QP)的工作机制
队列对(Queue Pair,QP)是RDMA通信的基本单元,由发送队列(SQ)和接收队列(RQ)组成。应用程序通过verbs API向SQ下发发送工作请求(WR),向RQ下发接收工作请求(RR)。网卡硬件从SQ中取出WR,执行数据传输;从RQ中取出RR,准备接收数据。完成的操作通过完成队列(CQ)以工作完成(WC)的形式通知应用程序。
QP的状态机包括:Reset → Init → RTR(Ready to Receive)→ RTS(Ready to Send)。只有处于RTS状态的QP才能发送数据。QP的建立需要通信双方交换QP编号(QPN)、LID(Local ID)或GID(Global ID)等信息,这通常通过带外通道(如TCP)完成。
内存注册(Memory Registration)
RDMA要求参与通信的内存区域必须提前注册(Memory Registration,MR)。注册过程包括:
- 锁定内存页:防止操作系统将页面换出到磁盘。
- 建立DMA映射:网卡获取物理地址,建立虚拟地址到物理地址的映射表。
- 生成访问密钥(rkey):用于远端访问时的权限校验。
注册后的内存区域可以通过ibv_reg_mr()获得lkey(本地密钥)和rkey(远端密钥)。RDMA Write操作需要提供对端的rkey和远端虚拟地址,RDMA Read操作则需要提供本端的rkey和虚拟地址。
操作流程:QP创建与内存注册的完整步骤
// 1. 创建QP
struct ibv_qp_init_attr attr = {
.qp_type = IBV_QPT_RC, // 可靠连接
.send_cq = cq,
.recv_cq = cq,
.cap = {
.max_send_wr = 128,
.max_recv_wr = 128,
.max_send_sge = 1,
.max_recv_sge = 1
}
};
struct ibv_qp *qp = ibv_create_qp(pd, &attr);
// 2. 注册内存
struct ibv_mr *mr = ibv_reg_mr(pd, buffer, size,
IBV_ACCESS_LOCAL_WRITE |
IBV_ACCESS_REMOTE_WRITE |
IBV_ACCESS_REMOTE_READ);
// 3. 下发发送WR
struct ibv_sge sge = {
.addr = (uint64_t)buffer,
.length = size,
.lkey = mr->lkey
};
struct ibv_send_wr wr = {
.opcode = IBV_WR_RDMA_WRITE,
.send_flags = IBV_SEND_SIGNALED,
.sg_list = &sge,
.num_sge = 1,
.wr.rdma = {
.remote_addr = remote_addr,
.rkey = remote_rkey
}
};
ibv_post_send(qp, &wr, &bad_wr);
常见误区与总结复盘
- 误区1:认为QP数量越多越好。实际上,每个QP都会占用网卡硬件资源(如队列上下文、缓冲区),过多的QP会导致硬件资源耗尽。建议根据CPU核数和连接数合理规划,通常每个CPU核分配1-2个QP。
- 误区2:忽略内存注册的代价。内存注册涉及页锁定和DMA映射,开销较大。对于频繁使用的缓冲区,应使用
ibv_reg_mr一次性注册并复用,避免反复注册/注销。 - 误区3:混淆lkey和rkey。lkey仅用于本地DMA操作,rkey用于远端访问。在RDMA Write中,发送端使用本端lkey读取本地数据,使用对端rkey写入远端内存。两者不可互换。
2.4 可靠连接与不可靠连接:传输模式的选择
核心原理:四种传输模式
RDMA定义了四种传输模式,每种模式在可靠性、连接性和资源消耗上各有取舍:
| 传输模式 | 连接性 | 可靠性 | 典型应用 | QP数量 |
|---|---|---|---|---|
| 可靠连接(RC) | 一对一 | 可靠(ACK/重传) | 存储、AI训练 | 每对连接1个QP |
| 不可靠连接(UC) | 一对一 | 不可靠(无ACK) | 实时流媒体 | 每对连接1个QP |
| 不可靠数据报(UD) | 一对多 | 不可靠(无ACK) | 多播、控制消息 | 全局共享QP |
| 可靠数据报(RD) | 一对多 | 可靠(ACK/重传) | 极少使用 | 全局共享QP |
| 扩展可靠连接(XRC) | 一对多 | 可靠 | MPI通信 | 共享接收QP |
可靠连接(RC)的深入分析
RC是最常用的传输模式,提供端到端的可靠传输。发送端网卡为每个RC QP维护发送队列和重传缓冲区,接收端网卡维护接收队列和确认机制。当发送端发出数据包后,会启动定时器等待ACK;如果超时未收到ACK,则重传数据。RC支持RDMA Read、RDMA Write、Send/Receive等所有操作类型。
RC的拥塞控制与ECN密切相关:在DCQCN算法中,发送端收到CNP报文后,会降低当前QP的发送速率。由于RC是一对一连接,每个QP的速率调整可以精确控制到每条流,这是RC在拥塞控制中的优势。
不可靠连接(UC)与不可靠数据报(UD)
UC提供连接语义但不保证可靠性,数据包发出后不等待ACK,也不重传。UC适合对延迟敏感但允许少量丢包的应用,如实时视频传输。UD则提供数据报语义,一个QP可以向多个目的地发送数据,但每个数据报大小受限(通常不超过MTU),且接收端需要预先发布接收请求。
在ECN拥塞控制场景中,UD模式由于没有连接概念,无法进行逐流速率调整,因此通常不用于需要精细拥塞控制的应用。RC模式是ECN控制的主要目标。
案例拆解:AI训练场景下的传输模式选择
在一个分布式AI训练集群中,使用RoCEv2网络连接GPU服务器。训练任务需要频繁进行AllReduce操作,涉及大量小消息(几百字节到几KB)的聚合通信。此时选择RC模式,每个GPU对之间建立一条RC QP,利用RDMA Write进行数据交换。由于RC提供可靠传输,不需要应用层处理丢包重传,大大简化了通信逻辑。
然而,当GPU数量达到数百甚至上千时,全连接RC QP的数量会呈平方级增长(N个GPU需要N×(N-1)/2条QP),导致网卡资源紧张。此时可以考虑使用XRC(扩展可靠连接)模式,多个发送端共享一个接收QP,减少QP数量。但XRC的配置复杂度较高,需要权衡资源与性能。
经验建议:在RoCEv2网络中,RC模式是ECN拥塞控制的最佳载体。因为DCQCN算法需要针对每条流(每个QP)进行速率调整,RC的一对一特性使得速率控制精确到流级别。如果使用UD模式,拥塞控制只能退化为交换机级别的PFC,无法实现精细的流级调控。
总结复盘:传输模式选择的决策要点
- 可靠性需求:需要可靠传输时选择RC或XRC;允许丢包时选择UC或UD。
- 连接数规模:大规模集群中,全连接RC会导致QP数量爆炸,考虑XRC或UD。
- 消息大小:UD模式限制消息大小(通常≤MTU),大消息必须使用RC/UC。
- 拥塞控制需求:需要精细流级拥塞控制时,RC是唯一选择。
- 硬件资源:每个QP消耗网卡内存(通常几十KB),需评估网卡容量。