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深入解析奠定扎实基础。

RDMA基础架构与传输模式对比 RDMA核心机制 • 内核旁路(Kernel Bypass) • 零拷贝(Zero-Copy) • CPU卸载(CPU Offload) • 直接内存访问(DMA) • 传输层卸载(Transport Offload) • 消息语义与内存语义 • 硬件重传与确认 队列对(QP) • 发送队列(SQ) • 接收队列(RQ) • 完成队列(CQ) • 工作请求(WR) • 工作完成(WC) • QP状态机:Reset→Init→RTR→RTS • 内存注册(MR)与内存窗口(MW) 传输模式 • 可靠连接(RC):ACK/重传 • 不可靠连接(UC):无ACK • 不可靠数据报(UD):多对一 • 可靠数据报(RD):极少使用 • 扩展可靠连接(XRC):多QP共享 网络类型对比 InfiniBand • 专有协议,端到端RDMA • 无损网络(流控+PFC) • 独立物理层与链路层 • 需要专用交换机/网卡 • 天然支持ECN RoCEv2 • 基于UDP/IP封装 • 有损网络(依赖ECN/PFC) • 复用以太网基础设施 • 支持路由(L3) • ECN标记在IP头 关键差异 • IB:无损,天然拥塞控制 • RoCEv2:有损,需ECN辅助 • RoCEv2依赖DCQCN等算法 • IB使用CA(Channel Adapter) • RoCEv2使用RNIC

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

对比维度InfiniBandRoCEv2
协议栈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)。注册过程包括:

  1. 锁定内存页:防止操作系统将页面换出到磁盘。
  2. 建立DMA映射:网卡获取物理地址,建立虚拟地址到物理地址的映射表。
  3. 生成访问密钥(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),需评估网卡容量。