二、多路径路由概念:为什么需要多路径?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
多路径路由的核心逻辑
我画了一张图,帮你理解多路径路由的整体逻辑:
这张图展示了多路径的核心逻辑:源节点到目的节点之间,存在多条物理路径。每条路径可以对应不同的LID(LMC实现)或不同的GID流标签(GRH实现)。路径选择由哈希算法决定,确保同一流的数据走同一条路径,避免乱序。
实际项目中的选择建议
我根据多年经验,给你几个实用建议:
- 小规模集群(<100节点):只用LID路由+LMC多路径就够了。配置简单,性能也够用。
- 中规模集群(100-1000节点):建议LID路由为主,GRH路由为辅。跨子网通信用GRH,子网内用LID。
- 大规模集群(>1000节点):必须上GRH路由。LID空间不够用,GRH的128位地址空间才撑得住。
我的习惯:不管规模大小,我都会在测试环境里把两种路由方式都跑一遍。用ibdiagnet工具看看路径分布是否均匀。不均匀的话,调整哈希算法参数。这一步省不得,否则上线后才发现负载不均,那就晚了。
好了,多路径路由的概念和LID/GRH的区别就讲到这里。记住一句话:LID是本地导航,GRH是全球导航。选哪个,看你的网络有多大。