RoCE 无损网络设计
把 AI 训练网络的丢包与抖动压到接近零,让 GPU 不因网络空转。本技能给出从协议选型、参数计算、厂商落地配置到基线验证、故障排查的完整可执行链路。
一、核心原理
RoCEv2 把 RDMA 语义跑在 UDP/IP 之上(L3,可跨子网),代价是依赖底层网络不丢包。一旦交换机缓存溢出丢一个包,端到端 Go-Back-N 重传会把吞吐打到地板。因此「无损」不是不排队,而是用流控(PFC)+ 拥塞通知(ECN)+ 发送端降速(DCQCN)三层机制,让缓存永不溢出。
flowchart LR
S[发送端 GPU/NIC] -->|RoCEv2 数据流| SW1[Leaf 交换机]
SW1 --> SW2[Spine 交换机]
SW2 --> R[接收端 GPU/NIC]
SW1 -- PFC PAUSE 帧(反压)--> S
SW2 -- ECN 标记 CE 位 --> S
S -- DCQCN 降速 CNP 响应 --> SW2
- PFC(Priority Flow Control, IEEE 802.1Qbb):按优先级粒度反压。当某个无损队列缓存超过
xoff门限,交换机向上游发 PAUSE 帧停对应优先级,是「最后一道闸」。 - ECN(Explicit Congestion Notification):缓存超过
ecn_min时给包打 CE 标记,接收端回 CNP 通知发送端,是「早期预警」。 - DCQCN:发送端网卡根据 CNP 调节发送速率(乘性降、加性升),是「主降速机制」。
> 三者缺一不可:只开 PFC 会频繁触发、导致线头阻塞(Head-of-Line Blocking);只开 ECN 在突发下仍可能溢出丢包。
二、参考拓扑(两级 Spine-Leaf,2:1 收敛)
flowchart TB
subgraph Spine层
SP1[Spine-1<br/>32x400G]
SP2[Spine-2<br/>32x400G]
end
subgraph Leaf层
L1[Leaf-1<br/>32x400G 下行 + 8x800G 上行]
L2[Leaf-2]
L3[Leaf-3]
L4[Leaf-4]
end
subgraph 计算侧
G1[GPU节点 x128<br/>2x400G each]
end
SP1 --- L1 & L2 & L3 & L4
SP2 --- L1 & L2 & L3 & L4
L1 --- G1
配套 ASCII 逻辑拓扑(用于文档/PPT):
Spine-1 Spine-2
32x400G 32x400G
│ │ │ │ │ │ │ │
└──┼──┼──┼──────────────────┼──┼──┘
Leaf-1 Leaf-2 Leaf-3 Leaf-4 (32x400G down / 8x800G up)
│ │ │ │
GPU节点组A~D (每节点 2x400G, 双归到不同 Leaf)
三、关键参数决策表
| 参数 | 推荐取值 | 依据 | 常见错误 |
|---|---|---|---|
| 无损优先级 PCP | 3(或 5,全网统一) | 与普通流量隔离,避免互相 PAUSE | 各厂商默认不一致导致不通 |
| PFC 使能优先级 | 仅 3 | 只对无损队列反压 | 全优先级开 PFC → 风暴放大 |
| ECN 使能优先级 | 仅 3 | 只标记无损队列 | 全开导致普通流量被误降速 |
| MTU | 4200 或 9000(端到端统一) | 避免 IP 分片,RoCE 对分片极敏感 | 只改交换机不改网卡 |
| 交换机缓存/端口 | 智算场景建议 ≥ 8~16MB/400G 端口 | 吸收突发 + 覆盖 BDP | 缓存过小导致频繁 PFC |
ecn_min(Kmin) |
约为队列深度的 5%~10% | 早触发预警 | 设太高→预警失效 |
ecn_max(Kmax) |
约为队列深度的 60%~70% | 留出 PFC 缓冲带 | 与 xoff 重叠→直接丢包 |
xoff(PFC 触发) |
≈ 队列深度的 80%~90% | 在真溢出前反压 | 设 100%→来不及反压 |
| DCQCN 初始速率 | 线路速率的 100%(起跑全速) | 快收敛 | 初始限速损失带宽 |
> 具体数值因芯片缓存与厂商实现而异,上表为量级参考;务必用 scripts/roce_param_planner.py 按实际端口带宽与缓存算。
四、配置流程 SOP
- 确认硬件能力:网卡支持 RoCEv2(NVIDIA ConnectX / BlueField、Broadcom、Huawei 智能网卡),驱动与固件为厂商验证版本。
- 统一无损优先级:全网 PCP 统一为 3,服务器侧通过
dcb/mlnx_qos将 RDMA 流打 PCP3,业务流不打。 - 交换机开 PFC+ECN:按第三节参数在 Leaf/Spine 全端口(含服务器直连口)配置。
- 计算缓冲区与门限:跑
roce_param_planner.py生成 per-port 建议值。 - 统一 MTU:服务器 bond + 交换机端口 + 网关全线统一。
- 基线验证:用
ib_write_bw/perftest打满,观察吞吐、时延、PFC pause 计数、CNP 速率。 - 写回监控:把 PFC pause、ECN 标记、队列丢弃接入监控告警。
五、厂商落地配置示例
NVIDIA Spectrum(Cumulus Linux / NVUE)
# 开启无损:PFC + ECN 在优先级 3
nv set qos roce
nv set interface swp1-32 qos trust l3
# 缓存门限(示例,实际用脚本算)
nv set qos buffer traffic-class 3 lossless
华为 CloudEngine(智算场景)
#
# 全局使能 PFC 优先级 3 的 PFC 与 ECN
#
qos buf-policy roce
lossless-queue 3
ecn enable priority 3
quit
#
# 端口应用
#
interface 400GE1/0/1
qos buf-policy roce
trust dscp
mtu 4200
quit
Arista EOS
!
! 启用 PFC 与 ECN
!
priority-flow-control mode on
priority-flow-control priority 3 no-drop
qos ecn priority 3
!
interface Ethernet1/1
mtu 9214
!
> 完整可填空的 Spine 配置模板见 assets/config-template-spine.txt,厂商对照与逐行解释见 references/vendor-configs.md。
六、验证与基线
发布前必须拿到这四组数据,形成基线(后续每次变更回归对比):
# 吞吐(单流与多流)
ib_write_bw -d mlx5_0 --report_gbits
# 时延
ib_write_lat -d mlx5_0
| 指标 | 达标线(参考) | 采集方式 |
|---|---|---|
| 单流吞吐 | ≥ 95% 线速 | ib_write_bw |
| 平均时延 | 与基线一致(μs 级) | ib_write_lat |
| PFC pause 计数 | 稳态应≈0(偶发可接受,持续增长=异常) | 交换机 show qos pfc 计数器 |
| CNP 速率 | 非零但不过高(<10% 报文占比) | 网卡 ethtool 计数 |
| 队列丢弃 | 0 | 交换机 show qos queue |
七、常见故障排查(详见 references/troubleshooting.md)
| 现象 | 根因方向 | 首要动作 |
|---|---|---|
| 吞吐上不去、抖动大 | 某端口没开 PFC/ECN,或 MTU 不一致 | 全网核对 PFC/ECN/MTU 三件套 |
| PFC pause 计数持续飙升 | 缓存不足或门限过高 | 重算 buffer,检查是否有微突发 |
| PFC 风暴/死锁 | 无损优先级成环反压 | 开 PFC watchdog、限制 PAUSE 时长、检查拓扑环 |
| ECN 开了但没效果 | CNP 未回传或网卡 DCQCN 未使能 | 抓包看 CNP,核对网卡配置 |
| 偶发重传 | 服务器侧队列未对齐 | 核对 mlnx_qos/dcb 优先级映射 |
八、输出规范
交付时应产出:无损拓扑与优先级规划表、PFC/ECN/DCQCN 参数表(含计算依据)、缓冲区规划说明、基线测试报告(吞吐/时延/PFC/CNP)、风险清单(PFC 死锁、微突发、厂商差异)。
九、边界与风险
- PFC 有死锁/线头阻塞风险,必须配 watchdog 与 PAUSE 时长限制。
- 参数为量级参考,最终以所选芯片与厂商实测为准,不承诺绝对性能数字。
- 跨厂商异构组网(如 NVIDIA 交换机接华为网卡)需额外验证 PFC 优先级与 ECN 兼容性。
配套资源
- 参数手册:
references/pfc-ecn-parameters.md - 厂商配置对照:
references/vendor-configs.md - 故障案例库:
references/troubleshooting.md - 数据基线:
assets/roce-param-baseline.csv - 配置模板:
assets/config-template-spine.txt - 脚本:
scripts/roce_param_planner.py(参数计算)、scripts/pfc_counter_analyzer.py(PFC 计数分析) - 配套检查清单:《RoCE 无损网络设计清单》