RoCE网络架构:典型拓扑、无损网络与PFC、ECN

3.1 RoCE的两种部署形态与典型拓扑

RoCE(RDMA over Converged Ethernet)的核心目标是在以太网上实现RDMA语义,但不同版本的RoCE对底层网络的要求截然不同。理解这一点是选型与配置的第一步。

  • RoCEv1:链路层协议,要求收发双方处于同一二层广播域,不能跨VLAN或子网,实际部署极少。
  • RoCEv2:基于UDP/IP封装(目标端口4791),可路由,是当前唯一值得考虑的版本。它允许跨三层组网,但代价是必须依赖网络提供无损或近似无损的转发条件。

典型的数据中心RoCE拓扑通常采用Spine-Leaf(脊-叶)架构,而非传统的三层树形结构。原因在于RoCE流对延迟和丢包极度敏感,Spine-Leaf提供等长路径和低扇出,配合ECMP(等价多路径)可实现高带宽与冗余。

Spine-1 Spine-2 Leaf-1 Leaf-2 Leaf-3 存储节点 GPU服务器 GPU服务器 存储节点 GPU服务器 Spine-Leaf 两层架构:所有Leaf与所有Spine全互联 RoCEv2 跨Spine转发需依赖PFC + ECN 保障无损 无损保障机制 PFC:逐跳流量控制 ECN:端到端拥塞标记

上图展示了典型的RoCEv2组网。每个Leaf下挂GPU服务器或存储节点,Leaf与Spine之间通过多条链路互联。当流量从GPU服务器发往存储节点时,可能经过Leaf-2 → Spine-1 → Leaf-1,也可能经过Leaf-2 → Spine-2 → Leaf-1,由ECMP根据哈希结果选择路径。这种架构下,任何一条链路拥塞都可能引发PFC暂停帧,进而导致队头阻塞,因此必须精细配置PFC与ECN。

3.2 无损网络的核心:PFC(优先级流量控制)

PFC(IEEE 802.1Qbb)是RoCE无损网络的基础。它扩展了传统的802.3x流控,将流量划分为8个优先级(VLAN Priority 0~7),并允许对每个优先级独立进行流控。

PFC的工作原理是:当接收端某个优先级的队列占用超过阈值时,向发送端发送PFC暂停帧(Pause Frame),发送端收到后停止发送该优先级的流量,直到收到恢复帧或定时器超时。

PFC配置要点(以NVIDIA Spectrum交换机为例)

# 启用PFC,仅对优先级3(RoCE通常使用3或4)生效
mlag
interface ethernet 1/1
  priority-flow-control mode on
  priority-flow-control priority 3
  priority-flow-control priority 3 pause-timer 65535

# 为RoCE流量创建无丢弃类
class-map type qos match-all ROCE_CLASS
  match priority 3
policy-map type qos PFC_POLICY
  class ROCE_CLASS
    pause no-drop
interface ethernet 1/1
  service-policy type qos input PFC_POLICY

配置PFC时,必须注意以下三个关键参数:

  • 优先级划分:RoCE流量应独占一个优先级(通常为3或4),与普通TCP流量(优先级0)隔离,避免相互影响。
  • 暂停帧阈值:设置过小会导致频繁触发PFC,降低吞吐;设置过大会增加延迟和缓冲占用。建议根据交换机缓冲区大小和预期流量突发量调整。
  • 无丢弃队列(no-drop):必须为RoCE优先级配置no-drop队列,否则PFC无法生效。
常见误区:许多工程师认为“只要全局开启PFC就能实现无损”。实际上,PFC必须端到端逐跳启用——从服务器网卡到Leaf、从Leaf到Spine、再到对端Leaf和服务器网卡,每一跳的PFC配置必须一致。任何一跳未启用PFC,整个链路就会退化为有损模式,RDMA性能将急剧下降。

3.3 ECN(显式拥塞通知)——端到端的拥塞控制

PFC解决了逐跳的无损问题,但它只是“治标”——当拥塞发生时,PFC通过暂停上游来防止丢包,但可能引发拥塞扩散(一个队列阻塞导致多个上游队列堆积)。ECN(IEEE 802.1Qau)则从端到端角度解决拥塞问题。

ECN的工作流程如下:

  1. 发送端在IP头中设置ECT(ECN-Capable Transport)标记,表明自己支持ECN。
  2. 交换机检测到队列长度超过阈值时,将数据包的CE(Congestion Experienced)位置1,而不是直接丢弃。
  3. 接收端收到CE标记的包后,在ACK中反馈拥塞信息。
  4. 发送端根据反馈动态降低发送速率(通常配合DCQCN算法)。
参数推荐值说明
ECN阈值(kmin)100~200 KB队列长度超过此值开始标记
ECN阈值(kmax)300~500 KB队列长度超过此值强制标记所有包
标记概率随队列长度线性增长从kmin到kmax逐渐增加标记概率
CNP(拥塞通知包)间隔50~100 μs接收端发送CNP的最小间隔

ECN配置示例(Cisco Nexus 9000系列)

policy-map type network-qos ROCE_QOS
  class type network-qos class-default
    congestion-control ecn
    ecn threshold 100000 bytes
    ecn max-threshold 400000 bytes

system qos
  service-policy type network-qos ROCE_QOS

interface ethernet 1/1
  priority-flow-control mode on
  priority-flow-control priority 3

ECN与PFC必须配合使用:PFC负责“不丢包”,ECN负责“不拥塞”。理想情况下,ECN在拥塞初期就触发发送端降速,从而避免队列持续增长到触发PFC的程度。如果ECN配置不当或未启用,PFC将成为唯一防线,但此时网络吞吐和延迟都会显著恶化。

3.4 典型故障场景与排障复盘

某互联网公司AI训练集群采用RoCEv2组网,GPU服务器通过100Gbps接入Leaf交换机。上线初期发现训练任务吞吐仅为预期的60%,且伴随周期性超时。

排查过程:

  • 第一步:检查网卡统计。发现rx_pause计数持续增长,说明网卡频繁收到PFC暂停帧。
  • 第二步:定位拥塞点。在Leaf交换机上执行show queueing statistics,发现优先级3的队列深度经常超过ECN阈值。
  • 第三步:检查ECN配置。发现Leaf交换机上ECN阈值设置为默认值(约500KB),远大于推荐的100~200KB,导致ECN标记过晚,拥塞已经扩散到PFC层面。
  • 第四步:检查PFC配置。发现Spine交换机上PFC仅启用了优先级4,而Leaf上配置的是优先级3,优先级不匹配导致PFC跨设备失效。

解决方案:

  1. 统一所有交换机及网卡的RoCE优先级为3。
  2. 将ECN阈值调整为kmin=150KB,kmax=400KB。
  3. 在服务器网卡上启用DCQCN算法,并设置CNP间隔为50μs。

调整后,训练任务吞吐恢复到理论值的92%,PFC暂停帧数量下降约80%。

复盘要点:RoCE无损网络是一个系统工程,任何一跳的配置不一致都会导致整体性能崩塌。建议在部署前使用rdma_cm或ib_write_bw工具进行端到端带宽测试,并同时监控网卡和交换机的PFC/ECN计数器,确保各跳行为一致。

3.5 配置清单与验证命令

以下是一份RoCE无损网络部署的快速检查清单,适用于所有主流交换机厂商:

检查项要求验证命令(NVIDIA)
RoCE优先级一致性所有设备使用相同优先级(如3)show priority-flow-control
PFC启用状态所有RoCE相关端口启用PFCshow interface ethernet 1/1 priority-flow-control
ECN阈值kmin 100~200KB,kmax 300~500KBshow queueing ecn
无丢弃队列RoCE优先级映射到no-drop队列show class-map type qos
缓冲区分配RoCE队列分配至少30%共享缓冲区show buffer pool
网卡配置启用DCQCN,设置CNP间隔mlxconfig -d /dev/mst/mt0 q set ROCE_MODE=2

验证无损效果的最直接方法是观察计数器:在稳定流量下,rx_pause和tx_pause计数应保持低位且不持续增长;如果PFC帧速率超过每秒数千个,说明ECN未能有效抑制拥塞,需要进一步调优阈值或检查流量模型。