Skip to content

第 2 周:Ethernet、IP、交换机和 ECMP 基础

对应原计划:plans/muxi-fabric-network-learning-plan.md 第 2 周。
相关工程假设:plans/muxi-fabric-probe.md 的 H6 和 W3 ECMP 熵扫描。
相关结论:project/lab-workspace/reports/rounds/muxi_topology_facts_20260719_102558.md
本章定位:作为整套手册的样板章。目标不是列网络名词,而是让你能用 Ethernet/IP/Clos/ECMP 的心智模型理解 Muxi pair matrix、rail、incast 和拓扑不可辨识性。


0. 这一周到底学什么

这一周的核心目标不是学“网络基础知识大全”,而是为了回答 Muxi fabric 探测里的一个关键问题:

当两个 GPU 节点之间通信变慢时,数据包在交换网络里到底可能走了什么路径?
我们能从端到端带宽、RTT、traceroute、IP、端口、rail 信息里推断出什么?又不能推断出什么?

这周学完之后,你应该能和 agent 讨论这些问题:

  • 为什么 traceroute 看不到 leaf/spine,并不代表没有经过交换机?
  • 为什么两台机器互通,不等于它们物理上在同一个 leaf?
  • 为什么 4 个 rail 在不同 IP 子网,不等于一定是 4 个物理独立交换平面?
  • 为什么 ECMP 有多条路径,但少量大流仍然可能撞到同一条路径?
  • 为什么 pair matrix 有块结构,不能直接命名 leaf/spine?
  • 为什么“跨组带宽减半”,不能单独证明 2:1 超分?
  • 为什么“多 QP 后变快”,只能支持 ECMP 熵相关,不能直接证明 UDP 源端口进了 hash?

这一周有一个总原则:

text
端点看到的是行为;网络组掌握的是物理;控制面暴露的是逻辑。
三者相关,但不能互相替代。

1. 先建立一张心智图

你可以先把一次跨节点通信想成这样:

text
GPU buffer

通信库 MCCL/NCCL

RNIC / HCA / xscale

RoCEv2 packet

服务器网卡端口

leaf switch

spine switch

另一个 leaf switch

目标服务器网卡端口

目标 GPU

第 2 周只关注中间这一段:

text
服务器网卡

Ethernet / IP / UDP / RoCEv2 header

leaf / spine 交换机

ECMP 路径选择

queue / buffer / scheduler

目标网卡

这里最重要的不是背字段,而是知道:

  • 哪些字段用于“找到下一跳”;
  • 哪些字段用于“做 ECMP hash”;
  • 哪些字段用于“QoS 分类”;
  • 哪些地方会排队;
  • 哪些现象会让你误判拓扑。

你要一直分清三种拓扑:

text
逻辑拓扑:IP、subnet、route、CNI annotation、Kubernetes label
物理拓扑:host rail → switch chassis/port → leaf/spine → cable
行为拓扑:pair bandwidth、RTT、incast、rail A/B、复测稳定性

Muxi 当前主要掌握的是逻辑拓扑的一部分和行为拓扑的一部分;物理拓扑的关键锚点仍缺失。


2. MAC、IP、GID:三个地址不是一回事

2.1 MAC 是什么

MAC 地址是二层地址,主要在一个二层广播域里用。

你可以粗略理解为:

text
MAC = 这块网卡在当前二层网络里的门牌号

交换机根据 MAC 表转发 Ethernet frame:

text
目的 MAC 是 A → 从端口 3 发出去
目的 MAC 是 B → 从端口 7 发出去

但是 MAC 不表达“跨多个三层网络怎么走”。它更像局部网络里的下一跳地址。

2.2 IP 是什么

IP 地址是三层地址,用来表达网络层位置和路由选择。

比如:

text
10.0.1.12/24
10.0.2.34/24

如果两个地址在同一个子网,主机会认为可以直接二层到达:

text
同子网:
源主机 → ARP/邻居发现 → 得到目标 MAC → 直接发 Ethernet frame

如果不在同一个子网,主机会发给网关:

text
跨子网:
源主机 → 发给默认网关 MAC → 网关/三层交换机继续路由

2.3 GID 是什么

在 RoCE 语境里,GID 可以理解成 RDMA/RoCE 使用的全局地址标识。RoCEv2 通常跑在 IP/UDP 上,所以 GID 往往和 IP 地址、网卡端口、GID index 相关。

在 Muxi 计划里,当前使用 GID index 5。你不需要在第 2 周完全掌握 GID table,但要知道:GID 属于 RDMA/RoCE 端点识别,不等于普通 IP,也不等于 MAC。

你可以这样记:

text
MAC:本地二层下一跳怎么转发
IP:三层网络怎么寻址/路由
GID:RDMA/RoCE 端点怎么被识别

它们不能混用。

2.4 小 case:为什么 IP 相同子网不等于物理同 leaf

假设有四台机器:

text
host A: 10.1.0.1
host B: 10.1.0.2
host C: 10.1.0.3
host D: 10.1.0.4

它们都在 10.1.0.0/24

你可能会直觉认为:

text
同子网 = 同一个交换机 = 路径短

但这不一定对。

在数据中心里,同一个二层/三层逻辑网络可以跨多个 leaf。底层可能是:

text
A 接 leaf 1
B 接 leaf 1
C 接 leaf 2
D 接 leaf 2

leaf 1 和 leaf 2 通过 spine 互联

所以同子网只能说明:

text
它们属于同一个逻辑网络 / 广播域 / overlay / routed domain

不能说明:

text
它们接在同一台 leaf;
它们之间不经过 spine;
它们路径一定短;
它们带宽一定高。

这就是为什么 Muxi 拓扑事实报告强调:四个 rail 的 IP 子网可以说明逻辑隔离,但不能证明四个物理独立交换平面。


3. L2 switch、L3 router、traceroute:为什么看不到交换机

3.1 L2 交换机怎么转发

L2 switch 看 Ethernet header:

text
src MAC
dst MAC
VLAN tag
EtherType

它主要做:

text
查 MAC 表 → 决定从哪个端口发出去

它不会像路由器那样减少 IP TTL。

所以如果数据包经过了很多 L2 交换机,traceroute 通常也不会显示它们。

3.2 L3 路由器怎么转发

L3 router / 三层交换机会看 IP header:

text
src IP
dst IP
TTL
DSCP/ECN
protocol

它转发时会让 TTL 减 1。

traceroute 依赖 TTL 递增:

text
TTL=1 → 第一跳三层设备回 ICMP
TTL=2 → 第二跳三层设备回 ICMP
TTL=3 → 第三跳三层设备回 ICMP

所以它能看到的是 L3 hop,不是所有物理交换机。

3.3 小 case:为什么 traceroute 只有 1 跳,但实际经过 leaf-spine

假设两个节点在同一个二层网络里:

text
host A

leaf 1

spine

leaf 2

host B

如果中间交换机只做 L2 转发,IP TTL 不会减少。

那么 traceroute A → B 可能看起来像:

text
1  host B

你不能因此说:

text
A 和 B 中间没有交换机

你只能说:

text
中间没有暴露为 TTL hop 的三层设备

3.4 这个结论对 Muxi 有什么用

如果你在 Muxi 里做:

text
traceroute nodeA_rail0_ip nodeB_rail0_ip

看到路径很短,不能直接写:

text
nodeA 和 nodeB 物理近;
中间没有 spine;
这两个节点同 leaf。

正确写法应该是:

text
端点可达;路径中没有暴露为 TTL hop 的三层设备;
物理 leaf/spine 信息仍需要 LLDP、配线表、交换机端口 counter 或网络组 ground truth。

4. Leaf-Spine / Clos:数据中心网络为什么长这样

4.1 最小 leaf-spine

一个简单的 2 leaf × 2 spine:

text
        spine 1       spine 2
          |              |
      ----+--------------+----
      |                  |
    leaf 1             leaf 2
   /  |  \             /  |  \
 h1  h2  h3          h4  h5  h6

每台服务器接一个 leaf。

leaf 之间不直接互联,跨 leaf 流量一般经过 spine:

text
h1 → leaf1 → spine1 或 spine2 → leaf2 → h4

4.2 为什么需要 spine

如果所有 leaf 之间两两互联,规模大了会爆炸。

Clos / fat-tree 的思路是:

text
下层 leaf 接服务器;
上层 spine 提供横向带宽;
leaf 到 spine 有多条等价路径。

好处:

  • 容易扩展;
  • 多路径;
  • 任意 leaf 到任意 leaf 路径长度相对固定;
  • 可以通过增加 spine 提升横向带宽。

4.3 bisection bandwidth 是什么

你可以把集群切成左右两半:

text
左边 32 台机器 | 右边 32 台机器

如果左边所有机器同时和右边通信,跨越这条“切割线”的总带宽就是 bisection bandwidth 关心的东西。

如果服务器总注入能力是:

text
64 台 × 每台 800Gb/s = 51200Gb/s

但中间 spine 可承载的横向带宽只有一半,那么就有超分或横向瓶颈。

4.4 oversubscription 是什么

超分可以理解成:

text
下行服务器总带宽 : 上行网络总带宽

例如一个 leaf:

text
8 个服务器端口,每个 200G
4 个上行端口,每个 200G

那么:

text
下行总带宽 = 8 × 200G = 1600G
上行总带宽 = 4 × 200G = 800G
超分比 = 1600 : 800 = 2 : 1

这意味着:

text
如果所有服务器都向 leaf 外部打满,leaf 上行不够。

但注意,这不是说任何一对 pair 都只有一半带宽。超分是聚合层面的容量关系。

4.5 小 case:为什么“跨组带宽减半”不能直接证明 2:1 超分

假设你看到:

text
组内 pair: 24GB/s
跨组 pair: 12GB/s

你可能想说:

text
跨组少一半,所以物理超分 2:1。

但可能原因很多:

  1. ECMP 两条 flow 撞同一条 path;
  2. 接收端 rail 没用满;
  3. MCCL/QP/channel 映射不同;
  4. 背景流量占了某个上行;
  5. PFC/ECN 让发送端降速;
  6. 测量时同步点造成 tail rank 等待;
  7. 真实物理确实 2:1 超分。

所以这个现象只能说:

text
支持“跨组路径存在共享容量瓶颈”的假设。

不能直接说:

text
物理超分比就是 2:1。

工程计划里也明确写了这个限制:多 QP 后更快不能单独证明 UDP 源端口参与哈希,跨组带宽减半不能单独证明物理超分比是 2:1。


5. ECMP:多路径不是自动平均

5.1 ECMP 是什么

ECMP = Equal-Cost Multi-Path。

意思是:从一个交换机到目的地,有多条代价相同的下一跳。

比如:

text
leaf 1 到 leaf 2 可以走:
leaf1 → spine1 → leaf2
leaf1 → spine2 → leaf2
leaf1 → spine3 → leaf2
leaf1 → spine4 → leaf2

这些路径在路由意义上等价。

5.2 为什么不逐 packet 随机

如果每个 packet 随机选路径,可能出现乱序:

text
packet 1 走 spine1,很快到
packet 2 走 spine2,排队慢
packet 3 走 spine3,很快到

接收端看到:

text
1, 3, 2

对 TCP/RDMA 这类协议会带来问题。

所以常见做法是 flow-based ECMP:

text
同一条 flow → hash 到同一条 path

这样同一 flow 内基本不乱序。

5.3 hash 用哪些字段

具体厂商不同,但常见可能包括:

text
src IP
dst IP
L4 protocol
src port
dst port
IPv6 flow label
RoCE UDP source port

RoCEv2 是 IP/UDP 封装,所以 UDP 端口有机会参与 hash。

但你不能默认某个字段一定参与,必须看交换机配置、厂商实现或抓包/计数器验证。

5.4 小 case:4 条大流散到 4 条 path,为什么仍然可能不均

假设有 4 条 ECMP path:

text
path A
path B
path C
path D

也有 4 条大象流:

text
flow 1
flow 2
flow 3
flow 4

理想情况:

text
flow1 → A
flow2 → B
flow3 → C
flow4 → D

每条 path 一条流,很均衡。

但 hash 可能得到:

text
flow1 → A
flow2 → A
flow3 → C
flow4 → C

这时:

text
A 有 2 条流
B 有 0 条流
C 有 2 条流
D 有 0 条流

即使有 4 条等价路径,也只有 2 条被用了。

如果每条流都很大,就会出现:

text
有些路径拥塞;
有些路径空闲;
端到端带宽下降。

这就是“多条等价路径不等于自动均匀”的核心。

5.5 小 case:16 条小流为什么比 4 条大流更容易均匀

还是 4 条 path。

如果只有 4 条流,随机 hash 很容易偏。

如果有 16 条流,分布可能更接近:

text
A: 5
B: 4
C: 3
D: 4

相对均匀。

所以增加 QP / 增加 flow entropy 有时会让带宽变好。

但这只能说明:

text
路径选择 / flow hashing 可能参与了性能差异。

不能直接说明:

text
UDP 源端口一定进了 hash;
物理上一定有 N 条 ECMP path;
交换机一定是 ECMP 碰撞根因。

5.6 进阶:多级 ECMP 的“组合路径数”不等于有效路径数

在 Clos 里,路径可能是多级组合。

比如:

text
leaf → spine → leaf

如果有 4 个 spine,理论上有 4 条中间路径。

但真实有效路径数还取决于:

text
ECMP group 里实际有几个 next-hop;
某些链路是否 down;
hash 字段是否有足够熵;
流量是否集中在少量大象流;
上游/下游是否还有其他 ECMP;
rail 是否独立;
QoS 是否把流量压到同一个 queue。

所以:

text
物理有 N 条路径 ≠ 当前 workload 有效使用 N 条路径。

这句话非常重要。

Muxi 上即使网络组告诉你:

text
每个 leaf 到 spine 有 8 条 uplink

你仍然要问:

text
当前 RoCE flow 的 hash entropy 能不能打散到这些 uplink?
每个 rail 的 ECMP group 是一样的吗?
QP 数是否足够?
UDP source port 是否变化?
是否有固定 hash seed 或 polarization?
交换机是否有 per-flowlet/per-packet 机制?

这就是为什么“拓扑图 + workload 行为”必须一起看。


6. Queue / Buffer / Scheduler:交换机不是透明网线

很多人会把交换机想成:

text
输入线 → 输出线

但真实交换机会有 pipeline:

text
ingress port

parser

classifier

lookup

buffer

queue

scheduler

egress port

6.1 ingress queue

入口侧可能排队,尤其是多个输入同时进来,内部资源竞争。

6.2 egress queue

更常见的问题是 egress 方向:

text
多个 ingress port 的流量都要从同一个 egress port 出去

例如:

text
host1 ┐
host2 ├→ leaf → target host
host3 ┘

如果 target host 的出端口是 200G,而输入总量是 600G,就会在 egress queue 堆积。

6.3 shared buffer

交换机通常不是每个端口固定一块 buffer,而是有 shared buffer 池。

当多个队列同时拥塞,shared buffer 会被抢。

这会导致:

text
一个热点流量影响其他看似无关的流量。

6.4 scheduler

如果不同优先级、不同 queue 共享一个出口,scheduler 决定谁先发。

例如:

text
queue 0: 普通 TCP
queue 3: RoCE
queue 6: 控制流量

如果 QoS 配置不对,RoCE 可能没有得到预期优先级,或者 PFC/ECN 作用在错误队列。

这部分和第 5 周的 PFC/ECN/DCQCN 会接上。


7. 用 Muxi 现象理解这一周

Muxi 当前有几个重要事实:

  • 64 节点 × 8 卡 = 512 卡。
  • 每节点 4 × 200G xscale RoCEv2。
  • 跨机单流和多组互不相交 pair 可以到约 23~24GB/s。
  • 7→1、15→1 incast 的聚合入口约 24.2GB/s。
  • 4 rail 比 1 rail 快,但没有 4 倍线性收益。
  • W2 做了 2016 pair 矩阵,但没有得到稳定物理拓扑聚类。
  • 最差 pair 复测恢复,固定坏 pair 被反证。
  • 交换机 QoS/ECMP/PFC/ECN 没有 counter 闭环,所以不能下强结论。

这些事实怎么和第 2 周关联?

7.1 单流 23~24GB/s 说明什么

200Gb/s 物理口理论大概是:

text
200Gb/s ÷ 8 = 25GB/s

考虑协议开销,23~24GB/s 是合理量级。

所以单流能到这个水平,说明:

text
至少某些端到端路径可以接近单 200G rail 的有效上限。

但它不能说明:

text
所有 path 都健康;
多流不会拥塞;
交换机没有问题;
所有 rail 都均匀使用。

7.2 incast 聚合入口约 24.2GB/s 说明什么

假设多个发送者打到同一个接收 GPU/rail:

text
sender1 ┐
sender2 ├→ receiver rail
sender3 ┘

如果接收侧实际只有一个 200G 入口在承接,聚合上限接近 24GB/s 是合理的。

这说明:

text
单 GPU / 单 rail 接收入口可能是瓶颈。

但它不能说明:

text
整个机器只有 24GB/s;
整个 fabric 只有 24GB/s;
交换机一定拥塞;
PFC 一定触发。

因为整机多 rail、多 GPU 的聚合能力是另一个层级。

7.3 2016 pair matrix 为什么不能反推出 leaf/spine

拓扑事实报告总结了五个原因:

  1. ECMP 多路径:同一个 pair 不保证每次走同一路径;
  2. 对称性:Clos 里很多路径同构,带宽/时延看起来一样;
  3. 四 rail 并行:一个矩阵点是多 rail/多机制叠加结果;
  4. 缺直连锚点:没有 LLDP/交换机端口 counter,没法对齐 chassis/port;
  5. 复测恢复:慢 pair 不稳定,说明噪声/间歇拥塞大于稳定拓扑割。

所以 pair matrix 最多支持:

text
行为分组;
异常候选;
亲和关系;
共享瓶颈假设。

不能直接输出:

text
host A 和 host B 在同一个 leaf;
host C 必经 spine X;
这个 block 就是 rack;
这个 cut 就是 2:1 超分。

8. 本周最重要的辨析

8.1 逻辑拓扑 vs 物理拓扑 vs 行为拓扑

这三个必须分开。

逻辑拓扑

例如:

text
rail0: 10.0.0.0/24
rail1: 10.0.1.0/24
rail2: 10.0.2.0/24
rail3: 10.0.3.0/24

它说明 IP / 子网 / 路由层面怎么组织。

但不保证物理独立。

物理拓扑

例如:

text
host17 xscale_0 → leaf-a port 21
host17 xscale_1 → leaf-b port 19
leaf-a → spine-3 port 7

这需要 LLDP、配线表、交换机端口信息、网络组 ground truth。

行为拓扑

例如:

text
这些 host pair 带宽高;
这些 pair 在某些时段一起变慢;
这些 rail 掩码下 p50/p99 差异明显;
这个干扰 pair 会影响目标 pair。

行为拓扑来自实验,但不能自动命名物理设备。

8.2 相关性 vs 干预证据 vs ground truth

相关性

text
A-B 慢,C-D 也慢。

只能说现象一起出现。

干预证据

text
固定 A-B,加入 C-D 干扰后 A-B 变慢;
换成负对照 E-F 后 A-B 不变。

这更支持共享瓶颈。

ground truth

text
交换机 counter 显示 A-B 和 C-D 同时经过 leaf-7 uplink-3,
该口 queue occupancy / ECN / drop 在实验窗口升高。

这才接近机制闭环。

8.3 带宽下降不是一种机制

看到带宽下降,至少可能是:

text
ECMP 碰撞;
上行超分;
egress queue 拥塞;
shared buffer 被占;
PFC pause 扩散;
ECN/CNP 降速;
MCCL channel/QP 选择;
GPU↔NIC 亲和不佳;
接收端单 rail 瓶颈;
测量同步导致慢 rank 拖累;
背景流量;
间歇链路错误。

所以不能从一个现象直接跳到一个机制。


9. 推荐阅读提炼

这一周原来列了四个推荐阅读:

  1. RFC 2992:ECMP 算法分析;
  2. Fat-Tree:用 commodity switch 搭可扩展数据中心网络;
  3. VL2:可扩展、灵活的数据中心网络;
  4. Jupiter Rising:Google 十年 Clos 网络和集中式控制经验。

它们不是让你“从头精读网络论文”,而是分别补四块心智模型:

text
RFC 2992      → ECMP 怎么把 flow 映射到 path
Fat-Tree      → 为什么 leaf-spine/Clos 能提供多路径和高 bisection
VL2           → 为什么逻辑地址/服务位置可以和物理位置解耦
Jupiter       → 真实大规模数据中心为什么需要拓扑 ground truth 和集中控制

9.1 RFC 2992:ECMP 不是“平均分流”,而是“hash 到某个 next-hop”

这篇文档讲什么

RFC 2992 分析的是一种 ECMP next-hop 选择算法。它关心的问题是:当路由器/交换机面对多个等价 next-hop 时,怎么从 packet/flow 的 key 里算出应该走哪一条 next-hop。

文档特别讨论 hash-threshold 这类方法:先对能代表 flow 的字段做 hash,再把 hash 空间切成若干区域,每个区域对应一个 next-hop。它还关注路径集合变化时的 disruption,也就是 flow 被重新映射到其他路径的比例。

你只需要抓住的问题

text
ECMP 为什么不是自动平均?
为什么少量大象流会撞路径?
为什么路径集合变化会影响现有 flow?

关键知识点 1:ECMP 的单位通常是 flow,不是 packet

你可以先想象交换机有 4 条等价路径:

text
path0, path1, path2, path3

它不会对每个 packet 做:

text
packet1 → path0
packet2 → path1
packet3 → path2
packet4 → path3

因为这样容易乱序。

更常见的是:

text
flow key = hash(src_ip, dst_ip, protocol, src_port, dst_port, ...)
path = hash(flow key) mod N

所以一条 flow 通常固定走一条 path。

对 RoCEv2 来说,报文跑在 IP/UDP 上,因此 UDP 端口、IP 地址等字段可能影响 hash。但“可能影响”不等于“必然影响”,这个要看交换机配置和实现。

关键知识点 2:hash 空间均匀,不等于当前流量均匀

假设 hash 算法理论上均匀:

text
25% hash 值 → path0
25% hash 值 → path1
25% hash 值 → path2
25% hash 值 → path3

这只能说明:

text
如果有大量独立 flow,长期看可能均匀。

但如果你只有 4 条大象流:

text
flow A, flow B, flow C, flow D

一次 hash 结果可能是:

text
flow A → path0
flow B → path0
flow C → path2
flow D → path2

这时:

text
path0: 2 条大流
path1: 0 条
path2: 2 条大流
path3: 0 条

所以网络有 4 条路径,但有效用了 2 条。

关键知识点 3:路径集合变化会导致 flow 重新映射

如果 next-hop 数量从 4 变成 3,或者某条链路故障,原来的 hash 区域会重分配,一部分 flow 会换路径。

这对我们有一个启发:

text
如果某次实验中某些交换机链路状态、ECMP group、路由表、端口状态变化了,
同样的 pair 可能不再走同样的物理路径。

所以 pair matrix 不是稳定物理图,而是某个时间窗口里的行为观测。

用 Muxi case 理解

如果我们在 Muxi 上做实验:

text
固定 src/dst host
固定 rail
固定 message size
改变 QP 数:1 / 2 / 4 / 8

然后发现:

text
1 QP 慢
8 QP 快

这支持一个假设:

text
增加 flow entropy 可能改善了 ECMP path 分布。

但它不能直接证明:

text
UDP source port 一定参与 hash;
共有 8 条 ECMP path;
慢就是 ECMP 碰撞;
交换机就是根因。

因为也可能是 MCCL/RDMA 层的 QP 并发、发送队列、RNIC 调度、接收端处理发生了变化。

不能照搬的地方

RFC 2992 告诉你 ECMP 算法思想,但不告诉你当前 H3C 交换机:

text
实际 hash 字段是什么;
是否包含 UDP source port;
是否包含 IPv6 flow label;
是否按 inner/outer header hash;
ECMP group 里有几个 next-hop;
hash seed 是否固定;
是否存在 polarization。

这些必须靠网络组配置、交换机命令、端口 bytes、抓包和实验对齐。

9.2 Fat-Tree:为什么 leaf-spine 能扩展,以及什么叫 full bisection

这篇论文讲什么

Fat-Tree 论文的背景是:传统数据中心网络往往越往上层越依赖昂贵的大交换机/路由器,而且上层带宽可能只能支持边缘总带宽的一部分。

Fat-Tree 的核心思想是用大量便宜的 commodity Ethernet switch 组织成类似 Clos/fat-tree 的结构,从而在成本可控的情况下获得高聚合带宽和多路径能力。

你只需要抓住的问题

text
为什么数据中心网络不是一棵简单树?
为什么要 leaf-spine/Clos?
为什么 collective 会关心 bisection?

简单树的问题

假设网络是这样:

text
          core
        /      \
      agg1     agg2
     /   \     /   \
   leaf leaf leaf leaf

如果越往上链路越少,就会出现:

text
底下服务器总带宽很大;
上层 core/agg 承载不了所有跨组流量;
跨组通信时容易超分。

这对 AI collective 特别敏感,因为 AllReduce 不是少量随机请求,而是很多 rank 同步、大消息、周期性地一起通信。

Fat-Tree / Clos 的关键思想

Clos/fat-tree 想解决的是:

text
让横向通信有多条等价路径;
让网络 bisection bandwidth 尽可能高;
用多台便宜设备替代少数昂贵大盒子。

典型结构:

text
        spine0      spine1      spine2      spine3
          |           |           |           |
      ----+-----------+-----------+-----------+----
      |                                           |
    leaf0                 leaf1                leaf2
   /  |  \               /  |  \              /  |  \
 h0  h1  h2            h3  h4  h5           h6  h7  h8

跨 leaf 的流量可以走多个 spine。

full bisection 是什么

假设把所有服务器分成左右两半:

text
左半集群 | 右半集群

如果左边所有服务器同时向右边通信,网络中间能不能承载这个总需求?

如果能接近承载所有服务器线速,就是高 bisection,理想情况下叫 full bisection。

对 AI 集群来说,这很重要,因为大规模 collective 很容易制造跨很多节点的同步通信。

用 Muxi case 理解

Muxi 里看到:

text
单跨机流可到 23~24GB/s;
7→1、15→1 incast 聚合入口约 24.2GB/s;
w512 AllReduce bus_bw 明显下降。

这个组合说明:

text
单路径/单 rail 可以接近 200G 有效上限;
但大规模同步 collective 触发的是聚合容量、路径分布、接收入口、队列和通信库调度共同问题。

所以你不能从 w512 下降直接说:

text
物理 fabric 是 2:1 超分。

你只能把它列为候选之一:

text
可能有上行超分;
可能有 ECMP 碰撞;
可能有 shared buffer / queue;
可能有 PFC/ECN;
可能有 rank/channel/rail mapping 问题。

9.3 VL2:逻辑位置和物理位置可以解耦

这篇论文讲什么

VL2 的目标是构建一种数据中心网络,让任意服务可以灵活放到任意服务器上,同时维持服务器之间较统一的高容量和类似 Ethernet layer-2 的语义。

你不需要深入 VL2 的所有机制,但要吸收这个观念:

text
数据中心网络里,逻辑地址 ≠ 物理位置。

关键思想:地址可以分两层

可以把它抽象成:

text
Application Address:服务/主机的稳定身份
Locator Address:当前物理/拓扑位置

这样服务迁移时,应用可以继续用稳定地址;底层网络通过目录/封装/映射找到真实位置。

小 case:同一个 /24 不代表同一个 rack

假设你看到:

text
hostA: 10.10.1.11/24
hostB: 10.10.1.12/24

你可能想说:

text
它们在同一个子网,所以应该很近。

但在现代数据中心里,可能是:

text
hostA 接 leaf7
hostB 接 leaf23
中间经过 spine
逻辑上仍属于同一个网络

甚至有 overlay、CNI、虚拟网络、隧道、目录系统等机制,让逻辑地址和物理连接进一步解耦。

用 Muxi case 理解

Muxi 拓扑事实报告里有一个关键边界:

text
四个 rail 的 IP 子网可以说明逻辑隔离;
不能证明四个物理独立交换平面。

这就是 VL2 给我们的直觉:不能从逻辑地址直接推出物理拓扑。

所以如果你看到:

text
xscale_0 在 subnet A
xscale_1 在 subnet B
xscale_2 在 subnet C
xscale_3 在 subnet D

你可以说:

text
四个 rail 在逻辑网络上区分开了。

但不能说:

text
它们一定接到四套完全独立的 leaf/spine fabric。

要证明后者,需要:

text
host xscale_i → switch chassis/port 映射;
LLDP;
配线表;
交换机端口 counter;
网络组 ground truth。

9.4 Jupiter Rising:大规模 Clos 真正依赖“控制”和“可观测性”

这篇论文讲什么

Jupiter Rising 总结了 Google 数据中心网络十年演进经验。它强调多级 Clos 拓扑、commodity switch silicon、集中式控制、全局配置和可观测性。

你要抓住的是:真实大规模 Clos 不是一张静态拓扑图,而是一个持续被控制、监测、扩容、维护的工程系统。

关键知识点 1:真实 Clos 是工程系统,不只是拓扑图

教科书里的 Clos 可能是:

text
leaf → spine → leaf

但真实系统里还有:

text
路由策略;
集中配置;
故障域;
链路状态;
流量工程;
遥测;
交换机队列;
buffer;
ECMP group;
维护窗口;
故障隔离;
capacity planning。

所以“画出一个 Clos”只是开始。

关键知识点 2:控制面知道的东西,端点通常不知道

网络控制系统可能知道:

text
host 接在哪个 leaf port;
哪些 spine 可用;
哪些 link down;
ECMP group 里有哪些 next-hop;
哪些端口拥塞;
哪些 queue 在 pause;
哪些路径被限速;
哪些设备在维护。

但容器里的端点可能只能看到:

text
ip addr
ip route
ping/RTT
带宽
少量 RNIC 信息

这两者信息量差非常大。

用 Muxi case 理解

Muxi 最终结论说:

text
QoS/ECMP 物理机制没有闭环;
需要网络侧 ground truth。

这不是保守过头,而是因为没有交换机侧信息时,你缺的是关键锚点:

text
host rail → switch port;
switch queue occupancy;
PFC pause;
ECN mark;
CNP;
drop/retry;
CRC/FEC;
per-port bytes;
ECMP group;
hash field;
QoS mapping。

没有这些,端点 pair matrix 再大也只是行为观测。

9.5 四篇阅读之间的关系

可以这样串起来:

text
Fat-Tree / Clos
  解释:为什么数据中心网络有多级、多路径、高 bisection 设计。

RFC 2992 / ECMP
  解释:多路径具体怎么选,为什么是 flow hash,为什么会不均。

VL2
  解释:逻辑地址、服务位置、物理位置可以解耦,所以 IP/子网不等于物理接近。

Jupiter Rising
  解释:真实大规模 Clos 需要集中控制、配置、遥测和 ground truth;端点观测不足以恢复完整物理事实。

对应到 Muxi:

text
Muxi 现象:
  w512 AllReduce 掉速;
  单流可到 23~24GB/s;
  incast 聚合入口约 24GB/s;
  4 rail 不线性;
  pair matrix 无稳定物理聚类。

用 Fat-Tree 理解:
  大规模 collective 可能触发 bisection / 上行 / shared capacity 问题。

用 ECMP 理解:
  少量大象流、QP/port entropy、flow hash 可能导致路径不均。

用 VL2 理解:
  IP 子网和 CNI 信息只是逻辑拓扑,不能直接推出物理 leaf/spine。

用 Jupiter 理解:
  要把候选机制闭环,必须要交换机侧 ground truth 和遥测。

10. 进阶补充:packet spraying 和 flowlet switching

这两个不是本周必须精通,但知道名字有帮助。

10.1 packet spraying

逐 packet 分散到多条路径:

text
packet1 → path0
packet2 → path1
packet3 → path2

优点:

text
更容易均匀利用多路径。

缺点:

text
容易乱序。

对 RDMA/RoCE 这种对顺序、丢包、时延很敏感的流量,不是可以随便开的东西。

10.2 flowlet switching

把一条 flow 按时间间隔切成多个 flowlet。

如果两个 burst 之间有足够大的 gap,后一个 burst 可以换路径,同时尽量避免乱序。

概念上:

text
flowlet 1 → path0
短暂停顿
flowlet 2 → path2

这比 packet spraying 温和,但实现复杂,也要交换机/网络支持。

10.3 和 Muxi 的关系

如果我们只能控制 QP、rank permutation、rail、message size,那我们其实没有直接控制 packet spraying/flowlet switching。

所以不能把实验结果直接解释成:

text
交换机做了 flowlet;
交换机没做 flowlet。

我们最多说:

text
观察结果对 flow-level ECMP entropy 敏感或不敏感。

11. 本周任务设计

11.1 任务 A:画出 2 leaf × 2 spine Clos

你要能画:

text
        spine1       spine2
          |            |
       leaf1         leaf2
       /  \          /  \
     h1   h2       h3   h4

然后回答:

text
h1 到 h2:是否一定经过 spine?
h1 到 h3:可能经过哪些 spine?
如果 leaf1 到 spine1 的上行拥塞,会影响哪些 pair?
如果 ECMP hash 把 h1→h3 和 h2→h4 都放到 spine1,会怎样?

期望理解:

text
同 leaf 通信和跨 leaf 通信路径不同;
跨 leaf 有多条等价路径;
多条路径不保证流量均匀;
局部拥塞可以表现为端到端 pair 慢。

11.2 任务 B:手算 oversubscription

给一个 leaf:

text
下行:8 × 200G
上行:4 × 200G

计算:

text
下行总量 = 1600G
上行总量 = 800G
超分 = 2:1

再回答:

text
如果只有 1 台服务器向外发,能不能打满 200G?
如果 8 台服务器同时向外发,每台还能不能 200G?
如果跨组 pair 慢一半,是否一定说明这里是 2:1?

期望理解:

text
超分是聚合瓶颈,不是单 pair 固定倍率。

11.3 任务 C:ECMP balls into bins

假设:

text
4 条 ECMP path
4 条大流

随机分配一次:

text
flow1 → path1
flow2 → path1
flow3 → path3
flow4 → path3

结果:

text
path1: 2
path2: 0
path3: 2
path4: 0

再试 16 条流:

text
path1: 5
path2: 3
path3: 4
path4: 4

期望理解:

text
少量大象流更容易 hash 不均;
增加 flow entropy 可能改善;
但改善不能直接证明具体 hash 字段。

11.4 任务 D:解释 Muxi rail 子网

只读查看:

text
ip addr
ip route
ip neigh

你要回答:

text
四个 rail 是否在不同子网?
默认路由走哪里?
RoCE 数据面和控制面是否分开?
这些信息能否证明四个 rail 物理完全独立?

期望理解:

text
IP/子网是逻辑证据;
物理独立需要 LLDP、配线表、交换机端口 counter。

11.5 任务 E:解释 traceroute

如果 traceroute 看不到中间交换机,你要写:

text
这说明中间没有暴露为 L3 TTL hop 的设备;
不说明没有 L2 switch;
不说明没有 leaf/spine;
不说明路径短;
不说明没有 ECMP。

12. 你可以怎么向 agent 提问

12.1 问题模板:判断一个结论能不能下

text
我观察到 A-B pair 带宽低于其他 pair。
请按“逻辑拓扑、物理拓扑、行为拓扑”三层帮我判断:
1. 这个现象支持什么?
2. 不能证明什么?
3. 需要什么额外证据才能命名 leaf/spine 或 ECMP path?

12.2 问题模板:设计 ECMP 熵实验

text
我想验证 ECMP hash / QP entropy 是否影响 Muxi pair 带宽。
请帮我设计一个实验,要求固定端点、rail、消息大小、并发度,只改变 QP 数或 flow salt。
输出需要包含正对照、负对照、观测指标、替代解释和停止条件。

12.3 问题模板:解释一个带宽矩阵

text
这是一个 64 节点 pair bandwidth matrix。
请不要直接命名 leaf/spine。
请先判断是否存在稳定块结构、方向性慢、节点边际异常、复测稳定性。
最后只输出行为分组和需要的 ground truth。

12.4 问题模板:避免过度推断

text
如果一个跨组实验带宽大约减半,请列出至少 6 个可能原因。
然后告诉我哪些实验能区分“物理超分”“ECMP 碰撞”“接收 rail 瓶颈”和“通信库映射”。

13. 本周最小掌握清单

如果时间很少,这周至少掌握这些:

  1. MAC/IP/GID 分层:MAC 是二层下一跳,IP 是三层寻址,GID 是 RDMA/RoCE 端点标识。
  2. traceroute 边界:它看到 L3 hop,看不到普通 L2 交换机。
  3. Clos/leaf-spine:跨 leaf 通信通常经 spine,多条等价路径很常见。
  4. bisection/oversubscription:它们描述聚合容量,不是单 pair 的固定倍率。
  5. ECMP flow hash:通常按 flow hash,不是逐 packet 平均。
  6. 大象流不均:少量长流即使有多路径也可能撞路径。
  7. queue/buffer/scheduler:交换机会排队,且可能通过 QoS/PFC/ECN 影响发送端。
  8. 拓扑不可辨识:端到端矩阵最多给行为拓扑,不能自动命名物理 leaf/spine。
  9. 实验结论边界:多 QP 变快、跨组变慢、热力图有块,都只是支持假设,不是机制闭环。
  10. ground truth 需求:要命名物理拓扑,最终需要 LLDP、配线表、交换机端口计数、queue/ECN/PFC/drop/bytes 之类证据。

14. 本周结束时你应该能解释的一段话

如果有人问:

“我们有 2016 pair 带宽矩阵,能不能反推出 Muxi 的 leaf/spine 拓扑?”

你应该能回答:

text
不能直接反推。pair 矩阵是端到端行为观测,不是物理链路观测。
在对称 Clos + ECMP 下,不同物理路径可能产生相同带宽/RTT。
同一个 pair 还可能因为 ECMP、QP、rail、背景流量和队列状态变化而走出不同表现。
如果没有 LLDP、配线表、交换机端口 counter、queue/ECN/PFC/drop/bytes 等 ground truth,矩阵最多支持行为分组、异常候选和共享瓶颈假设,不能命名具体 leaf/spine。

这就是第 2 周最核心的理解。