2、RoCE基础:RDMA与RoCE原理、RoCEv1/v2区别、网络架构与协议栈

2.1 从传统网络到RDMA:为什么需要绕过内核

传统以太网数据路径中,数据从网卡(NIC)到达主机内存,需要经过内核协议栈的多次拷贝、中断处理和上下文切换。以一次典型的TCP 10Gbps收发为例,CPU占用率往往超过60%,延迟高达数十微秒。这种“内核参与每一次数据移动”的模式,在高性能计算(HPC)、分布式存储和AI集群场景中成为严重瓶颈。

RDMA(Remote Direct Memory Access,远程直接内存访问)的核心思想是:让网卡硬件直接读写对端主机内存,绕过操作系统内核与CPU。发送方应用将数据缓冲区地址、长度和目的端内存地址封装成“工作请求”(Work Request,WR)提交给网卡,网卡硬件负责将数据从本地内存搬移到对端内存,完成后通过完成队列(Completion Queue,CQ)通知应用。整个过程无需内核参与数据面,CPU仅负责控制面管理。

RDMA三种实现技术对比

技术承载网络头开销典型延迟生态成熟度
InfiniBandIB专用网络(需IB交换机)IB全局路由头(LRH+GRH)0.5~1μs高,但成本高、封闭
RoCEv1以太网(二层)IB BTH+以太网头1~2μs低,仅限二层
RoCEv2以太网(三层/UDP)IB BTH+UDP+IP头1~2μs高,可路由、成本低

2.2 RoCE协议栈:IB传输语义与以太网承载

RoCE(RDMA over Converged Ethernet)本质上是将InfiniBand的报文格式(IB Base Transport Header,BTH)封装在以太网帧中传输。它保留了IB的队列对(Queue Pair,QP)、可靠连接(RC)、不可靠数据报(UD)等传输语义,但物理层和链路层采用以太网。

RoCEv1的封装格式为:以太网头 + IB BTH + 有效载荷。由于没有IP层,RoCEv1只能在同一个二层广播域内通信,无法跨VLAN或子网路由。RoCEv2则引入UDP封装:以太网头 + IP头 + UDP头(目的端口4791)+ IB BTH + 有效载荷。UDP头中的目的端口号固定为4791,用于标识RoCEv2流量,使报文可以像普通UDP包一样被三层交换机路由。

RoCEv1 vs RoCEv2 协议栈对比 RoCEv1(二层承载) IB BTH + 有效载荷(RDMA语义) 以太网头(无IP,无路由) 以太网MAC层 物理层(光/电口) ⚠ 仅限同一二层域 不可跨VLAN/子网路由 需PFC保证无损 RoCEv2(三层/UDP承载) IB BTH + 有效载荷(RDMA语义) UDP头(目的端口4791) IP头(可路由) 以太网MAC + 物理层 ✓ 支持三层路由(IP+UDP) ✓ 可跨VLAN/子网大规模组网 ✓ 需DCQCN/PFC配合无损 RoCEv2 增加IP+UDP封装,实现可路由性

2.3 RoCEv1与RoCEv2的关键差异

理解两者差异对网卡参数调优至关重要,因为不同版本对网卡、交换机和流控机制的要求完全不同。

  • 可路由性:RoCEv1无IP头,MAC地址即寻址依据,广播域受限;RoCEv2通过UDP端口4791承载,可被标准IP路由器转发,支持跨数据中心二层/三层组网。
  • 拥塞控制:RoCEv1依赖链路层PFC(Priority Flow Control)实现无损传输,但PFC可能引发队头阻塞;RoCEv2除PFC外,还可配合DCQCN(Data Center Quantized Congestion Notification)实现端到端拥塞控制,通过ECN标记和CNP(Congestion Notification Packet)反馈动态调整发送速率。
  • MTU与性能:RoCEv2因增加IP+UDP头(28字节),有效载荷空间略减,但现代网卡支持巨型帧(MTU 9000),影响可忽略。实际调优中,RoCEv2更依赖网卡RSS(Receive Side Scaling)哈希和流表匹配能力。
  • 兼容性:RoCEv1仅需二层交换机支持PFC;RoCEv2要求交换机支持ECN、DCQCN、PFC等完整无损以太网特性,对交换机缓冲和调度算法要求更高。

调优提示:在RoCEv2环境中,务必确认网卡驱动中UDP端口4791的哈希使能。若RSS哈希未覆盖UDP端口,所有RoCEv2流量将落入同一RX队列,导致单核CPU成为瓶颈,吞吐量骤降。可通过 ethtool -n eth0 rx-flow-hash udp4 检查哈希配置。

2.4 典型RoCE网络架构与协议栈全景

一个完整的RoCE集群通常采用Spine-Leaf(脊-叶)无阻塞架构。Leaf交换机连接服务器网卡,Spine交换机互联Leaf,所有链路均启用无损以太网配置。服务器侧,RoCE网卡通过PCIe 4.0/5.0连接CPU,驱动层(如mlx5_core)负责QP管理、内存注册和中断处理。

从协议栈视角看,RoCE报文在主机内的流转路径为:应用 → libibverbs/libfabric → 网卡驱动 → 网卡硬件(RDMA引擎)→ 以太网物理链路 → 交换机 → 对端网卡 → 对端内存。其中,网卡硬件中的GID(Global ID)表、QP上下文和CQ队列是调优的核心对象。

# 查看RoCE网卡GID表(RoCEv2使用RoCEv2类型GID)
$ rdma gid show
dev mlx5_0 port 1 index 0 address 02:00:00:00:00:00
dev mlx5_0 port 1 index 1 address 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
dev mlx5_0 port 1 index 2 address fe:80:00:00:00:00:00:00:00:00:00:00:00:00:00:00

2.5 案例:RoCEv2跨子网通信的故障排查

某分布式存储集群使用RoCEv2组网,服务器分布在两个不同IP子网(10.0.1.0/24和10.0.2.0/24),通过Spine-Leaf交换机互联。部署后发现跨子网RoCE通信延迟高达200μs,而同子网通信仅2μs。

排查过程:

  1. 检查交换机端口统计,发现跨子网流量存在大量ECN标记(Congestion Notification),说明交换机检测到拥塞。
  2. 使用 rdma res show qp 查看QP状态,发现跨子网QP的发送速率被DCQCN算法降速至10Gbps(正常100Gbps)。
  3. 进一步检查发现,交换机上ECN阈值配置过小(默认8KB),而RoCEv2大包(MTU 4096)突发时极易触发ECN标记,导致DCQCN误判拥塞。
  4. 调整交换机ECN阈值至256KB,并启用网卡端DCQCN参数优化(如 cable_len、alpha 因子),延迟恢复至3μs。

常见误区:不要将RoCEv2的UDP端口4791当作普通UDP流量处理。某些防火墙或安全策略会拦截非标准UDP端口,导致QP无法建立连接(状态卡在INIT或RTR)。务必在交换机ACL和主机iptables中放行UDP 4791,同时确保UDP校验和卸载(Checksum Offload)已开启,否则网卡会丢弃校验错误的RoCEv2报文。

2.6 本节小结与调优前置知识