二、多路径路由概念:为什么需要多路径?LID路由与GRH路由的区别

多路径路由,说白了就是让数据包在IB网络里能走多条不同的路。你可能会问:一条路走到底不好吗?嗯,我刚开始接触IB网络时也这么想。直到有一次在数据中心里,一条链路故障导致整个训练任务挂了,我才意识到单一路径有多脆弱。

为什么需要多路径?

我总结下来,核心原因有三个:

  • 带宽聚合:单条链路带宽有限,多路径能把多条链路捆在一起用。比如4条100Gbps的链路,理论上能提供400Gbps的吞吐量。我在项目中遇到过,单靠提升单链路带宽成本太高,多路径反而是性价比最高的方案。
  • 故障容错:一条路径断了,流量自动切到其他路径上。我曾经在某个超算集群里,一条光纤被老鼠咬断了,但训练任务完全没中断——多路径路由救了场。
  • 负载均衡:流量均匀分布到多条路径上,避免某条链路成为瓶颈。你想想看,如果所有流量都挤在同一条路上,那跟早高峰堵车有什么区别?

核心观点:多路径不是锦上添花,而是IB网络高可用、高性能的基石。没有多路径,IB网络就跟普通以太网没什么两样。

LID路由与GRH路由的区别

IB网络里有两种路由方式:LID路由和GRH路由。我习惯把它们比作「本地导航」和「全球导航」。

LID路由:本地子网内的导航

LID(Local Identifier)是IB网络里每个端口在子网内的唯一标识。说白了,LID就像你家小区里的门牌号——只在小区内有效,出了小区就不认了。

  • 范围:只在单个子网内有效
  • 长度:16位,取值范围0x0001到0xBFFF
  • 路由方式:基于LID的线性转发,交换机查LID转发表
  • 特点:简单、快速、延迟低

我记得有一次调试一个IB子网,发现某个节点死活ping不通。查了半天,原来是LID配置冲突了——两个端口配了同一个LID。嗯,这种低级错误我犯过一次就再也没犯过。

GRH路由:跨子网的全球导航

GRH(Global Route Header)是跨子网通信时用的。它基于GID(Global Identifier),GID其实就是IPv6地址格式——64位子网前缀+64位接口ID。

  • 范围:跨子网,甚至跨IB fabric
  • 长度:128位(IPv6格式)
  • 路由方式:基于GID的逐跳路由,类似IP路由
  • 特点:灵活、可扩展、但开销更大

个人经验:我建议在单子网场景下尽量用LID路由,延迟更低。跨子网通信才用GRH。别一上来就全上GRH,那是给自己找麻烦。

两者对比

对比项 LID路由 GRH路由
地址长度 16位 128位
作用范围 单子网 跨子网
路由表大小 小(最多48K条目) 大(理论上无限)
转发延迟 较高(需查更长的表)
配置复杂度 简单 复杂(需配置子网前缀等)
典型场景 机柜内、小规模集群 跨机房、大规模fabric

多路径在LID和GRH中的实现

你可能会问:多路径在两种路由方式下怎么实现?我分别说说。

LID下的多路径

LID路由的多路径主要靠LMC(LID Mask Control)实现。LMC允许一个端口拥有多个LID地址,每个LID对应一条不同的路径。

# 配置LMC示例(以Mellanox交换机为例)
# 设置端口1的LMC为2,表示该端口有2^2=4个LID
ibportstate -D 1 1 LMC 2

# 查看LID分配
ibportstate -D 1 1 LID
# 输出:LID 0x0010 (base LID)
# 实际可用LID范围:0x0010, 0x0011, 0x0012, 0x0013

避坑指南:我曾经把LMC设得太大,导致LID空间被快速耗尽。一个子网最多48K个LID,LMC每增加1,LID消耗量翻倍。建议LMC值不超过3,否则LID不够用。

GRH下的多路径

GRH路由的多路径更灵活。它基于GID的流标签(Flow Label)源GID选择来实现多路径。说白了,就是让同一个目的地的流量走不同的路径。

# GRH多路径配置思路(伪代码)
# 1. 为每个目的GID配置多条下一跳
# 2. 基于哈希算法选择路径
# 3. 哈希因子可以是:源GID、目的GID、流标签等

# 示例:OpenSM路由策略配置
# 使用"updn"算法,支持多路径
opensm -R updn -M

多路径路由的核心逻辑

我画了一张图,帮你理解多路径路由的整体逻辑:

多路径路由核心逻辑 源节点 目的节点 交换机A 交换机C 路径1(LID: 0x0010) 交换机B 交换机D 路径2(LID: 0x0011) 交换机E 交换机F 路径3(GID流标签) 多路径选择逻辑 哈希(源LID/GID, 目的LID/GID, 流标签) → 路径索引 路径索引 → 选择路径1/2/3

这张图展示了多路径的核心逻辑:源节点到目的节点之间,存在多条物理路径。每条路径可以对应不同的LID(LMC实现)或不同的GID流标签(GRH实现)。路径选择由哈希算法决定,确保同一流的数据走同一条路径,避免乱序。

实际项目中的选择建议

我根据多年经验,给你几个实用建议:

  1. 小规模集群(<100节点):只用LID路由+LMC多路径就够了。配置简单,性能也够用。
  2. 中规模集群(100-1000节点):建议LID路由为主,GRH路由为辅。跨子网通信用GRH,子网内用LID。
  3. 大规模集群(>1000节点):必须上GRH路由。LID空间不够用,GRH的128位地址空间才撑得住。

我的习惯:不管规模大小,我都会在测试环境里把两种路由方式都跑一遍。用ibdiagnet工具看看路径分布是否均匀。不均匀的话,调整哈希算法参数。这一步省不得,否则上线后才发现负载不均,那就晚了。

好了,多路径路由的概念和LID/GRH的区别就讲到这里。记住一句话:LID是本地导航,GRH是全球导航。选哪个,看你的网络有多大。


专注资料整理