InfiniBand 专题【左扬精讲】—— InfiniBand 网络层:GID 与子网路由

InfiniBand 专题【左扬精讲】—— InfiniBand 网络层:GID 与子网路由

InfiniBand(简称 IB)网络层是 IB 架构中承上启下的关键层次,它使得跨子网通信成为可能。与传统以太网依赖 IP 地址进行三层路由类似,IB 网络层使用 GID(Global Identifier) 作为全局唯一标识,配合 GRH(Global Routing Header) 实现跨子网的数据包转发。

本篇深入探讨 IB 路由解决方案的核心优势、网络层的基本职责与功能,以及如何使用 OFED 工具定位 GID 地址。

理解网络层是掌握 IB 超大规模集群通信的关键。

InfiniBand 架构分层(自下而上)
      +------------------+
      |      物理层       |  线缆、光模块、电信号(SerDes)
      +------------------+
      |      链路层       |  数据包布局、LID 寻址、QoS、流量控制
      +------------------+
      |      网络层       |  本章核心:GRH 头部、GID 全局路由、子网间通信
      +------------------+
      |      传输层       |  端到端可靠性、分段与重组(PSN)
      +------------------+
      |    上层协议层     |  RDMA 操作语义(Send/Recv/RDMA Read/Write)

InfiniBand 网络层 GID GRH 子网路由 IB 路由器 OFED

学习重点提示

本篇深入探讨 InfiniBand 网络层的核心知识。以下是每个主题你需要掌握的深度说明:

IB 路由解决方案(What & How & Why):

    • What:IB 路由器用于连接不同的 IB 子网,每个子网最多可包含 48,000 个托管节点;子网之间完全隔离,单独管理
    • How:能说出 IB 路由器的四大核心优势(扩展性、子网隔离、子网管理、异构拓扑连接);理解路由器如何在不同拓扑(Fat Tree、Torus、Dragonfly)之间建立连接
    • Why:理解 "为什么需要 IB 路由器" ——当网络规模扩大时,单个子网无法满足需求;通过路由器连接多个子网,可以实现 故障隔离 和 弹性扩展

GID 全局标识符(What & How & Why):

    • What:GID 是一个 128 位的全局唯一标识符,由 64 位子网前缀(Subnet Prefix)+ 64 位端口 GUID 组成,标识端端口或多播组
    • How:能画出 GID 的结构图(FE80::[64-bit GUID] 表示默认 GID);掌握子网管理器分配 GID 的机制;理解默认 GID 的 fe80 前缀与 IPv6 链路本地地址的相似性
    • Why:理解 "为什么需要 GID 而不是只用 LID" ——LID 只能在子网内唯一,子网间通信需要全局唯一标识;GID 是 IB 实现全局路由的基础

GRH 全局路由头(What & How & Why):

    • What:GRH 是 IB 网络层的三层头部,包含目的 GID 和源 GID,用于跨子网路由;本地子网通信可以省略 GRH
    • How:能说出 GRH 的位置(LRH 之后、可选的 BTH 之前);理解何时需要 GRH(同子网不需要,跨子网必须)
    • Why:理解 "为什么同子网不需要 GRH" ——同子网通信使用 LID(链路层),只需 LRH 头部;跨子网通信需要 GID 路由,必须携带 GRH

单播与多播操作(What & How & Why):

    • What:单播(Unicast)是从网络上一个节点到另一个节点的通信;多播(Multicast)是从一个节点到多个(但不是全部)节点的通信,通过一次传输到达所有订阅者
    • How:能区分单播和多播的 GID 范围;掌握多播组注册机制
    • Why:理解 "为什么需要多播" ——在 HPC 集群中,需要将数据同时发送给多个计算节点(如广播参数更新),多播避免了重复的点对点传输,提高了效率

OFED 命令行工具(What & How & Why):

    • What:ibdevices 查看所有 IB 设备,ibaddr 显示指定设备的 GID 和 LID 信息
    • How:能熟练使用这两个命令;理解输出中 LID 以十六进制显示
    • Why:工具是理论的落地——理解 GID 结构后,用 ibaddr 验证设备 GID 是最直接的验证方式

阅读前提 & 建议:

    • 前置知识:建议了解链路层基础(LID 寻址、子网管理),本篇会在链路层基础上扩展网络层概念
    • 不涉及的内容:路由算法具体实现(最短路径迪杰斯特拉算法)、IB 路由器硬件架构、拥塞控制机制
    • 深度预期:学完本篇后,你能理解 GID 的 128 位结构,能使用 ibaddr 查看设备 GID,能回答"IB 为什么要引入网络层"
    • 后续延伸:传输层语义(RDMA 操作)→ 拥塞控制(PFC/ECN)→ IB 在 HPC/AI 集群中的应用

IB 路由解决方案概述

What — IB 路由解决方案是什么?

IB 路由解决方案是指使用 IB 路由器连接不同的 IB 子网,使得大规模 IB 网络能够跨越多个子网进行通信。随着 IB 网络规模的扩大,单个子网的节点数量和拓扑灵活性逐渐受到限制,这时就需要引入路由器来实现子网间的互联。

Why — 为什么需要 IB 路由器?

问题一:网络规模与拓扑复杂度

单个 IB 子网最多支持 48,000 个托管节点。这个数字看似很大,但实际部署时会受到多重约束:

    • 交换机端口数量:一个 36 端口的 Quantum-2 交换机最多连接 36 个节点。要达到 48,000 节点,需要约 1,400 台交换机互联。交换机的选路算法、路径深度、端口密度都会影响网络的实际性能
    • 子网管理器负担:子网管理器(SM)需要维护所有节点的路径信息(LID → 端口映射)。节点越多,路径数据库越大,SM 的计算和内存开销呈线性增长,SM 故障影响范围也越大
    • 故障域大小:单个子网的故障会波及相关所有节点。一台核心交换机故障可能导致数千节点同时中断,RTO(恢复时间目标)和 RPO(恢复点目标)难以保障
    • 管理粒度:48,000 节点若由单一 SM 管理,任何配置变更都需要全局生效。实际运维中,按业务、按机房、按租户划分子网是刚性需求

实际阈值参考:在生产环境中,当节点数超过 2,000~5,000 时(取决于业务 SLA 要求),通常就会规划多个子网。例如 NVIDIA 的 DGX SuperPOD 超过 1,000 节点就采用了多子网架构。

问题二:故障隔离需求

大型集群需要故障隔离能力。当一个子网发生故障时,不应影响其他子网的正常运行。路由器实现了子网间的隔离。

问题三:拓扑灵活性

不同子网可以采用不同的网络拓扑(Fat Tree、Torus、Dragonfly 等),路由器使得这些异构拓扑可以互联互通,无需重新设计原有拓扑。

没有 IB 路由器会发生什么?

    • 网络规模被限制在 48,000 节点以内,无法构建超大规模集群
    • 单点故障可能导致整个网络瘫痪
    • 无法灵活组合不同拓扑的网络
IB 路由器的四大核心优势

IB 路由解决方案提供以下四大核心优势:

    • 扩展性(Scaling):通过添加更多子网和路由器,可以将网络扩展到任意规模,突破单个子网的节点限制
    • 子网隔离(Subnet Isolation):每个子网完全隔离,一个子网的问题不会传播到其他子网,大大提高了可靠性
    • 子网管理(Subnet Management):每个子网可以独立管理和配置,变更一个子网不会影响其他子网
    • 异构拓扑连接(Topology Connectivity):不同子网可以采用不同的物理拓扑(Fat Tree、Torus、Dragonfly),路由器负责它们之间的路由

本节小结

    • IB 路由器连接不同的 IB 子网,每个子网最多包含 48,000 个托管节点,但受交换机端口数、SM 负担、故障域、管理粒度等实际约束,通常 2,000~5,000 节点以上就会规划多子网
    • 子网之间完全隔离,单独管理,故障互不影响
    • IB 路由器支持连接不同拓扑的网络,包括 Fat Tree、Torus、Dragonfly 等

网络层核心职责

What — 网络层是什么?

IB 网络层是 IB 架构中位于链路层之上、传输层之下的层次。它负责实现跨子网的路由功能,使 IB 路由器能够将数据包从一个子网转发到另一个子网。

Why — 为什么需要网络层?

链路层的局限

链路层使用 LID(Local Identifier)进行子网内的路由。LID 是子网管理器分配的本地标识,只能在单个子网内唯一,不具备跨子网寻址能力。

网络层的作用

网络层引入了 GID(Global Identifier)和 GRH(Global Routing Header),使得 IB 网络能够实现全局唯一的寻址和跨子网路由。

没有网络层会发生什么?

    • 只能构建单一子网的网络,规模受限于 48,000 节点
    • 无法实现跨子网的通信,超大规模集群无法构建
    • 不同拓扑的网络无法互联
IB 数据包头部结构

IB 数据包的头部结构如下:

IB 数据包封装顺序(从外到内)
      +------+
      | VCRC |  可变 CRC,覆盖整个数据包(链路层校验)
      +------+
      | ICRC |  不变 CRC,覆盖数据包内容(链路层端到端校验)
      +------+
      | Payload |  传输层数据载荷(可变大小)
      +------+
      | BTH   |  基传输头(Transport Header)
      +------+          ↑
      | GRH   |  全局路由头(仅跨子网通信时需要)可选
      +------+          ↑
      | LRH   |  本地路由头(链路层始终需要)
      +------+

关键说明:

    • LRH(Local Routing Header):链路层头部,包含源/目的 LID,用于子网内路由,始终存在
    • GRH(Global Routing Header):网络层头部,包含源/目的 GID,仅跨子网通信时需要
    • BTH(Base Transport Header):传输层头部,定义操作类型和事务处理

本节小结

    • 网络层使用 GRH(Global Routing Header) 实现跨子网路由
    • GRH 包含 GID(Global Identifier) 作为全局唯一标识
    • 同子网通信只需 LRH,跨子网通信需要 LRH + GRH + BTH

GID 全局标识符详解

What — GID 是什么?

GID(Global Identifier)是 IB 网络层的 128 位全局唯一标识符,用于标识端端口(End Port)或多播组。GID 在整个 IB 网络中是全局唯一的,跨多个子网仍然保持唯一性。

Why — 为什么需要 GID?

GID 的结构设计灵感

GID 的 128 位结构设计与 IPv6 地址类似,由前缀和接口标识符组成。这不是巧合,而是 IB 架构设计时借鉴了 IPv6 的成熟理念。

没有 GID 会发生什么?

    • 无法实现跨子网的全局路由,只能使用 LID 进行子网内通信
    • 多播组无法跨子网存在
    • 网络规模受限于单个子网的 48,000 节点
GID 的 128 位结构

GID 由两部分组成,总共 128 位:

GID 128 位结构
      +---------------------------+---------------------------+
      |    Subnet Prefix(子网前缀) |      Port GUID(端口全局唯一标识符)      |
      |        64 位               |           64 位             |
      +---------------------------+---------------------------+
  
      示例:默认 GID
      fe80:0000:0000:0000:0011:0d00:0030:1234
      |----子网前缀----|  |-------端口 GUID--------|

关键说明:

  • 子网前缀(64 位):由子网管理器分配,同一子网内的所有端口共享相同的子网前缀
  • 端口 GUID(64 位):每个 HCA 端口的唯一标识符,由厂商在生产时烧录
  • 默认 GID:使用 fe80::[64-bit GUID] 格式,fe80 是 IPv6 链路本地地址的等价前缀

注意:GID 与 IPv6 的相似性

GID 的结构与 IPv6 地址非常相似:

    • 都是 128 位
    • 都由前缀 + 接口标识符组成
    • 默认 GID 的 fe80 前缀与 IPv6 链路本地地址(fe80::/10)完全一致

这种设计使得 IB 网络可以更容易地与基于 IPv6 的网络进行互操作。

本节小结

    • GID 是 128 位全局唯一标识符
    • 64 位子网前缀 + 64 位端口 GUID 组成
    • GID 由子网管理器分配,每个 HCA 端口有默认 GID(fe80 前缀)

单播与多播操作

What — 单播和多播是什么?

IB 网络层支持两种基本的通信模式:

    • 单播(Unicast):从网络上的一个节点到另一个节点的点对点通信
    • 多播(Multicast):从一个节点到多个(但不是全部)节点的通信,通过一次传输到达所有订阅者

Why — 为什么需要多播?

HPC 集群是什么?

HPC(High Performance Computing,高性能计算)集群是由数百乃至数万台服务器通过高速网络互联组成的计算集群。它的核心目标是解决单台计算机无法完成的超大规模计算任务。典型应用场景包括:气候模拟(天气预报、气候变化预测)、基因测序(蛋白质折叠、药物研发)、流体力学仿真(飞机设计、汽车风洞测试)、核爆模拟、国防科研等。

在 HPC 集群中,计算节点不是独立工作,而是需要协同完成一个任务。这就好比一个大型项目需要多个工人分工合作,每个工人都要随时知道其他工人的进度和数据。以气候模拟为例,计算节点 A 负责处理海洋数据,计算节点 B 负责处理大气数据,两者需要频繁交换中间结果,才能最终拼出完整的气候模型。这个过程叫做集体通信(Collective Communication)

HPC 集群中的多播需求

在高性能计算集群中,经常需要将数据同时发送给多个计算节点。例如:

    • 广播集体通信操作的参数更新
    • 分布式训练中的梯度同步
    • 集群管理命令的分发

如果没有多播支持,每次都需要进行多次点对点传输,效率极低。

没有多播会发生什么?

    • 广播操作需要 N 次点对点传输,延迟和带宽消耗呈线性增长
    • 大规模集群的集体通信性能严重下降
    • 无法高效支持分布式训练等需要多节点协同的应用
单播与多播的 GID 区别

单播和多播使用不同范围的 GID:

GID 范围划分
      +------------------------------------------+
      | 多播 GID 范围                              |  FF12:0x:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
      +------------------------------------------+
      | 保留/特殊用途                              |  FF00:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
      +------------------------------------------+
      | 单播 GID 范围(默认 GID 使用 fe80 前缀)   |  fe80::xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
      +------------------------------------------+
      | 其他单播 GID(由子网管理器分配)            |  其他前缀...

关键说明:

    • 多播 GID:以 FF12 开头的 GID,用于标识多播组
    • 单播 GID:用于标识单个端端口,全球唯一
    • 多播路由使用一次传输将数据发送给所有订阅者,避免了重复的点对点通信

本节小结

    • 单播:点对点通信,用于两个节点间的数据传输
    • 多播:一对多通信,通过一次传输到达所有订阅者
    • 多播 GID 以 FF12 开头,标识多播组

OFED 命令行工具

What — OFED 命令行工具有哪些?

OFED(Mellanox/NVIDIA 提供的 IB 驱动和工具栈)提供了多个用于查看 IB 设备信息的命令行工具。本节介绍与网络层相关的两个核心命令:ibdevicesibaddr

Why — 为什么需要这些命令?

理解 GID 结构后,需要通过工具验证设备是否正确配置了 GID。这些命令是理解 IB 网络层配置的实际入口。

没有这些命令会发生什么?

    • 无法验证设备是否正确注册到子网
    • 无法确认设备的 GID 配置是否正确
    • 故障排查时缺乏直接的工具支持
ibdevices 命令

ibdevices 命令用于显示本地服务器上安装的所有 IB 设备:

# 查看所有 IB 设备
  $ ibdevices
      ibdev0:  mlx5_0
      ibdev1:  mlx5_1
      ibdev2:  mlx5_2
      ibdev3:  mlx5_3

输出显示本地服务器包含 4 个 IB 设备,均为双端口 HCA(每个 mlx5_X 代表一个物理端口)。

ibaddr 命令

ibaddr 命令用于显示指定 IB 设备的 GID 和 LID 信息:

# 查看 mlx5_1 设备的 GID 和 LID
  $ ibaddr mlx5_1
  GID:  fe80:0000:0000:0000:0011:0d00:0030:1234
  LID:  0x0001
  Port  1:
  GID:  fe80:0000:0000:0000:0011:0d00:0030:1234
  LID:  0x0001
  Port  2:
  GID:  fe80:0000:0000:0000:0011:0d00:0030:5678
  LID:  0x0002

关键说明:

    • GID 显示为 128 位的十六进制表示(冒号分隔的 8 个 16 位字段)
    • LID 以十六进制显示(如 0x0001 = 十进制 1)
    • 默认 GID 使用 fe80 前缀,表示这是链路本地地址
    • 每个物理端口有独立的 GID 和 LID

注意:LID 与 GID 的关系

LID(Local Identifier)用于链路层(子网内)路由,GID(Global Identifier)用于网络层(跨子网)路由。两者可以共存:

    • 同子网通信使用 LID,效率更高
    • 跨子网通信必须使用 GID
    • 每个端口同时拥有 LID 和 GID

本节小结

    • ibdevices:列出所有 IB 设备
    • ibaddr:显示指定设备的 GID 和 LID
    • 默认 GID 使用 fe80 前缀,后跟 64 位端口 GUID

FAQ

20 个核心问题解答

Q1. InfiniBand 路由解决方案的主要优势是什么?

扩展性、隔离性、管理独立性和异构拓扑连接。IB 路由器允许连接多个子网,每个子网最多 48,000 节点;子网间完全隔离,故障不传播;每个子网可独立管理;不同拓扑(Fat Tree、Torus、Dragonfly)可以互联,无需重新设计。

Q2. GID 是多少位的标识符?

128 位。GID(Global Identifier)是 InfiniBand 网络层的全局唯一标识符,与 IPv6 地址长度相同,由 64 位子网前缀和 64 位端口 GUID 组成。

Q3. GID 由哪两部分组成?

64 位子网前缀 + 64 位端口 GUID。子网前缀由子网管理器分配,同一子网内所有端口共享;端口 GUID 由 HCA 厂商在生产时烧录,全球唯一。

Q4. 默认 GID 使用什么前缀?

fe80::/64 前缀。默认 GID 使用 fe80:0000:0000:0000:[64-bit GUID] 格式,这与 IPv6 的链路本地地址前缀完全一致。

Q5. GRH 是什么?

Global Routing Header,全局路由头。GRH 是 IB 网络层的头部,包含源 GID 和目的 GID,用于跨子网路由。同子网通信可以省略 GRH,跨子网通信必须包含 GRH。

Q6. LRH 和 GRH 的区别是什么?

LRH 用于子网内路由,GRH 用于跨子网路由。LRH(Local Routing Header)包含 LID,用于链路层;GRH(Global Routing Header)包含 GID,用于网络层。

Q7. 单播和多播的区别是什么?

单播是点对点通信,多播是一对多通信。单播从网络上一个节点到另一个节点;多播从网络上一个节点到多个节点(不是全部),一次传输到达所有订阅者。

Q8. 多播 GID 使用什么前缀?

FF12::/64 前缀。多播 GID 以 FF12 开头,用于标识多播组。单播 GID 不使用 FF 开头的前缀。

Q9. 每个 IB 子网最多支持多少个托管节点?

48,000 个托管节点。这是单个 IB 子网的节点容量上限。超过这个数量需要引入多个子网,通过 IB 路由器互联。

Q10. ibdevices 命令的作用是什么?

列出本地服务器上安装的所有 IB 设备。输出显示每个 ibdevN 对应的设备名称(如 mlx5_0、mlx5_1)。

Q11. ibaddr 命令的作用是什么?

显示指定 IB 设备的 GID 和 LID 信息。ibaddr 可以查看设备每个物理端口的 GID(用于跨子网路由)和 LID(用于子网内路由)。

Q12. 为什么 GID 与 IPv6 地址长度相同?

IB 架构设计时借鉴了 IPv6 的成熟理念。GID 的 128 位结构与 IPv6 地址类似,由前缀和接口标识符组成,这使得 IB 网络可以更容易地与基于 IPv6 的网络进行互操作。

Q13. IB 路由器支持哪些网络拓扑?

Fat Tree、Torus、Dragonfly 等多种拓扑。IB 路由解决方案支持不同子网采用不同的物理拓扑,路由器负责它们之间的路由计算和数据转发。

Q14. 同子网通信需要 GRH 吗?

不需要。同子网通信使用 LID(链路层),只需 LRH 头部。跨子网通信需要 GID 路由,必须携带 GRH 头部。

Q15. 子网隔离有什么好处?

提高可靠性和可用性。一个子网发生故障不会传播到其他子网;变更一个子网不会影响其他子网的运行;便于独立管理和维护。

Q16. HCA 端口的 GUID 由谁分配?

由 HCA 厂商在生产时烧录。每个 HCA 端口的 GUID 是硬件级别的唯一标识符,与网络配置无关,确保全球唯一性。

Q17. 为什么需要多播路由?

提高集体通信效率。HPC 集群需要广播梯度更新、参数同步等,多播通过一次传输到达所有订阅者,避免了 N 次点对点传输的性能开销。

Q18. LID 以什么进制显示?

十六进制。ibaddr 等工具输出的 LID 以十六进制显示(如 0x0001 = 十进制 1)。

Q19. 网络层在 IB 架构中的位置是什么?

链路层之上、传输层之下。IB 架构自下而上为:物理层、链路层、网络层、传输层、上层协议层。网络层承上启下,连接链路层和传输层。

Q20. 理解网络层对掌握 IB 集群有何意义?

理解跨子网通信机制,为构建超大规模集群奠定基础。网络层使得 IB 能够构建包含数十万节点的超级计算机和 AI 训练集群,是现代 HPC/AI 基础设施的关键技术。

FAQ 总纲

IB 网络层的核心是 GID(128 位全局标识符)GRH(全局路由头),它们使得跨子网通信成为可能。IB 路由器连接多个子网,突破单子网 48,000 节点的限制,支持 Fat Tree、Torus、Dragonfly 等异构拓扑互联。

Roadmap

后续学习路线

完成本篇网络层的学习后,建议继续深入以下主题:

    • 传输层(Transport Layer):深入理解 RDMA 操作语义(Send/Recv/RDMA Read/Write)、端到端可靠性、分段与重组(PSN)
    • 拥塞控制:学习 PFC(Priority Flow Control)和 ECN(Explicit Congestion Notification)机制
    • IB 在 HPC/AI 集群中的应用:理解 InfiniBand 如何支撑大规模并行计算和分布式训练
    • 子网管理器(Subnet Manager):深入理解 SM 的初始化流程、LID 分配策略、路径记录

推荐学习顺序:物理层 → 链路层 → 网络层 → 传输层 → 上层协议层。


posted @ 2026-08-04 18:33  左扬  阅读(16)  评论(0)    收藏  举报