4. 负载均衡原理:负载均衡算法在 InfiniBand 中的应用
InfiniBand 网络中的多路径能力(如 LMC、自适应路由)只是提供了“多条路可走”的物理与拓扑基础,真正决定每条路径上流量如何分配、何时切换、如何应对拥塞的,是负载均衡算法。在 IB 子网中,无论是基于发送端的 LMC 路径选择,还是交换机侧的自适应路由(AR),其核心都在于采用何种算法将数据流映射到可用路径上。本章聚焦三类经典算法——轮询(Round-Robin)、加权(Weighted)与最少连接(Least-Connections)——在 IB 环境中的具体实现逻辑、适用场景与调优要点。
4.1 核心原理:从“选路”到“分流”的算法视角
在 InfiniBand 中,负载均衡并非对每个数据包独立决策(这与传统以太网 ECMP 有本质区别)。IB 的负载均衡通常以 流(Flow) 或 队列对(QP, Queue Pair) 为粒度。一个 QP 代表一条端到端的逻辑连接,同一 QP 内的数据包必须保持严格顺序,因此不能将同一 QP 的数据包分散到不同路径上,否则将引发严重的重排序开销。因此,IB 负载均衡算法的核心任务是:将不同的 QP 流映射到不同的可用路径上,同时保证单个 QP 的报文顺序不被破坏。
在子网管理器(SM)或交换机自适应路由逻辑中,算法需要维护一张“路径状态表”,记录每条路径的实时负载、拥塞计数或权重值。当一个新的 QP 建立或一条流被识别时,算法根据当前状态从候选路径集合中选择一条。下图展示了三种算法在 IB 多路径选择中的决策逻辑差异:
上图展示了三种算法在决策时的核心差异。轮询算法不感知网络状态,加权算法通过静态权重表达路径能力差异,而最少连接算法则依赖动态反馈。在 IB 环境中,由于 Subnet Manager 负责全局路径计算,而交换机 AR 负责逐跳动态决策,实际部署中往往采用“静态计算 + 动态微调”的组合策略。
4.2 方法流程:IB 中三类算法的实现与配置
4.2.1 轮询算法(Round-Robin)
在 IB 子网中,轮询算法最常见的实现形式是 LMC 路径轮询。当主机端口配置了 LMC=2 时,SM 会为该端口计算 2 条不同的路径(例如经过不同的叶子交换机)。发送端 HCA 驱动维护一个简单的计数器 path_counter,每建立一个新 QP 时执行:
path_id = path_counter % num_paths;
path_counter++;
// 将 QP 绑定到 path_id 对应的 SLID/DLID 路径上
这种实现的开销极低,不需要任何网络状态反馈。但它的致命缺陷在于:如果某条路径上的交换机端口出现拥塞,轮询算法依然会继续向该路径分配新的 QP,直到拥塞导致丢包或 ECN 标记后,上层协议(如 NCCL 或 MPI)才能感知。
4.2.2 加权算法(Weighted)
加权算法在 IB 中通常用于非对称拓扑。例如,一台 GPU 服务器有两个 HCA 端口,分别连接到不同带宽的上行链路(一个 4xEDR=100Gb/s,另一个 4xHDR=200Gb/s)。此时 SM 或驱动可配置权重:
# 在 OpenSM 中配置端口权重(示例)
opensm -p 0 --port_weighting 1:3,2:1
# 含义:端口1权重为3,端口2权重为1,即每4个新QP中3个走端口1
加权算法需要管理员准确评估各路径的实际带宽能力,包括链路速率、MTU、交换机端口数等。权重一旦设定,在运行期间通常保持不变,除非拓扑发生变更。
4.2.3 最少连接算法(Least-Connections)
最少连接算法在 IB 中更常见于交换机自适应路由(AR)场景。Mellanox(现 NVIDIA)的交换机在启用 AR 后,每个端口维护一个 congestion counter,记录当前排队的数据包数量。当一个新的数据包需要选择输出端口时,交换机会在所有候选端口中选择计数最小的端口:
# 在 MLNX-OS 中启用自适应路由
switch (config) # ib adaptive-routing enable
# 查看各端口拥塞计数
show ib adaptive-routing counters
最少连接算法对突发流量响应迅速,但存在“抖动”问题:如果所有 QP 几乎同时建立,算法可能将大量 QP 分配到同一端口,造成瞬时过载。因此,实际实现中通常会加入阈值判断:仅当最优路径与次优路径的计数差超过一定阈值时才切换。
4.3 案例/场景:GPU 集群中的算法选择实战
某 8 节点 GPU 集群,每个节点配置 2 块 HCA(HDR 200Gb/s),通过 2 台叶子交换机接入核心网络。运行 NCCL 全归约(AllReduce)测试时,发现聚合带宽仅为理论值的 60%。通过 ibdiagnet 检查路径分布,发现所有 QP 都集中在第一条 LMC 路径上。
排查过程:
- 确认 LMC 配置:
ibv_devinfo -v | grep LMC,发现 LMC=0,即未启用多路径。 - 修改 SM 配置,启用 LMC=1(即 2 条路径),重启 OpenSM。
- 再次运行测试,聚合带宽提升至 75%,但仍未达到预期。
- 进一步检查发现,虽然存在 2 条路径,但驱动默认使用轮询算法,而两条路径的物理距离不同(一条经过 2 跳,另一条经过 4 跳),导致短路径拥塞、长路径空闲。
- 改用加权算法,将短路径权重设为 1、长路径权重设为 2(因为长路径带宽延迟积更大),带宽提升至 88%。
| 算法 | 配置前带宽 | 配置后带宽 | 提升幅度 | 适用场景 |
|---|---|---|---|---|
| 无多路径(LMC=0) | 60% | — | — | 单路径,无冗余 |
| 轮询(LMC=1) | 60% | 75% | +25% | 对称拓扑,路径等长 |
| 加权(LMC=1) | 75% | 88% | +17% | 非对称拓扑,路径能力不同 |
该案例表明,算法选择必须与拓扑结构匹配。在对称 Fat-Tree 中,轮询足够高效;但在非对称或长短板混合的拓扑中,加权算法能显著改善吞吐。
4.4 误区/复盘:常见错误与调优陷阱
误区一:认为轮询算法能自动避免拥塞。轮询只保证“数量均衡”,不保证“负载均衡”。如果不同 QP 的流量大小差异悬殊(例如一个 QP 占 90% 带宽),轮询可能导致某条路径承载了 90% 的流量,而其他路径空闲。
误区二:忽略 LMC 与自适应路由的冲突。当同时启用 LMC 多路径和交换机 AR 时,发送端选择的路径可能被交换机 AR 重新路由,导致实际路径与预期不符。此时应优先使用 AR 的动态能力,将 LMC 设为 0,避免双重决策冲突。
复盘建议:在调优前,先通过 ibdiagnet -r 或 ibnetdiscover 获取完整的拓扑图,标注每条链路的速率、跳数和当前利用率。然后根据以下清单选择算法:
- 所有路径速率相同、跳数相同 → 轮询
- 路径速率不同或跳数差异大 → 加权
- 流量突发性强、QP 生命周期短 → 最少连接(需硬件支持 AR)
- 混合场景 → 分层策略:发送端加权 + 交换机 AR 动态修正
最后需要强调的是,没有一种算法是万能的。IB 的负载均衡调优本质上是“拓扑感知 + 流量感知”的工程实践。建议在生产环境变更前,使用 ib_write_bw 或 NCCL 测试 建立基线数据,再逐步调整算法参数,观察聚合带宽、P99 延迟和丢包率三个核心指标的变化。只有通过量化对比,才能确定最适合当前工作负载的算法配置。