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 中完成。
2.2 子网:SM 的管理边界
一个子网(Subnet)由一组 IB 节点、交换机及连接它们的链路组成,并由一个主 SM 实例统一管理。子网是 IB 网络中最重要的管理域边界。SM 负责发现子网拓扑、分配 LID(Local Identifier,本地标识符)、计算路由并下发转发表。子网内所有节点必须使用相同的子网前缀(Subnet Prefix),该前缀与端口 GUID 组合后形成 64 位的 GID(Global Identifier)。
子网之间通过路由器(Router)互联,而不是通过交换机。路由器负责在不同子网之间转发流量,并处理 GID 到 LID 的映射。这一点与以太网有本质区别:IB 交换机只能在同一个子网内转发,跨子网必须经过路由器。
上图展示了一个包含两个子网的 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,则允许通信;否则,数据包会被丢弃。这种机制使得同一个物理子网内可以运行多个逻辑上完全隔离的“虚拟网络”,例如将存储流量和管理流量分开,或者将不同租户的计算集群隔离。
2.5 案例:一个典型的两层 IB 集群拓扑
假设你正在搭建一个包含 32 台计算节点和 4 台存储节点的 IB 集群,使用 8 台 36 端口交换机,采用两层 fat-tree 拓扑。SM 运行在其中一台管理服务器上。SM 启动后,会执行以下操作:
- 发现(Discovery):SM 通过子网管理接口(SMI)发送管理数据包,扫描所有交换机端口,逐步发现整个拓扑结构。它会记录每个节点的 GUID、端口 GUID、链路速率和 MTU。
- 分配 LID:SM 为每个端口分配唯一的 LID。通常,SM 自身使用 LID 1,交换机端口使用较小的 LID 范围,端节点使用较大的 LID。
- 计算路由:SM 根据拓扑和链路状态,使用最短路径算法(如 Dijkstra)计算从每个端口到其他所有端口的路径,并生成交换机的 LFT。
- 下发配置:SM 将 LFT、P_Key 表、MTU 等参数写入每个交换机的寄存器。
- 激活端口:所有配置完成后,SM 将端口状态从“初始化”切换为“激活”,此时数据流量才能开始转发。
如果某条链路发生故障,SM 会通过 trap 通知或周期性扫描发现拓扑变化,然后重新计算路由并更新受影响的交换机 LFT。这个过程称为重新配置(Reconfiguration),在大型网络中可能需要数百毫秒甚至数秒。
2.6 常见误区与复盘
实际上,IB 交换机在未配置前不会转发任何数据流量。如果 SM 未运行或不可达,交换机端口会停留在“初始化”状态,链路无法激活。这也是为什么在 IB 环境中,SM 的高可用性至关重要。
LID 是子网内的局部路由地址,由 SM 动态分配,可能随网络重启而改变。GUID 是端口的物理标识,出厂时烧录,全球唯一。在排查问题时,应使用 GUID 来唯一识别端口,而 LID 只用于当前运行状态下的路由查询。
当两个节点 ping 不通时,首先应检查它们是否属于同一个分区。很多初学者花费大量时间检查物理链路和 IP 配置,却忽略了 P_Key 不一致导致的数据包静默丢弃。使用
ibqueryerrors 或 ibswitches 工具可以快速查看端口的分区成员关系。
复盘一个真实案例:某数据中心管理员在扩容时新增了一台存储设备,但发现所有计算节点都无法访问该存储。物理链路正常,SM 日志无报错。最终排查发现,新存储的端口没有被加入任何分区,而 SM 默认不会自动将新端口加入现有分区。管理员使用 partprobe 工具将存储端口加入正确的 P_Key 后,通信立即恢复。这个案例说明,在 IB 网络中,物理连通只是前提,逻辑配置(分区、LID、路由)才是决定通信是否成功的最终因素。