拥塞、抖动与网络故障
同步训练里,几万张卡每一步都在等彼此。一个节点的网络慢 20%,全集群的 step time 就慢 20%——没有任何摊薄。网络问题在大规模集群里不是"偶尔慢一点",而是"一个坏点拖垮全部"。本章讲清楚三类现实问题:拥塞、抖动、故障,以及各自的检测与处理。
为什么最慢的一跳决定一切
Section titled “为什么最慢的一跳决定一切”以 DP 梯度同步为例:Ring all-reduce 在环上转两圈,环速由最慢链路决定;一次 all-reduce 没完成,全体卡都在等。算一笔账(万卡,step time 10 s,其中梯度同步 1 s):
| 异常 | 影响 | 全集群损失 |
|---|---|---|
| 一个节点网卡降速到 200G | 该环 all-reduce 时间 ×2 | step time +10% |
| 一个节点光模块误码重传 | 该环延迟抖动 | step time +5–20%,随机 |
| 一台 spine 拥塞 | 跨组流量拥堵 | 所有跨组 DP 组变慢 |
损失的规模与异常点的数量无关,与异常点的位置有关。 这就是网络监控必须做到"链路粒度"的原因:平均值毫无意义,长尾才是全部。
拥塞:无损网络的三大坑
Section titled “拥塞:无损网络的三大坑”一、Incast(多打一)
Section titled “一、Incast(多打一)”多个源同时向一个目标发送(参数服务器、检查点写入、分层 all-reduce 的汇聚点),交换机入端口队列瞬间溢出。RDMA 假设不丢包,溢出触发 PFC——于是:
二、PFC 风暴(RoCE 特有)
Section titled “二、PFC 风暴(RoCE 特有)”PFC 暂停帧向上游传播:下游拥塞 → 暂停上游 → 上游队列溢出 → 再暂停更上游……一个端口的拥塞能级联成全网停摆。这是 RoCE 集群最恶名昭著的故障模式,特征是"全网所有链路同时降速、找不到单点原因"。
防御:PFC 只对 RDMA 流量优先级开启、headroom 精确配置、监控每端口的 PFC 暂停计数(持续非零就是预警)。
三、ECN/DCQCN 调参不当
Section titled “三、ECN/DCQCN 调参不当”ECN 在队列超阈值(Kmin)时标记、超上限(Kmax)时丢弃,源端 DCQCN 据此降速。参数错配的症状:
- Kmin 太低:动不动就标记,带宽上不去(症状:busbw 只有线速 50–60%)
- Kmax 太高:拥塞压不住,队列溢出丢包(症状:延迟毛刺、重传)
- 与交换机配置不一致:两端各说各话
RoCE 集群上线时必须按厂商参考(Mellanox/NVIDIA 的 RoCE 部署指南)端到端核对,两端(网卡 + 交换机)参数一致是底线。
抖动:比慢更可怕
Section titled “抖动:比慢更可怕”抖动(jitter)= 同一操作的时间方差。对同步训练,抖动比平均延迟更致命:
理想: all-reduce 每步 990 ms,整齐现实: 985, 990, 1240, 988, 3050, 992, ... ← 毛刺每一步都要等最慢的那次。5% 的毛刺概率 × 10 倍毛刺时长 = 平均 step time +45%。常见毛刺源:
| 源 | 特征 | 检测 |
|---|---|---|
| 光模块误码 | FEC 纠错计数增长,重传 | ethtool -S 看 FEC/Corrected Errors |
| 链路 flap | 短暂 down/up,路由重算 | 链路状态日志,LLDP 抖动 |
| 拥塞毛刺 | 队列瞬时超限 | 交换机队列深度遥测(telemetry) |
| 跨流量干扰 | 存储流量挤训练流量 | 物理隔离或 QoS 分级 |
| 自适应路由重排 | 乱序到达,重组开销 | 环境变更时对比 |
训练侧的对策:把网络遥测(每链路 FEC/CRC/PFC/队列深度)与训练 step time 对齐采样——毛刺时刻反过来查网络计数器,定位准确率远高于事后猜测。
故障:光模块是第一大户
Section titled “故障:光模块是第一大户”大规模集群的真实故障统计里,网络故障的头号来源不是交换机,是光模块(数量最大:万卡集群数万个,且对温度/灰尘敏感)。其次是线缆与连接器,再次才是交换机芯片与网卡。
按影响分类与处理:
| 故障 | 症状 | 处理 |
|---|---|---|
| 光模块劣化 | FEC 计数持续增长,无硬错误 | 计划性更换(别等它坏) |
| 链路硬故障 | down 或 CRC 错误暴涨 | 立即隔离该链路 |
| 节点网卡故障 | 该节点通信超时 | 立即把节点踢出训练 |
| 交换机端口故障 | 一组链路同时异常 | 流量切到冗余路径 |
| 网络分区(脑裂) | 部分节点互相不可达 | 训练必然失败,靠容错机制 |
训练侧的关键设计是"快速隔离坏点":一个坏节点留在环里,每步 all-reduce 都超时重试,拖垮全体;踢出去,集群损失 1/10000 的算力继续跑。生产集群标配:训练健康检查 + 自动排除(连续 N 次通信超时 → 通知调度器摘除节点 → 集群缩小规模继续,见训练容错)。
按"能回答三个问题"来建:
- 现在谁慢? 每链路的吞吐、FEC/CRC、PFC/ECN 计数、队列深度——链路粒度,不是交换机粒度。
- 毛刺时刻发生了什么? 训练 step time 与网络计数器对齐采样,可回溯。
- 有没有坏点? 定期全网扫描(
ibdiagnet、交换机健康巡检),趋势化的 FEC 增长是更换依据。
- 同步训练无摊薄:一个节点慢 20%,全集群慢 20%;损失取决于异常位置而非数量。
- 拥塞三坑:Incast 触发 PFC、PFC 风暴级联停摆、ECN/DCQCN 两端参数错配。
- 抖动比平均慢更致命:5% 概率 × 10 倍毛刺 ≈ 平均 +45%;训练时间与网络计数器对齐采样是定位关键。
- 光模块是故障第一大户:FEC 计数趋势化监控,计划性更换优于等它坏。
- 快速隔离坏点(自动踢节点)比修复它更划算:留坏点拖垮全体,踢掉只损失 1/N 算力。
- NCCL 与集合通信算法 — 上一章:代价模型
- 训练容错与弹性 — 踢节点之后的恢复机制
- 故障恢复 — 从检查点到重启的完整链路
- 拓扑:胖树、轨道优化与并行映射 — 拥塞的拓扑根源