4、Fat-Tree拓扑设计:K-ary N-tree结构、计算节点与交换机端口配比、带宽收敛比计算

聊到InfiniBand组网,Fat-Tree是绕不开的话题。说实话,我见过太多人一上来就堆硬件,结果网络性能跑不满,钱花了不少,问题出在哪?多半是拓扑没设计好。

Fat-Tree,也叫Clos网络,说白了就是让网络像一棵树一样分层生长。但跟普通树不一样,它的「树干」足够粗,越往上带宽越宽,不会出现瓶颈。嗯,这里要注意,我们说的Fat-Tree通常指K-ary N-tree,这是最经典的一种实现。

4.1 K-ary N-tree结构解析

先拆解一下这个名字。K-ary N-tree,K代表每个交换机端口的数量,N代表树的层数。我习惯把K理解为「扇出系数」,它直接决定了网络的规模。

举个例子,一个K=16,N=2的Fat-Tree,意味着:

  • 每个交换机有16个端口
  • 网络有2层(Leaf层 + Spine层)
  • 最多可以挂载 (K/2)^N * K 个计算节点?不对,我重新算一下

其实有个更直观的公式。对于K-ary N-tree:

  • 交换机总数 = N * (K/2)^(N-1) * K/2?嗯,这个容易记混。我一般用另一种方式理解:
  • Leaf交换机数量 = (K/2)^N
  • Spine交换机数量 = N * (K/2)^(N-1)
  • 计算节点数量 = (K/2)^N * (K/2)

我在项目中遇到过K=36,N=2的组网。当时算出来Leaf交换机有18^2=324台,Spine有2*18=36台,总共能挂5832个节点。嗯,这个规模对于中小型HPC集群刚刚好。

核心要点:K-ary N-tree的「无阻塞」特性,依赖于上行带宽等于下行带宽。说白了,就是每个Leaf交换机到Spine的链路总带宽,不能小于Leaf到计算节点的总带宽。

为什么会这样?你想想看,如果上行带宽只有下行的一半,那所有节点同时通信时,数据就会堵在上行口。这就是带宽收敛比的概念,我们后面细说。

4.2 计算节点与交换机端口配比

端口配比是组网的第一步,也是最容易出错的地方。我见过有人买了48口交换机,结果只用了24口连节点,剩下24口空着。浪费啊!

对于Fat-Tree,端口配比有个黄金法则:一半端口连计算节点,一半端口连上行交换机

以常见的36口HDR交换机为例:

  • 18个端口连计算节点(Downlink)
  • 18个端口连Spine交换机(Uplink)

这样每个Leaf交换机可以挂18个节点。那Spine交换机需要多少台?

假设我们有36台Leaf交换机,每台需要18个上行口,总共需要36*18=648个上行口。每个Spine交换机提供18个下行口(连Leaf),所以需要648/18=36台Spine交换机。

你看,Leaf和Spine的数量刚好相等。这不是巧合,是K=36,N=2的Fat-Tree的固有特性。

交换机类型 端口用途 端口数量 连接对象
Leaf(36口) Downlink 18 计算节点
Leaf(36口) Uplink 18 Spine交换机
Spine(36口) Downlink 36 Leaf交换机

实战技巧:我建议在规划时预留10%-20%的端口余量。比如你算出来需要300个节点端口,那就按350个来配。为什么?因为后期扩容、故障替换都需要端口。我曾经吃过这个亏,集群刚建好就满了,后来加节点只能重新布线,折腾了整整一周。

4.3 带宽收敛比计算

带宽收敛比,是衡量网络是否「无阻塞」的关键指标。公式很简单:

收敛比 = 上行总带宽 / 下行总带宽

如果收敛比 = 1:1,那就是无阻塞网络。如果收敛比 = 1:2,意味着上行带宽只有下行的一半,网络存在阻塞。

在Fat-Tree中,我们追求的就是1:1收敛比。怎么算?

还是用K=36,N=2的例子:

  • 每台Leaf交换机:18个下行口 × 200Gbps(HDR)= 3600Gbps
  • 每台Leaf交换机:18个上行口 × 200Gbps = 3600Gbps
  • 收敛比 = 3600 / 3600 = 1:1

完美!这就是无阻塞。

但现实中,很多人为了省钱会降低收敛比。比如用1:2甚至1:4。我见过一个客户,为了省交换机,把上行口砍了一半,结果跑MPI Allreduce时性能直接腰斩。嗯,省了钱,丢了性能,得不偿失。

避坑指南:我曾经在一个项目中,客户坚持要用1:2收敛比,说「跑跑AI训练应该没问题」。结果模型并行通信时,梯度同步慢得像蜗牛。后来我给他算了一笔账:省下的交换机钱,还不够GPU闲置浪费的电费。最后乖乖改回了1:1。

所以我的建议是:计算密集型应用(HPC、AI训练),必须1:1收敛比。IO密集型(存储、大数据),可以适当放宽到1:2甚至1:4。

4.4 实战:K=16,N=2 Fat-Tree设计

光说不练假把式。我们动手设计一个K=16,N=2的Fat-Tree。

第一步:确定规模

  • Leaf交换机数量 = (16/2)^2 = 64台
  • Spine交换机数量 = 2 * (16/2)^(2-1) = 16台
  • 计算节点数量 = 64 * 8 = 512个

第二步:连线规划

  • 每台Leaf交换机:8个口连节点,8个口连Spine
  • 每台Spine交换机:16个口连Leaf,每个Leaf连1个口
  • 总共需要64*8=512根节点线,64*8=512根Spine线

第三步:带宽验证

  • Leaf下行带宽:8 * 200Gbps = 1600Gbps
  • Leaf上行带宽:8 * 200Gbps = 1600Gbps
  • 收敛比 = 1:1,无阻塞

你看,只要按公式来,设计其实很机械。但真正考验人的是布线、配置和调优。这些我们后面章节会详细讲。

K=16, N=2 Fat-Tree 拓扑结构 Spine层 (16台交换机) S1 S2 S3 ... S16 Leaf层 (64台交换机) L1 L2 L3 L4 L5 L6 ... L64 计算节点层 (512个节点) ... 共512个节点 Spine交换机 (16台) Leaf交换机 (64台) 计算节点 (512个) 带宽配比 Leaf下行: 8×200Gbps = 1600Gbps Leaf上行: 8×200Gbps = 1600Gbps 收敛比 = 1:1 (无阻塞)

这张图展示了K=16,N=2的Fat-Tree全貌。你看,从节点到Leaf,再到Spine,每一层的带宽都是匹配的。这就是无阻塞网络的精髓。

最后说一句,Fat-Tree设计看似公式化,但真正落地时有很多细节。比如线缆长度、端口分组、路由算法选择,都会影响最终性能。我建议你在纸上先画一遍拓扑,再动手布线。别问我怎么知道的,都是教训换来的经验。

专注资料整理