子网管理器(SM):作用、工作原理、主备SM与状态机
InfiniBand(IB)网络与以太网最大的区别之一,在于它不是一个“即插即用、自协商”的网络。IB 网络中的每一个链路、每一个端口、每一条转发路径,都必须经过显式的配置与计算后才能正常工作。承担这一核心控制职责的,就是子网管理器(Subnet Manager,SM)。可以这样理解:IB 子网中的交换机与 HCA(主机通道适配器)只是“执行者”,而 SM 才是真正的“决策者”。
SM 的核心作用:从“裸拓扑”到“可用网络”
SM 的本质任务是发现物理拓扑 → 分配关键资源 → 计算转发路径 → 下发转发表。没有 SM 的 IB 子网,所有端口停留在 Initializing 状态,数据面完全不可用。具体而言,SM 承担以下四大职责:
- 子网发现(Discovery):通过发送管理数据包(Subnet Management Packet,SMP),逐跳探测子网内的所有交换机、HCA、路由器及链路连接关系,构建完整的拓扑数据库。
- 地址分配:为每个端口分配唯一的 16 位本地标识符(LID),并配置交换机端口的 LMC(LID Mask Control)属性。LID 是 IB 网络内二层转发的寻址基础。
- 路径计算与路由:基于拓扑数据库,使用特定路由算法(如 LASH、DOR、Up/Down 等)计算从任意源端口到目标端口的路径,生成线性转发表(Linear Forwarding Table,LFT)。
- 网络监控与维护:持续监听网络状态变化(如链路断开、新设备加入),并实时更新转发表;同时维护端口计数器、错误状态等管理信息。
工作原理:SMP 请求-响应机制与状态机驱动
SM 与子网内其他节点(称为 Subnet Management Agent,SMA)之间的交互,完全基于 SMP(子网管理报文) 的请求-响应模型。SM 主动发起请求,SMA 被动响应。SMP 报文格式中最重要的字段包括:M_Key(管理密钥,用于权限认证)、Method(如 Get/Set/Report)、Attribute(如 NodeInfo、PortInfo、LFT)等。
每个 IB 端口的状态由端口状态机管理,这是理解 SM 工作原理的关键。端口状态机包含 4 个状态:
| 状态 | 含义 | 触发条件 |
|---|---|---|
Initializing | 端口正在等待 SM 配置 | 上电或链路重启后自动进入 |
Arming | 端口已收到 SM 的配置,正在等待激活 | SM 完成对该端口的配置下发 |
Active | 端口可正常收发数据 | SM 发送 SubnSet(PortInfo) 且配置生效 |
Sleep | 端口因错误或 SM 失联而降级 | 收到 Trap 或 SM 心跳超时 |
SM 的工作流程可以概括为以下循环:
- 发现阶段:SM 从自身端口出发,发送
SubnGet(NodeInfo)和SubnGet(PortInfo)报文,逐跳遍历所有交换机端口,识别邻居节点类型(交换机/HCA/路由器),直到覆盖整个子网。 - 配置阶段:SM 为每个端口分配 LID,设置交换机端口属性(如 MTU、速率、LMC),并下发
SubnSet(PortInfo)使端口进入Arming状态。 - 路由计算阶段:SM 根据拓扑数据库和路由策略,计算所有源-目的对的最优路径,生成每个交换机的 LFT。
- 激活阶段:SM 通过
SubnSet(LFT)将转发表写入交换机,最后发送SubnSet(PortInfo)将端口状态置为Active。此时数据面才真正可用。 - 监控阶段:SM 周期性发送
SubnGet(Notice)或监听 Trap 报文,感知链路状态变化,必要时重新执行上述流程。
ibnetdiscover 命令可以查看 SM 发现的拓扑;使用 ibstatus 可以查看端口状态。若端口长时间停留在 Initializing,通常意味着 SM 未运行或 M_Key 不匹配。
主备 SM 机制:高可用与抢占策略
单台 SM 存在单点故障风险。IB 规范允许在一个子网内运行多个 SM,但同一时刻只有一个是主 SM(Master SM),其余为备 SM(Standby SM)。主 SM 负责全部管理操作,备 SM 持续监听主 SM 的心跳(通过 SMP 通信),一旦发现主 SM 失效,备 SM 会通过选举机制接管。
SM 的优先级由 SM Priority 字段决定(0~15,数值越大优先级越高)。当多个 SM 同时启动时,优先级最高的 SM 会成为主 SM。如果优先级相同,则比较 GUID(全局唯一标识符),GUID 较小者优先。主 SM 会周期性地发送 SubnGet(NodeInfo) 来宣告自己的存在,备 SM 则通过接收这些报文来确认主 SM 的健康状态。
主备切换的典型场景如下:
- 主 SM 进程崩溃或服务器宕机:备 SM 在超时(通常为 3~5 个心跳周期)后,主动发起
SubnSet(PortInfo)将自身端口状态从Sleep转为Initializing,然后重新执行完整的发现和配置流程。 - 主 SM 网络分区:如果主 SM 与子网之间的链路中断,备 SM 会检测到心跳丢失,触发接管。此时可能出现“双主”风险,因此 IB 规范要求 SM 在接管前必须确认自己与子网的连通性。
- 主动抢占:当更高优先级的 SM 加入网络时,它会主动发送
SubnSet(SMInfo)请求接管,原主 SM 收到后自动降级为备 SM。
Initializing → Arming → Active 的状态转换,这意味着数据面会短暂中断。对于需要 99.999% 可用性的 HPC 集群,建议配置 SM 的 Graceful Shutdown 机制,并确保备 SM 的拓扑数据库与主 SM 同步(通过定期备份或实时同步),以缩短切换时间。
SM 状态机:从 Standby 到 Master 的完整转换
SM 自身也是一个状态机,其状态转换逻辑决定了整个子网的管理行为。SM 状态机包含以下主要状态:
Standby(备) → Discovering(发现中) → Master(主)
↑ |
| ↓
+---- Master 失联 ← Standby 超时
Master 状态下:
→ 周期性发送 Heartbeat
→ 监听 Trap 事件
→ 若收到更高优先级 SM 的接管请求 → 降级为 Standby
SM 状态机的关键转换条件包括:
- Standby → Discovering:备 SM 在启动后或主 SM 心跳超时后,进入发现模式。此时它会发送
SubnGet(NodeInfo)探测子网中是否存在其他 SM。 - Discovering → Master:如果发现没有其他 SM 或自身优先级最高,则完成全量发现与配置后,正式成为主 SM。
- Master → Standby:当收到来自更高优先级 SM 的
SubnSet(SMInfo)报文时,当前主 SM 必须放弃控制权,降级为备 SM。
sm_sync 工具定期同步数据库,切换时间缩短至 2 秒以内。
常见误区与排障思路
| 误区 | 现象 | 正确排查方向 |
|---|---|---|
| 认为 SM 是可选组件 | 所有端口停留在 Initializing,ibstatus 显示 DOWN | 确认 SM 进程是否运行(sm_poll 或 opensm) |
| 忽略 M_Key 一致性 | SM 无法管理部分交换机 | 检查所有节点的 M_Key 是否与 SM 配置一致 |
| 主备 SM 优先级配置错误 | 频繁发生主备切换 | 使用 sm_query 查看当前主 SM 的优先级和 GUID |
| SM 与数据面共用同一物理链路 | 网络拥塞时 SM 响应超时 | 确保管理网络独立或使用 QoS 优先保障 SMP 通道 |
排障时,建议首先使用 ibdiagnet 检查子网健康状态,它会报告 SM 是否可达、LID 分配是否冲突、LFT 是否完整等关键信息。其次,查看 SM 日志(如 /var/log/opensm.log)中的 ERROR 级别记录,重点关注 M_Key mismatch、port down、sweep timeout 等关键词。
sweep_interval 设置为 5~10 秒,以便快速感知拓扑变化。对于超大规模集群(超过 1000 个节点),可考虑使用 opensm 的 --enable_routing_engine 选项,结合 LASH 算法提升路由计算效率。