零、使用 OpenSM 管理 Mellanox IB 网络
问:如果IB 网络是 mellanox 网卡 + mellanox 交换机;那么,opensm可以管理这样的IB网络么?从哪里开始管理呢?流程原理是什么?
答:
对于Mellanox网卡和交换机组成的InfiniBand网络,开源OpenSM不仅能管理,它本身就是为这类环境设计的。NVIDIA自家的MLNX_OFED驱动栈里就集成了OpenSM,用于初始化硬件。管理的起点是网络中任意一台连接了InfiniBand网卡的Linux主机,而非交换机本身。
🖥️ 从哪里开始管理?------ 运行OpenSM的主机
OpenSM作为基于主机(Host-based) 的软件,需要运行在一台连接了InfiniBand网络的服务器上。这台主机通过本地的HCA(主机通道适配器,即网卡)端口,"接管"整个网络的初始化工作。如果主机有多个IB端口,需通过-g选项或配置文件指定OpenSM绑定到哪个端口上。
⚙️ 流程原理:OpenSM如何"接管"网络
OpenSM的管理流程是分阶段、自动完成的,核心步骤如下:
1. 子网发现 (Subnet Discovery)
这是管理的第一步 。OpenSM启动后,会从绑定的本地端口出发,通过发送子网管理包(SMPs) ,逐跳"探索"整个网络。这个过程会收集所有交换机、主机和链路的拓扑信息,构建出完整的网络地图。
2. LID分配 (LID Assignment)
拓扑发现完成后,OpenSM会为网络中的每一个端口分配一个本地标识符(Local Identifier, LID)。LID是InfiniBand网络内部的二层地址,后续所有数据包的转发都将基于它进行。
3. 路由计算与下发 (Routing & Table Setup)
基于收集到的拓扑和分配的LID,OpenSM开始计算最优路径。它会根据配置的路由算法(如Min Hop、UPDN等)为每对通信节点计算路径,然后将计算结果------线性转发表(LFT)和转发数据库(FDB) ------下发到每一台交换机中。这一步完成后,数据通路才真正建立。
4. 监控与维护 (Sweeping & Maintenance)
子网进入正常状态后,OpenSM并不会停止工作。它会周期性地执行轻扫描(Light Sweep) ,快速检查节点和端口状态。当检测到拓扑变化(如链路故障、新节点加入)时,会触发重扫描(Heavy Sweep) ,重新进行发现、LID分配和路由计算,从而自动适应网络变化。
💡 针对Mellanox硬件的关键点
- 兼容性与选型 :OpenSM通过NVIDIA OFED驱动栈与Mellanox硬件通信,兼容性良好。但需注意,现代Mellanox交换机(如Quantum系列)通常自带嵌入式SM ,开箱即用。此时,主机上运行的OpenSM可作为备用(Standby) 实例,通过设置较低的优先级(
priority)来提供冗余,确保在主SM(无论是交换机内置还是其他主机)失效时能接管网络。 - 路由算法选择 :根据网络拓扑选择算法至关重要。Min Hop 是默认选项,适用于通用场景。如果网络是对称的胖树(Fat-Tree)结构 ,应选择
ftree算法,它能优化"移位"通信模式并避免死锁。对于非纯胖树但存在环路的拓扑,updn算法是更安全的选择。
一、原理篇:OpenSM 是什么,它如何工作
1.1 InfiniBand 为什么需要子网管理器
InfiniBand 与以太网有一个根本性区别:以太网交换机通过生成树协议和 MAC 地址学习自动组织网络,而 InfiniBand 网络本身不会自行初始化 。每一个 InfiniBand 端口在启动时都是"空白"的,它不知道自己的地址,也不知道如何到达其他端口。必须有一个外部实体来发现整个网络的拓扑、为每个端口分配地址、计算路由表,并将这些信息下发到每一台交换机和 HCA。这个实体就是子网管理器(Subnet Manager, SM) 。没有活动 SM 的 InfiniBand 网络无法进入正常转发状态。
OpenSM 是 InfiniBand 子网管理器的开源参考实现,以固定流程可执行程序的形式提供,运行在 NVIDIA OFED 或 Linux RDMA 协议栈之上。它实现了 InfiniBand 架构规范中"管理模型""子网管理"和"子网管理代理"三章所定义的 SM/SA 功能。
1.2 SM 的核心职责与初始化流程
OpenSM 启动后,会经历一个确定性的初始化流程:
第一步:子网发现。 OpenSM 从它绑定的本地 IB 端口出发,通过交换 Subnet Manager Packages(SMPs)逐跳遍历网络。它借助每个节点上驻留的 Subnet Manager Agent(SMA)来收集节点和端口信息,最终构建出完整的网络拓扑图,包括所有交换机、HCA 和链路。
第二步:LID 分配。 为每个端口分配本地标识符(Local Identifier, LID)。LID 是 InfiniBand 子网内的二/三层地址,所有数据包的转发都基于 LID 进行。
第三步:路由计算与表下发。 根据选定的路由算法计算转发路径,生成交换机的线性转发表(LFT)和各端口的转发数据库(FDB),然后将这些表写入每一台交换机。路由计算完成后,子网进入激活状态。
第四步:持续监控。 OpenSM 进入运行状态后,会周期性地执行轻扫描 (每约 10 秒轮询一次节点和端口状态)和重扫描(当轻扫描检测到变化时触发完整的拓扑重新发现)。重扫描也可以通过 InfiniBand TRAP 或向 OpenSM 进程发送 HUP 信号来主动触发。
1.3 多 SM 与主备选举
一个子网中可以运行多个 SM 实例,但同一时间只有一个 Master SM 在活动。其余 SM 处于 Standby 状态,通过轮询 Master 并依据 SMInfo 协议进行故障检测和接管。Master 的选举规则是:优先级(0--15)更高者优先;优先级相同时,端口 GUID 数值更小者获胜。
Standby SM 在成为 Master 后需要能够安全地对同一子网执行扫描。因此,备用实例的配置(分区定义、路由引擎、QoS 设置、子网前缀等)必须与主实例保持兼容,否则故障切换可能破坏网络。
1.4 路由算法
OpenSM 提供多种路由引擎,选择取决于拓扑类型:
- Min Hop(默认) :基于最小跳数优化路径长度。适用于任意拓扑,但不保证无死锁。
- UPDN:在 Min Hop 基础上加入排名约束,确保无环路径。适用于非纯 Fat-Tree 但需要无死锁保证的拓扑。
- Fat-Tree:专为对称 Fat-Tree 优化,避免信用环路死锁,适合"shift"通信模式。如果未提供根 GUID 文件,拓扑必须是严格对称的 Fat-Tree,否则回退到 Min Hop。
- DOR:基于 Min Hop,但避免端口均衡,适用于超立方体和网格拓扑。
二、环境搭建篇
2.1 硬件与系统前提
你需要至少一台配备 InfiniBand HCA 的 Linux 主机,以及(可选)InfiniBand 交换机。操作系统方面,RHEL/CentOS、Ubuntu、Debian 均可。确保已安装 rdma-core 及其开发包,这是 OpenSM 构建和运行的基础依赖。
在开始之前,用 ibstat 确认 HCA 状态:
bash
ibstat
输出中关注 State 是否为 Active、Port GUID 的数值,以及 SM lid 字段------如果 SM lid 为 0,说明当前子网还没有活动的 SM。
2.2 安装方式一:包管理器(推荐)
大多数发行版仓库中已包含 opensm:
bash
# RHEL / CentOS / Rocky
sudo yum install opensm
# Ubuntu / Debian
sudo apt install opensm
安装后,OpenSM 通常以 systemd 服务形式管理:
bash
sudo systemctl enable --now opensm
sudo systemctl status opensm
RHEL 系的默认配置位于 /etc/sysconfig/opensm,可通过 GUIDS 参数指定绑定的端口 GUID,通过 PRIORITY 设置 SM 优先级。更详细的运行参数在 /etc/rdma/opensm.conf 中配置。
2.3 安装方式二:从源码编译
如果你需要最新版本或特定编译选项,可以从 linux-rdma 的 GitHub 仓库获取源码。构建依赖包括:
bash
sudo apt install autoconf automake libtool bison flex rdma-core-devel
# 或 RHEL 系: sudo yum install autoconf automake libtool bison flex rdma-core-devel
编译流程为标准 autotools 三步:
bash
git clone https://github.com/linux-rdma/opensm.git
cd opensm
./autogen.sh # 如果 configure 脚本不存在
./configure --prefix=/usr --sysconfdir=/etc
make -j$(nproc)
sudo make install
--sysconfdir=/etc 确保配置文件安装到 /etc 下,与包管理器安装的路径一致。
2.4 最小验证
启动 OpenSM 后,检查日志中是否出现 SUBNET UP:
bash
grep "SUBNET UP" /var/log/opensm.log
看到此消息说明 SM 成功发现了拓扑、分配了 LID 并下发了路由表。再用 sminfo 确认 Master 状态:
bash
sminfo
# 输出中 State 应为 MASTER,并显示 SM 的 LID、GUID 和优先级
三、应用篇
3.1 命令行启动与常用选项
最简单的启动方式:
bash
sudo opensm
常用选项:
| 选项 | 作用 |
|---|---|
-R <engine> |
指定路由算法(minhop / updn / ftree / dor) |
-p <prio> |
设置 SM 优先级(0--15) |
-g <guid> |
绑定到指定端口 GUID |
-s <sec> |
设置扫描间隔(秒) |
-A |
启用单播路由缓存 |
-B |
启用双端口(同时绑定两个 IB 端口) |
-a <file> |
指定根节点 GUID 文件(Fat-Tree/UPDN 需要) |
例如,使用 Fat-Tree 路由并指定根 GUID 文件:
bash
sudo opensm -R ftree -A -a /etc/opensm/guid.txt -s 120
使用 Min Hop 算法并设置优先级:
bash
sudo opensm -R minhop -p 15
3.2 配置文件详解
opensm.conf 是 OpenSM 的主配置文件。如果该文件不存在,可以用 -c 选项生成模板:
bash
sudo opensm -c /etc/rdma/opensm.conf
关键参数:
routing_engine:路由算法,可选minhop、updn、ftree、dor。sm_priority:SM 优先级,0--15,数值越高越优先成为 Master。sweep_interval:轻扫描间隔(秒),默认 10。root_guid_file:Fat-Tree 或 UPDN 的根节点 GUID 文件路径。use_ucast_cache:是否启用单播路由缓存,TRUE可减少重复计算。guid:SM 绑定的本地端口 GUID。
修改后重启服务使配置生效:
bash
sudo systemctl restart opensm
3.3 主备冗余配置
在生产环境中,建议部署至少两个 OpenSM 实例,运行在独立的故障域中(不同主机或不同交换机),避免主机、电源或 HCA 端口故障导致管理平面不可用。
配置示例:主实例优先级 15,备实例优先级 14。
bash
# 主机 A 的 opensm.conf
sm_priority 15
# 主机 B 的 opensm.conf
sm_priority 14
两者必须绑定到同一个 InfiniBand 子网 的端口。用 ibstat -p 列出本机所有端口的 GUID,然后通过 -g 选项或配置文件中的 guid 参数指定绑定端口。用 ps -eo pid,args | grep '[o]pensm' 确认两个实例都在运行且绑定正确。
备用实例的分区定义、路由引擎、QoS 策略、SM Key 和管理 Key 必须与主实例保持一致,否则故障切换后可能产生不可预期的网络行为。
3.4 日志与调试
OpenSM 默认写入两个日志文件:/var/log/messages(仅记录主要事件)和 /var/log/opensm.log(记录详细错误信息)。opensm.log 中的任何错误都应视为 fabric 健康问题的指标。
日志 verbosity 可通过 -D 选项控制:
| 级别 | 含义 |
|---|---|
| 0x01 | ERROR |
| 0x02 | INFO |
| 0x04 | VERBOSE |
| 0x08 | DEBUG |
| 0x0F | 全部 |
默认级别为 ERROR + INFO(0x3)。调试时可用 -D 0x0F 打开全部日志。
向 OpenSM 进程发送 SIGUSR1 可触发日志文件重新打开,便于 logrotate 切割。发送 HUP 信号则触发一次完整的重扫描,等效于收到拓扑变化的 TRAP。
3.5 常用诊断命令
ibstat 查看 HCA 端口状态和 LID 分配情况:
bash
ibstat # 显示所有 IB 设备的端口状态
ibstat -l # 列出所有 IB 设备名称
ibstat -p # 只显示端口 GUID
sminfo 查询当前子网中的 SM 信息,确认哪个实例是 Master:
bash
sminfo
saquery -s 列出子网中所有 SM 实例:
bash
saquery -s
这些工具来自 infiniband-diags 包,在安装 opensm 时通常作为依赖一并安装。
四、总结
OpenSM 是 InfiniBand 网络能够运转的前提------没有它,HCA 和交换机之间无法建立任何有效的数据通路。学习 OpenSM 的核心路径是:理解 SM 的发现---分配---计算---下发四步初始化流程,掌握 routing_engine、sm_priority、sweep_interval 三个最关键的配置参数,并在实际环境中用 ibstat 和 sminfo 验证子网状态。在生产部署中,不要只运行一个 OpenSM 实例;用优先级区分主备,用独立故障域保证控制平面的可用性,并确保备用实例的策略配置与主实例完全兼容。
五、FabricManager 设计思路
NVIDIA的NVSwitch管理软件Fabric Manager并没有直接使用开源的OpenSM ,但它深度借鉴了OpenSM所代表的InfiniBand子网管理思想 ,并在此基础上发展出了专为NVLink网络设计的NVLink Subnet Manager(NVLSM)。
🧠 思想的传承:从InfiniBand到NVLink
Fabric Manager与OpenSM的关系,可以理解为思想上的继承与技术上的分化。
- 核心思想的继承 :两者都遵循集中式网络管理的核心思想。正如OpenSM负责发现InfiniBand网络拓扑、分配LID并计算路由一样,Fabric Manager也负责发现NVSwitch构成的网络拓扑、配置GPU间路由并监控链路状态。它们的核心使命一致:让网络中的设备能够高效、正确地通信。
- 技术实现的分离 :由于NVLink网络在物理层、链路层和寻址方式上与InfiniBand存在根本差异,Fabric Manager无法直接复用OpenSM的代码。因此,NVIDIA开发了NVLSM这一专用组件。
⚙️ 技术的分化:NVLSM的诞生
在NVSwitch架构中,管理职责由Fabric Manager (FM) 和NVLink Subnet Manager (NVLSM) 共同承担。
- NVLSM是OpenSM思想的NVLink特化版 :NVLSM"起源于InfiniBand网络,并增加了额外的逻辑来编程NVSwitch和NVLink"。它被集成在NVSwitch交换机的操作系统(NVOS)中,负责发现NVLink拓扑、配置NVSwitch路由表等核心子网管理任务。
- Fabric Manager的角色 :FM本身是一个用户空间的守护进程,它管理NVSwitch硬件,处理GPU侧的路由和NVLink配置。在更宏大的架构中,例如GB200 NVL72系统,还出现了全局Fabric Manager(GFM) 的概念,由NMX-Controller提供,用于管理更复杂的分布式NVLink网络。
💎 总结
Fabric Manager并非OpenSM的简单替代品,而是NVLink网络专用管理方案 。它继承了OpenSM的集中式管理思想 ,但通过NVLSM这个专为NVLink设计的组件,实现了对NVSwitch硬件和NVLink链路的精确控制,从而支撑起GPU间大规模、高带宽的通信。