2. 链路聚合基础:什么是链路聚合(LAG)、为什么需要LAG、LAG的工作原理(哈希分发)

好,咱们正式开始聊链路聚合。说实话,我第一次接触 InfiniBand 的时候,觉得这玩意儿带宽已经够大了——单条链路就几十 Gbps,还要啥自行车?直到我在一个超算中心做项目,客户跑的是大规模分子动力学模拟,数据量一上来,单条链路直接被打满,丢包、重传、延迟飙升。嗯,那时候我才意识到:带宽永远不嫌多,冗余永远不嫌少。

所以,链路聚合(LAG)就派上用场了。今天这一节,咱们把 LAG 的底裤扒干净。

2.1 什么是链路聚合(LAG)

链路聚合,英文叫 Link Aggregation,简称 LAG。说白了,就是把多条物理链路捆成一条逻辑链路来用。你想想看,本来你只有一根水管,流量大了就堵;现在你并排接了三根水管,流量可以同时走三根,是不是爽多了?

在 InfiniBand 的世界里,LAG 通常是把 2 条、4 条甚至 8 条物理链路绑在一起。每条物理链路可以是 4X(四通道)或 12X(十二通道)的配置。举个例子:

物理链路配置 单链路带宽 4条LAG总带宽
EDR 4X 100 Gbps 400 Gbps
HDR 4X 200 Gbps 800 Gbps
NDR 4X 400 Gbps 1.6 Tbps

我个人习惯把 LAG 比作「高速公路的并线策略」——不是简单地把车道加宽,而是让多股车流智能地分配到不同车道上。

核心要点:LAG 对上层应用是透明的。你的 MPI 程序、存储协议、甚至操作系统看到的只是一条逻辑链路。底层怎么分流的,它们不关心,也无需关心。

2.2 为什么需要 LAG

这个问题其实很实在。我遇到过不少刚入行的朋友问:单条链路带宽已经几百 Gbps 了,还不够用吗?

答案是:真不够。原因有三:

  • 带宽叠加:最直接的需求。单个应用可能吃不满一条链路,但多个应用加起来呢?HPC 集群里几百上千个节点同时通信,流量瞬间就能把单条链路撑爆。LAG 让你可以线性扩展带宽。
  • 高可用性:这是我最看重的点。我在一个金融行业的 HPC 项目里吃过亏——一条光纤被施工队挖断了,整个集群的通信中断了半小时。有了 LAG,一条链路断了,流量自动切换到其他链路上,业务零感知。说白了,这就是硬件级别的「容错」。我曾经因为没配 LAG,半夜被电话叫起来处理链路故障,那滋味……嗯,你们懂的。
  • 成本效益:买一条 400G 的链路,和买四条 100G 的链路做 LAG,价格差多少?我算过,后者往往便宜 30%-50%。而且,四条 100G 的链路灵活性更高——你可以逐步扩容,而不是一次性砸大钱。

避坑指南:我曾经遇到一个客户,为了省钱,把不同速率(比如 100G 和 200G)的链路绑在一起做 LAG。结果呢?慢的链路成了瓶颈,快的链路也跑不满。记住:LAG 的成员链路最好同速率、同型号、同长度。

2.3 LAG 的工作原理:哈希分发

好,重头戏来了。LAG 是怎么把流量分配到多条物理链路上的?答案就是——哈希分发。

你可能会想:是不是像路由器那样轮询?或者像负载均衡那样看当前链路利用率?都不是。InfiniBand 的 LAG 用的是哈希算法,对数据包的某些字段做哈希计算,然后根据哈希值决定走哪条链路。

为什么用哈希?因为简单、快速、确定性。轮询会导致乱序——同一个流的数据包可能走不同的链路,到达顺序就乱了。哈希保证了同一个流(比如同一个 TCP 连接或同一个 MPI 消息)的所有数据包都走同一条链路,不会乱序。

具体来说,哈希的输入字段通常包括:

  • 源 LID(Local Identifier)——类似 MAC 地址,标识源端节点
  • 目的 LID——标识目的端节点
  • 源 QP(Queue Pair)号——标识发送端的队列对
  • 目的 QP 号——标识接收端的队列对
  • 服务级别(SL)——类似 QoS 优先级

哈希算法通常是 XOR 或 CRC 的变种。举个例子,假设我们有 4 条链路,哈希值对 4 取模,结果 0 走链路 0,结果 1 走链路 1,以此类推。

// 伪代码示意
hash_value = hash(src_lid, dst_lid, src_qp, dst_qp)
link_index = hash_value % number_of_links
send_packet_on_link(link_index)

这里有个细节要注意:哈希的均匀性。如果哈希算法不好,或者流量模式单一,可能导致某些链路负载高、某些链路空闲。我在一个气象模拟项目中就遇到过——所有 MPI 通信的 QP 号都是偶数,哈希结果全落在链路 0 和链路 2 上,链路 1 和链路 3 闲得发慌。

警告:哈希分发不是真正的负载均衡。它只能保证「流级别」的均匀性,不能保证「字节级别」的均匀性。如果你的集群里只有几个大流,LAG 的效果可能大打折扣。这时候,你可能需要考虑更高级的负载均衡方案,比如自适应路由(Adaptive Routing)。

2.4 两种 LAG 模式

InfiniBand 支持两种 LAG 模式,我分别说一下:

静态 LAG(Static LAG):手动配置,把几条链路绑在一起。交换机端和端节点端都要配。好处是简单、可控,坏处是配置麻烦,链路增减需要手动调整。我个人习惯在小规模集群(几十个节点)里用静态 LAG,因为配置量不大,而且我清楚每条链路的状况。

动态 LAG(Dynamic LAG):使用 LACP(Link Aggregation Control Protocol)自动协商。交换机自动发现可聚合的链路,自动绑定,链路故障时自动切换。在大规模集群(几百上千节点)里,我强烈建议用动态 LAG。为什么?因为省心。我曾经管理过一个 500 节点的集群,如果每条链路都手动配,配完估计头发都白了。

特性 静态 LAG 动态 LAG
配置方式 手动 自动协商
故障切换 手动或脚本 自动
适用规模 小规模 中大规模
协议支持 LACP

我的建议:如果你刚开始接触 InfiniBand,先从静态 LAG 入手,理解原理。等熟悉了,再上动态 LAG。别一上来就搞动态,出了问题你都不知道是配置问题还是协议问题。

2.5 小结

这一节咱们把 LAG 的基础讲透了。总结一下:

  • LAG 就是把多条物理链路捆成一条逻辑链路,提升带宽和可用性
  • 哈希分发是 LAG 的核心,保证同一个流不乱序
  • 静态 LAG 适合小规模,动态 LAG 适合大规模
  • 注意哈希均匀性,别让流量「偏科」

下一节,咱们会深入实战——怎么在 InfiniBand 交换机上配 LAG,以及怎么验证它是否生效。到时候我会拿一个真实的配置案例来讲,保证你们看完就能上手。