跳到主要内容

ECMP

哈希选路为何在 AI 负载下出现极化

核心要点

  • ECMP 用 5 元组哈希在等价路径间选路,无状态、ASIC 友好
  • AI 训练的低熵大流碰撞概率远高于通用流量(生日悖论)
  • 哈希极化让多层 Fat-tree 路径多样性退化到单层
  • E-ECMP 引入 QP Number 字段、WCMP 按容量加权是主流缓解方案

ECMP(Equal-Cost Multi-Path)是数据中心网络最基础的多路径路由策略:通过哈希将流量分配到多条等价路径,是 Fat-tree / Clos 拓扑的标准路由方案。

等价路径如何被发现?

ECMP 的前提是网络中存在多条代价相同的路径,由 IGP(Interior Gateway Protocol)在控制平面自动发现。

IGP 计算等价最短路径

数据中心内部通常运行 OSPF 或 IS-IS 协议。每台交换机通过 Link-State Advertisement 获得全网拓扑,运行 Dijkstra(SPF)算法计算到每个目的前缀的最短路径。当 SPF 发现到同一目的地存在多条总代价相同的路径时,将它们全部安装到转发表中,形成 ECMP 组(Next-Hop Group)

以 3 层 Fat-tree 为例:从任意 ToR 到另一 Pod 的 ToR,经过不同 Spine 交换机的路径代价完全相等——每条路径都是 ToR -> Agg -> Spine -> Agg -> ToR(4 跳),因此 Spine 数量等于 ECMP 组的路径数量。

ECMP 组

ECMP 组是转发表中的一个数据结构,包含到同一目的前缀的所有等价下一跳。交换机 ASIC 的转发流水线分两步:

  1. 前缀匹配:根据目的 IP 查 FIB,命中某个 ECMP 组
  2. 组内选路:对报文的 5 元组计算哈希,在组内的 $N$ 个下一跳中选择一个

ECMP 组的大小受平台限制,通常为 32-128 个下一跳。在标准 Fat-tree 中,Spine 数量不超过此上限,因此所有等价路径均可覆盖。

ECMP 如何选路?

核心问题:报文到达交换机后,ECMP 用什么输入、按什么算法在多条等价路径中选一条?

哈希函数与输入字段

ECMP 以报文的 5 元组(源 IP、目标 IP、源端口、目标端口、协议号)为输入,通过哈希函数计算路径选择索引[1]

$$\begin{equation} \text{path\_index} = \text{hash}(\text{src\_ip}, \text{dst\_ip}, \text{src\_port}, \text{dst\_port}, \text{proto}) \bmod N_{\text{paths}} \label{eq:route-ecmp-hash} \end{equation}$$

为什么是 5 元组:3 元组(源 IP + 目标 IP + 协议)的熵太低——同一对主机间的所有 TCP 连接共享相同的 3 元组,全部映射到同一条路径。加入端口字段后,每条 TCP 连接拥有独立的源端口,提供约 $2^{16}$ 的额外熵,实现连接级别的负载均衡。

业界主流哈希算法(交换机 ASIC 内的 ECMP 哈希):

算法使用厂商特点
CRC-16 / CRC-32 + XOR 折叠Broadcom(Trident/Tomahawk 系列)硬件实现简单,种子可配置
XOR / CRC 变体NVIDIA/Mellanox(Spectrum 系列)可编程哈希字段(含 UDF),种子可配置
CRC + 可配置种子Cisco(Nexus/ASR)每层交换机使用不同种子,抗极化

@tbl-route-ecmp-01 哈希函数与输入字段:算法、使用厂商、特点

哈希算法本身不影响均衡性(均为近似均匀分布),关键差异在于是否支持每层不同种子以对抗哈希极化(见下文分析)。

注意区分:Toeplitz 哈希主要用于 NIC 端的 RSS(Receive Side Scaling)——将进入 NIC 的报文分发到不同 CPU 核——与交换机内的 ECMP 是两个独立的哈希过程。两者输入字段重叠(均含 5 元组),但实现位置和目的不同。

路径选择流程

报文到达交换机入口
|
v
按目的 IP 查 FIB,命中 ECMP 组(N 个等价下一跳)
|
v
提取 5 元组 (src_ip, dst_ip, src_port, dst_port, proto)
|
v
计算 hash(5-tuple)
|
v
path_index = hash % N
|
v
选择第 path_index 个下一跳,转发报文

整个过程是无状态的——交换机不维护任何流表,仅根据当前报文头字段实时计算。这使 ECMP 对 ASIC 的存储和计算开销接近零。

同一条流的所有报文(5 元组不变)始终产生相同的哈希值,因此走同一条路径,不会产生报文乱序

数值示例

场景:8-Spine Fat-tree,GPU 节点 A(IP 10.0.1.5)向 GPU 节点 B(IP 10.0.2.8)发起 AllReduce 通信。

5 元组 = (10.0.1.5, 10.0.2.8, 49152, 4791, UDP)
hash = CRC32(5-tuple) = 0x7A3C_E1F2
index = 0x7A3C_E1F2 % 8 = 2
-> 选择 Spine-2 转发

该 AllReduce 流的所有后续报文都经过 Spine-2,路径完全确定。

为什么 AI 工作负载下 ECMP 容易碰撞?

核心问题:同样是 ECMP,为什么 AI 训练的实测带宽利用率只有 60-70%,而 Web 流量场景接近线速?

ECMP 的核心弱点是哈希碰撞——多条流被映射到同一条路径,导致该链路过载而其他链路空闲。

碰撞概率:生日悖论

$F$ 条流通过哈希映射到 $N$ 条等价路径,至少两条流碰撞到同一路径的概率等价于生日问题:

$$\begin{equation} P(\text{collision}) = 1 - \prod_{i=0}^{F-1} \frac{N - i}{N} = 1 - \frac{N!}{N^F \cdot (N-F)!} \label{eq:route-ecmp-collision} \end{equation}$$

数值示例(8-Spine Fat-tree,$N = 8$ 条等价路径,由 $\eqref{eq:route-ecmp-collision}$ 精确计算):

并发流数 $F$碰撞概率
212.5%
459.0%
692.3%
899.8%

@tbl-route-ecmp-02 碰撞概率:生日悖论:并发流数 F、碰撞概率

关键洞察:仅 4 条并发流就有近 60% 的概率产生碰撞。在 AI 训练场景中,双向 Ring AllReduce 的每个 GPU 同时向顺时针和逆时针两个方向发送数据,8 GPU 的双向 Ring 产生 16 条并发流,远超 8 条路径——碰撞几乎必然发生。

为什么 AI 工作负载碰撞尤其严重

传统数据中心流量(Web 服务、微服务调用)具备高熵特征:数千条短流并发,统计上近似均匀分散。而 AI 训练的集合通信具有低熵 + 大流特征:

  • 流数少:双向 Ring AllReduce 在 $N$ 个节点上产生 $2N$ 条并发流(每节点同时向两个方向发送),虽然多于路径数但仍远少于 Web 场景的数千条流
  • 流量大:每条流传输数十 MB 的梯度数据,持续数百毫秒到数秒
  • 同步性:所有流在同一时刻启动(BSP 同步屏障后),碰撞的影响无法被时间维度摊平

结果:碰撞的流共享一条链路的带宽,AllReduce 延迟被最慢的那条流决定(木桶效应),集群训练吞吐直接下降。

多层哈希极化

在多层 Fat-tree 中,若每层交换机使用相同的哈希函数和种子,则:

  • 第 1 层(ToR):流 F 哈希到上行端口 X
  • 第 2 层(Spine):同一流 F 用同样的哈希再次选路,结果与第 1 层相关

所有层的决策高度相关,端到端路径的多样性大幅下降——同种子叠加后,理论上的 $N$-层 fan-out 树($N^k$ 条不同路径)会因哈希值在层间被复用而显著退化。具体退化程度依赖 fan-out 结构和哈希函数性质,业界缺少通用闭式公式,需要在目标拓扑上通过抽样测量得出。

解决方案:每层使用不同的哈希种子(Cisco ip load-sharing per-packet seed),或将入口端口编号纳入哈希输入,打破层间相关性。

路径多样性的两个极端

把多层 Fat-tree 抽象为 fan-out 树:第 $i$ 层每个交换机有 $N_i$ 条上行端口,则一个流从入口到出口的"理想"路径多样性是各层 fan-out 的乘积:

$$\begin{equation} D_{\text{ideal}} = \prod_{i=1}^{k} N_i \label{eq:route-ecmp-diversity-ideal} \end{equation}$$

实际有效多样性 $D_{\text{effective}}$ 受哈希函数性质和种子配置约束,可在两个极端之间变化:

情形 A:完全独立的层间哈希(理想情况——每层独立种子或不同输入字段)

各层选路统计独立,路径多样性达到上界:

$$\begin{equation} D_{\text{effective}}^{(A)} = D_{\text{ideal}} \label{eq:route-ecmp-effective-bw-balanced} \end{equation}$$

情形 B:完全相同的哈希函数 + 种子 + 输入字段

第 1 层把流分到 $N_1$ 个桶后,第 2 层再次哈希时输入字段完全没变(5 元组不变)——同一哈希函数在同输入下产出同输出。第 2 层的"选择"是第 1 层选择的确定性函数,多样性退化为单层多样性:

$$\begin{equation} D_{\text{effective}}^{(B)} \approx N_{\min} = \min_i N_i \label{eq:route-ecmp-effective-bw-skewed} \end{equation}$$

——其它层的 fan-out 完全冗余,端到端只剩一层有效多样性。

实际部署介于二者之间,具体接近哪一端取决于:

  • 每层是否使用不同种子
  • 哈希输入是否包含入口端口编号、TTL 等"随跳变化"的字段
  • 哈希函数的雪崩效应(小输入扰动引发大输出变化的程度)

业界没有公开的通用闭式公式描述"$D_{\text{effective}}$ 如何随种子配置和输入选取衰减"——具体退化程度需要在目标拓扑上通过抽样测量得出。

对 AI 工作负载的实测影响

虽然 $D_{\text{effective}}$ 没有通用公式,但其对 AI 训练吞吐的影响有实测数据

碰撞概率 $\eqref{eq:route-ecmp-collision}$ 中的"路径数" $N$ 实际应取 $D_{\text{effective}}$ 而非 $D_{\text{ideal}}$。当 $D_{\text{effective}}$ 显著小于 $D_{\text{ideal}}$ 时,并发流碰撞概率快速逼近 100%。Meta SIGCOMM 2024 在 24K GPU 集群上的实测显示:

  • 标准 ECMP 5-元组哈希下有效带宽利用率仅 60-70%
  • E-ECMP 引入 QP Number 字段后提升到 80-90%[2]

E-ECMP 收益的物理解释是打破 5 元组同输入约束:每个 QP 拥有独立 QP Number,等价于把"输入熵"从 $\sim 2^{60}$(5 元组)扩展到 $\sim 2^{60} \times Q$(Q 个 QP),从根本上恢复了哈希多样性。

哈希极化的检测与诊断

生产环境检测哈希极化的常用方法:

  • 流量分布抽样:在 Spine 交换机统计各端口流量,理论均匀时方差应远小于均值。若方差/均值 > 1,提示极化
  • 路径多样性主动探测:在 host 端用不同 5 元组 / flow label 主动测量到目的的路径分布
  • 链路利用率热图:长期 telemetry 显示热点链路集中度

修复优先级:

  1. 在所有层(ToR / Agg / Spine)配置不同的哈希种子
  2. 把入口端口编号纳入哈希输入(多数现代 ASIC 默认支持)
  3. 启用 E-ECMP(若是 RoCEv2 集群)或 DQPLB(若已部署 NCCLX)

业界如何缓解 ECMP 哈希极化?

核心问题:不换路由协议、不引入自适应路由的前提下,怎么让 ECMP 在 AI 负载下接近理论吞吐?

E-ECMP(Meta SIGCOMM 2024)

针对 AI 工作负载的哈希极化问题,Meta 在 24K GPU RoCEv2 集群中部署了 E-ECMP(Enhanced ECMP),从两个维度扩展哈希熵:

ASIC 侧:QP 字段注入

RoCEv2 报文的 BTH(Base Transport Header)中包含目的 QP Number 字段。标准 ECMP 不解析 BTH,仅用外层 UDP 5 元组。E-ECMP 利用交换机 ASIC 的 UDF(User Defined Field) 能力——一种可编程的报文解析器,允许运维人员指定任意报文头偏移量作为额外哈希输入——将 QP Number 纳入哈希计算:

$$\begin{equation} \text{path\_index} = \text{hash}(\text{5-tuple}, \text{QP\_number}) \bmod N_{\text{paths}} \label{eq:route-eecmp-hash} \end{equation}$$

由于每个 QP 拥有唯一编号,即使 5 元组相同的多个 QP 也会散列到不同路径。

软件侧:QP Scaling

NCCL(及 Meta 的 NCCLX)在每对通信节点间建立多个 QP(通常 4-16 个),将一条逻辑 AllReduce 流拆分为多条子流。每条子流对应不同的 QP,拥有不同的源端口号,自然散列到不同物理路径。

效果:AllReduce 吞吐提升约 40%,有效带宽利用率从 60-70% 提升到 80-90%[2]

WCMP(Google Jupiter)

WCMP(Weighted Cost Multi-Path)是 ECMP 的加权版本,由 Google 在 Jupiter 网络中大规模部署[3],解决拓扑不对称链路故障场景下的流量失衡[4]

加权哈希机制

标准 ECMP 对 $N$ 条路径等权分配(每条 $1/N$)。WCMP 按链路实际可用容量分配哈希桶:

$$\begin{equation} w_i = \frac{C_i}{\sum_{j=1}^{N} C_j} \cdot B_{\text{total}} \label{eq:route-wcmp-weight} \end{equation}$$

其中 $w_i$ 为第 $i$ 条路径分配的哈希桶数量,$C_i$ 为该路径的可用容量,$B_{\text{total}}$ 为哈希桶总数。报文的 hash % B_total 落入哪个桶,就走对应的路径。

SDN 控制器动态调权

Google 的 SDN 控制器(Jupiter Fabric Manager)持续收集链路状态:

  1. 检测链路故障或容量降级
  2. 重新计算每条路径的权重向量
  3. 将更新的桶映射下发到受影响的交换机

数值示例:Fat-tree 中 4 条等价路径(各 400G),其中一条降级为 100G:

  • 标准 ECMP:4 条路径各分 25% 流量,但降级链路只有 1/4 容量,实际过载 4 倍
  • WCMP:总容量 = $400 \times 3 + 100 = 1300\text{G}$,降级路径分配 $100/1300 = 7.7\%$ 的桶,其余三条各 $400/1300 = 30.8\%$,流量与容量匹配

在更极端的场景下(多条链路同时故障或严重降级),ECMP 的流量分配比差距可达 25 倍[3],WCMP 通过动态调权消除这种失衡。

Resilient ECMP(一致性哈希)

标准 ECMP 在 ECMP 组成员变更时(如某条路径故障移除),所有流的 hash % (N-1) 结果都可能改变,导致大量流迁移路径(流量震荡)。

Resilient ECMP 使用一致性哈希(Consistent Hashing):预分配固定数量的哈希桶到各路径,路径故障时仅将该路径的桶重分配给其他路径,不影响未故障路径上的已有流

三种变体的性能对比

核心问题:标准 ECMP / E-ECMP / WCMP 在带宽利用率、硬件要求、故障鲁棒性上各自做了什么取舍?

指标标准 ECMPE-ECMPWCMP
有效带宽利用率60-70%(AI 负载)80-90%85-95%
实现复杂度最低低(需 ASIC UDF)中(需 SDN 控制器)
硬件要求通用 ASIC支持 UDF 的 ASIC通用 ASIC
应对拓扑不对称
故障时流量震荡高(全局重哈希)低(可结合 Resilient ECMP)

@tbl-route-ecmp-03 性能特性:指标、标准 ECMP、E-ECMP 等

何时该用 ECMP,何时不该?

适用场景

  • Fat-tree / Clos 拓扑,路径等价性强
  • 通用互联网流量(流数量多、单流带宽小、熵高)
  • 需要低成本、高兼容性的部署环境

局限

  • 哈希极化:AI 训练场景中流数少、流量大、同步性强,碰撞概率高(见 $\eqref{eq:route-ecmp-collision}$ 分析)
  • 无法响应实时拥塞:路径选定后不随网络状态变化,某条链路过载后无法自动迁移流量
  • 非 Fat-tree 拓扑收益有限:Torus、Dragonfly 等拓扑的等价路径数量少,ECMP 分散效果差

选型建议

  • Fat-tree + AI 工作负载:优先使用 E-ECMP + QP Scaling
  • 拓扑不对称或存在链路故障:使用 WCMP
  • 需要实时拥塞响应:考虑自适应路由(AR)

Takeaway

知识点核心结论
ECMP 选路机制5 元组哈希 % 路径数,无状态、流级绑定、ASIC 友好
AI 负载碰撞双向 Ring AllReduce 同步发起,4 条流即 60% 碰撞概率(生日悖论)
哈希极化多层同种子哈希让多层 Fat-tree 的有效路径多样性退化到 $\min_i N_i$
E-ECMP把 RoCEv2 QP Number 纳入哈希,吞吐 +40%(Meta SIGCOMM 2024)
WCMP按链路容量加权分桶,应对拓扑不对称和链路降级(Google Jupiter)
Resilient ECMP一致性哈希避免 ECMP 组变更时的全局流量震荡

参考资料

  1. Hopps, Analysis of an Equal-Cost Multi-Path Algorithm, RFC 2992, 2000. https://www.rfc-editor.org/rfc/rfc2992
  2. Gangidi et al., RDMA over Ethernet for Distributed AI Training at Meta Scale, SIGCOMM 2024. https://dl.acm.org/doi/10.1145/3651890.3672233
  3. Poutievski et al., Jupiter Evolving: Transforming Google's Datacenter Network via Optical Circuit Switches and Software-Defined Networking, SIGCOMM 2022. https://dl.acm.org/doi/10.1145/3544216.3544265
  4. Zhou et al., WCMP: Weighted Cost Multipathing for Improved Fairness in Data Centers, EuroSys 2014 / Google Research. https://research.google/pubs/pub49093/