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全貌。你看,从节点到Leaf,再到Spine,每一层的带宽都是匹配的。这就是无阻塞网络的精髓。
最后说一句,Fat-Tree设计看似公式化,但真正落地时有很多细节。比如线缆长度、端口分组、路由算法选择,都会影响最终性能。我建议你在纸上先画一遍拓扑,再动手布线。别问我怎么知道的,都是教训换来的经验。