3. 子网管理器(SM)

核心原理:SM是IB子网的“控制大脑”

InfiniBand(IB)网络与以太网最大的不同在于:IB网络不是“即插即用”的分布式自协商网络,而是一个由子网管理器(Subnet Manager,SM)集中管控的有状态网络。SM负责发现子网拓扑、为每个端口分配唯一的LID(Local Identifier,本地标识符)、配置路由表、监控链路状态,并在拓扑变化时重新收敛。可以这样理解:IB子网中的交换机只是“转发管道”,而SM才是决定数据如何流动的“总调度员”。

SM通常运行在一个专用节点上(如交换机内置的管理处理器或独立服务器),其核心职责可归纳为以下四点:

  • 拓扑发现:通过定向探针(Directed Route Probe)逐跳扫描子网中的全部交换机、链路和端节点,构建完整的子网拓扑图。
  • LID分配:为每个端口的每个路径(Path)分配唯一的16位LID,确保子网内每个可寻址端口都有明确标识。
  • 路由计算:基于拓扑和LID生成线性转发表(LFT,Linear Forwarding Table),下发到每台交换机,决定帧从哪个端口转发。
  • 状态监控与重配置:持续监听链路状态变化(如链路断开、新节点加入),在拓扑变更时触发重新发现和重配置。
关键概念区分:SM与Subnet Administrator(SA)不同。SM负责“管理”子网(发现、配置、监控),而SA负责“响应”终端请求(如路径查询、服务解析)。SM是主动的管控者,SA是被动的查询服务提供者。
子网管理器 (SM) 运行于专用节点或交换机内 拓扑发现 LID分配 路由计算 交换机 SW1 LFT: LID 1→Port1 LID 2→Port2 交换机 SW2 LFT: LID 3→Port1 LID 4→Port2 交换机 SW3 LFT: LID 5→Port1 LID 6→Port2 链路1 链路2 HCA 节点 A LID = 1 HCA 节点 B LID = 3 HCA 节点 C LID = 5 SM管理通道 (SMP) 交换机间数据链路 端节点接入链路 LID分配示例:每个端口一个LID

发现机制:从零开始的子网拓扑构建

SM启动后,对子网一无所知。它必须通过一套标准化的子网管理包(SMP,Subnet Management Packet)逐步“摸清”网络。这一过程称为子网发现(Subnet Discovery),其核心是定向路由(Directed Routing)——SM沿着指定路径逐跳发送SMP,而不是依赖LID寻址(因为此时LID尚未分配)。

发现过程遵循以下步骤:

  1. 扫描本地端口:SM首先获取自身所在端口的节点信息,确认自己连接到的第一个交换机。
  2. 获取节点描述符:SM向已知端口发送SubnGet(NodeInfo)请求,获取节点类型(交换机/CA/路由器)、端口数、LID范围等基础信息。
  3. 枚举端口:对每个交换机,SM发送SubnGet(PortInfo)查询每个端口的链路状态(Active/Init/Disabled)和邻居信息。
  4. 递归遍历:如果某个端口处于Active状态且连接了未知节点,SM将新节点加入待扫描队列,继续向下探测,直到所有可达节点都被访问。
  5. 构建拓扑数据库:SM将所有节点、端口、链路信息汇总,形成完整的子网拓扑图,为后续LID分配和路由计算做准备。
实际观察技巧:在运行ibnetdiscover命令时,可以看到SM正是按照上述逻辑逐跳打印出每个交换机的端口连接关系。输出中Switch和Channel Adapter的层级缩进,就反映了SM遍历拓扑的顺序。

LID分配:16位地址的唯一性管理

LID是IB子网内的二层地址,长度为16位,取值范围为0x0001~0xBFFF(0x0000保留,0xC000~0xFFFF保留给多播和特殊用途)。SM负责为子网中每个端口分配一个唯一的LID,而不是为节点分配——一个多端口CA(如双端口HCA)的每个端口都会获得独立的LID。

LID分配遵循以下原则:

  • 唯一性:同一子网内,任何两个端口的LID不能重复,否则会导致路由混乱。
  • 连续性偏好:SM通常按发现顺序或端口编号顺序分配LID,使地址空间紧凑,便于路由表压缩。
  • 可配置性:管理员可以通过SM的配置文件(如OpenSM的partitions.conf和osm.conf)为特定节点指定固定LID,实现确定性寻址。
  • LMC支持:如果启用了LMC(LID Mask Control),一个端口可拥有多个LID(2^LMC个),用于多路径负载均衡,但默认LMC=0,即每端口一个LID。
LID范围 用途 说明
0x0000 保留 无效LID,不可用于寻址
0x0001 - 0xBFFF 单播LID SM分配给端口的唯一地址
0xC000 - 0xFFFF 多播LID 用于组播通信,由SM统一管理

LID分配完成后,SM会通过SubnSet(PortInfo)将LID写入每个端口的寄存器。随后,SM根据拓扑和LID计算每台交换机的线性转发表(LFT),并通过SubnSet(LFT)下发。至此,子网进入可通信状态。

案例与场景:双交换机子网的SM配置实战

假设一个最小规模的IB子网:1台SM(运行在管理服务器上)、2台交换机(SW1、SW2)、2台计算节点(Node1、Node2)。SM通过管理端口连接到SW1的M端口(Management Port)。

使用OpenSM作为SM实现,其启动和LID分配过程如下:

# 启动OpenSM,指定SM优先级为15(最高)
$ opensm -p 15 -g 0x0023c9aabbccdd

# 查看SM日志中的拓扑发现过程
$ tail -f /var/log/opensm.log
[15:32:01] SM: Subnet discovery started
[15:32:01] SM: Found switch SW1 (LID range: 0x0001-0x0002)
[15:32:02] SM: Port 1 of SW1 connected to Node1
[15:32:02] SM: Port 2 of SW1 connected to SW2
[15:32:03] SM: Port 1 of SW2 connected to Node2
[15:32:03] SM: Subnet discovery completed (4 nodes, 3 links)

# 查看LID分配结果
$ ibaddr -D 1
Port 1: LID 0x0001, Node1 (HCA-1)

$ ibaddr -D 2
Port 2: LID 0x0002, SW1 (Switch)

$ ibaddr -D 3
Port 3: LID 0x0003, Node2 (HCA-1)

在这个场景中,SM为Node1分配LID 1,为SW1分配LID 2,为Node2分配LID 3。SW1的LFT中会记录:目标LID 1→本地端口1,目标LID 3→本地端口2(通往SW2)。当Node1向Node2发送数据时,帧头携带目的LID=3,SW1查LFT后从端口2转发。

误区与复盘:SM配置中的常见陷阱

误区1:认为SM是单点故障,无法冗余。
实际上,IB规范允许多个SM共存于同一子网,通过Master/Slave选举机制确定唯一的主SM(Master SM)。当主SM故障时,从SM(Slave SM)会接管并重新执行发现和配置。但需注意:同一时刻只有一个Master SM,否则会导致LID分配冲突。
误区2:LID分配是随机的,不需要规划。
虽然SM默认自动分配LID,但在生产环境中,建议为关键节点(如存储网关、管理节点)配置固定LID。否则,每次SM重启或拓扑变更后,LID可能变化,导致上层应用(如基于LID的路径策略)失效。

复盘要点:在排查IB网络无法通信的问题时,应首先确认SM是否正常运行、LID是否已正确分配。使用ibstatus查看本端口的LID和状态,使用ibswitches查看交换机是否已被SM纳管。如果LID显示为0x0000,说明SM尚未完成配置,需要检查SM日志中的发现过程是否中断。

另一个常见误区是忽略LMC对LID数量的影响。如果启用了LMC=2,每个端口将获得4个LID(2^2),这虽然支持了多路径,但也消耗了更多LID地址空间。在大型子网中(超过4000个端口),需要合理规划LMC值,避免LID耗尽。