InfiniBand网络架构:节点、交换机、子网、分区、链路层与网络层概念

在进入子网管理器(Subnet Manager,SM)的实操之前,必须先建立对 InfiniBand 网络架构的整体认知。IB 网络不是简单的“服务器连交换机”,而是一个具有明确分层、独立寻址机制和强管控模型的互联体系。只有理解了节点、交换机、子网、分区以及链路层与网络层的分工,才能明白 SM 究竟在管理什么、为什么需要它,以及它如何影响整张网络的转发行为。

2.1 核心对象:节点、端口与交换机

InfiniBand 中最基本的实体是节点(Node)。每个节点可以是一台主机(Host)、一台存储控制器,或一台专用交换机。节点通过端口(Port)接入 IB 网络。每个端口拥有一个 64 位的全局唯一标识符(GUID),而节点本身也有一个节点 GUID。端口是 SM 管理的最小物理单元,所有链路状态、速率、MTU 等属性都挂在端口上。

交换机在 IB 中扮演转发角色,但它不是“即插即用”的普通以太网交换机。IB 交换机内部没有自学习 MAC 地址表的能力,它的转发转发表(Forwarding Database)完全由 SM 计算并下发。换句话说,交换机本身是“哑”设备,所有路径决策都集中在 SM 中完成。

关键区分:在 IB 中,交换机端口分为面向端节点的“外部端口”和连接交换机内部管理实体的“管理端口”。SM 在扫描网络时,会通过管理端口与交换机通信,获取其端口状态和链路信息。

2.2 子网:SM 的管理边界

一个子网(Subnet)由一组 IB 节点、交换机及连接它们的链路组成,并由一个主 SM 实例统一管理。子网是 IB 网络中最重要的管理域边界。SM 负责发现子网拓扑、分配 LID(Local Identifier,本地标识符)、计算路由并下发转发表。子网内所有节点必须使用相同的子网前缀(Subnet Prefix),该前缀与端口 GUID 组合后形成 64 位的 GID(Global Identifier)。

子网之间通过路由器(Router)互联,而不是通过交换机。路由器负责在不同子网之间转发流量,并处理 GID 到 LID 的映射。这一点与以太网有本质区别:IB 交换机只能在同一个子网内转发,跨子网必须经过路由器。

子网 A(Subnet Prefix A) 子网 B(Subnet Prefix B) 交换机 A 交换机 B 节点 A1 节点 A2 节点 A3 节点 B1 节点 B2 节点 B3 SM A(主) SM B(主) 路由器 跨子网转发 LID=1(SM 端口) LID=1(SM 端口) LID:子网内局部路由标识(16 位),由 SM 分配;GID:全局标识(64 位),由子网前缀 + GUID 构成。

上图展示了一个包含两个子网的 IB 网络。子网 A 和子网 B 各自拥有独立的 SM(通常一主一备),各自维护本子网的拓扑和路由。交换机 A 和交换机 B 分别只负责本子网内的帧转发。当节点 A1 需要与节点 B1 通信时,数据必须经过路由器,路由器根据 GID 中的子网前缀决定将包转发到哪个子网。

2.3 链路层与网络层:LID 路由与 GID 寻址

InfiniBand 的分层模型与 TCP/IP 有相似之处,但机制完全不同。理解这两层是掌握 SM 配置的关键。

链路层(Link Layer)

链路层负责在同一个子网内的相邻节点之间传输数据。它使用 LID(Local Identifier)作为寻址依据。LID 是一个 16 位地址,由 SM 在子网初始化时动态分配。每个端口至少有一个 LID,也可以拥有多个(用于多路径)。链路层帧的转发完全基于 LID 查表,这张表就是 SM 计算并写入交换机端口的线性转发表(Linear Forwarding Table,LFT)。

链路层还负责流控、错误检测和链路状态管理。IB 采用基于信用的流控机制,接收方为发送方分配信用,发送方只有在获得信用后才能发送数据,从而避免丢包。

网络层(Network Layer)

网络层处理跨子网的通信。它使用 GID(Global Identifier)进行寻址。GID 是 128 位地址,由 64 位子网前缀和 64 位端口 GUID 拼接而成。路由器在网络层工作,它查看数据包中的目的 GID,提取子网前缀,决定将包转发到哪个子网。

值得注意的是,IB 的网络层并不像 IP 那样提供逐跳路由和分片功能。IB 网络层更接近于一种“定位服务”——它帮助路由器找到目标子网,而子网内部的精确路径仍然由链路层的 LID 路由完成。

层次 地址 长度 分配者 作用范围 转发设备
链路层 LID 16 位 SM 子网内 交换机
网络层 GID 128 位 子网前缀 + GUID 跨子网 路由器

2.4 分区(Partition):子网内的安全隔离域

分区是 IB 网络中一种重要的虚拟隔离机制。一个分区由一组端口组成,这些端口可以分布在子网内的任意节点上。分区通过 16 位的 分区键(Partition Key,P_Key)标识。每个端口在加入分区时,会被分配一个 P_Key 表,表中记录了该端口所属的所有分区。

分区的核心作用是控制通信权限。当两个端口尝试通信时,交换机会检查它们是否拥有共同的 P_Key。如果双方都包含某个相同的 P_Key,则允许通信;否则,数据包会被丢弃。这种机制使得同一个物理子网内可以运行多个逻辑上完全隔离的“虚拟网络”,例如将存储流量和管理流量分开,或者将不同租户的计算集群隔离。

实操提示:在配置 SM 时,分区是默认启用的。即使你没有显式创建任何分区,SM 也会创建一个默认分区(P_Key = 0x7FFF),并将所有端口加入其中。如果后续创建了新的分区,必须显式将端口加入,否则这些端口之间将无法通信。

2.5 案例:一个典型的两层 IB 集群拓扑

假设你正在搭建一个包含 32 台计算节点和 4 台存储节点的 IB 集群,使用 8 台 36 端口交换机,采用两层 fat-tree 拓扑。SM 运行在其中一台管理服务器上。SM 启动后,会执行以下操作:

  1. 发现(Discovery):SM 通过子网管理接口(SMI)发送管理数据包,扫描所有交换机端口,逐步发现整个拓扑结构。它会记录每个节点的 GUID、端口 GUID、链路速率和 MTU。
  2. 分配 LID:SM 为每个端口分配唯一的 LID。通常,SM 自身使用 LID 1,交换机端口使用较小的 LID 范围,端节点使用较大的 LID。
  3. 计算路由:SM 根据拓扑和链路状态,使用最短路径算法(如 Dijkstra)计算从每个端口到其他所有端口的路径,并生成交换机的 LFT。
  4. 下发配置:SM 将 LFT、P_Key 表、MTU 等参数写入每个交换机的寄存器。
  5. 激活端口:所有配置完成后,SM 将端口状态从“初始化”切换为“激活”,此时数据流量才能开始转发。

如果某条链路发生故障,SM 会通过 trap 通知或周期性扫描发现拓扑变化,然后重新计算路由并更新受影响的交换机 LFT。这个过程称为重新配置(Reconfiguration),在大型网络中可能需要数百毫秒甚至数秒。

2.6 常见误区与复盘

误区一:认为 IB 交换机像以太网交换机一样即插即用。
实际上,IB 交换机在未配置前不会转发任何数据流量。如果 SM 未运行或不可达,交换机端口会停留在“初始化”状态,链路无法激活。这也是为什么在 IB 环境中,SM 的高可用性至关重要。
误区二:混淆 LID 和 GUID 的作用。
LID 是子网内的局部路由地址,由 SM 动态分配,可能随网络重启而改变。GUID 是端口的物理标识,出厂时烧录,全球唯一。在排查问题时,应使用 GUID 来唯一识别端口,而 LID 只用于当前运行状态下的路由查询。
误区三:忽略分区对排障的影响。
当两个节点 ping 不通时,首先应检查它们是否属于同一个分区。很多初学者花费大量时间检查物理链路和 IP 配置,却忽略了 P_Key 不一致导致的数据包静默丢弃。使用 ibqueryerrors 或 ibswitches 工具可以快速查看端口的分区成员关系。

复盘一个真实案例:某数据中心管理员在扩容时新增了一台存储设备,但发现所有计算节点都无法访问该存储。物理链路正常,SM 日志无报错。最终排查发现,新存储的端口没有被加入任何分区,而 SM 默认不会自动将新端口加入现有分区。管理员使用 partprobe 工具将存储端口加入正确的 P_Key 后,通信立即恢复。这个案例说明,在 IB 网络中,物理连通只是前提,逻辑配置(分区、LID、路由)才是决定通信是否成功的最终因素。