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 多路径负载均衡算法决策对比 HCA 发送端 QP1~QP6 流 路径组 A(LMC=2) 路径组 B(LMC=2) 路径组 C(LMC=2) 算法决策单元 轮询:按序取模 加权:按权重比例 最少连接:查拥塞计数 目标端口 1(空闲) 目标端口 2(轻载) 目标端口 3(拥塞) 算法行为说明 1 轮询:QP1→路径A,QP2→路径B,QP3→路径C,QP4→路径A…… 不考虑路径当前负载,仅按固定顺序循环。适合路径能力完全对称的场景。 2 加权:路径A权重=3,路径B权重=2,路径C权重=1,则每6个新QP中3个走A、2个走B、1个走C。 适用于链路速率不同(如 4xEDR 与 4xHDR 混合)或拓扑非对称的场景。 3 最少连接:查询各路径当前活跃QP数或拥塞计数,选择数值最小的路径。 对突发流量敏感,但需实时维护计数器,SM 或交换机需周期性采样。

上图展示了三种算法在决策时的核心差异。轮询算法不感知网络状态,加权算法通过静态权重表达路径能力差异,而最少连接算法则依赖动态反馈。在 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 路径上。

排查过程:

  1. 确认 LMC 配置:ibv_devinfo -v | grep LMC,发现 LMC=0,即未启用多路径。
  2. 修改 SM 配置,启用 LMC=1(即 2 条路径),重启 OpenSM。
  3. 再次运行测试,聚合带宽提升至 75%,但仍未达到预期。
  4. 进一步检查发现,虽然存在 2 条路径,但驱动默认使用轮询算法,而两条路径的物理距离不同(一条经过 2 跳,另一条经过 4 跳),导致短路径拥塞、长路径空闲。
  5. 改用加权算法,将短路径权重设为 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 延迟和丢包率三个核心指标的变化。只有通过量化对比,才能确定最适合当前工作负载的算法配置。