OpenSM 管理 IB 网络简介 与 FabricManager 的设计思路

零、使用 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)。

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间大规模、高带宽的通信。

相关推荐
Eloudy1 天前
【无标题】
网络·gpu·rdma·roce
蒸鱼Yuzheng2 天前
Shader 指令成本回归:离线编译、设备权重与误报控制
ci/cd·性能优化·gpu·shader·vulkan
gwf2162 天前
内核态RDMA驱动调试技巧:ftrace/tracepoint/crash分析 —— 深入驱动底层的排错艺术
性能调优·linux驱动·ftrace·rdma·tracepoint·内核调试·crash分析
Eloudy2 天前
Debug Soft-RoCE (RXE) 完整流程
rdma·roce
Smoothcloud润云3 天前
PyTorch推理服务模型热切换与失败回滚实战:降低版本更新中断
服务器·人工智能·pytorch·python·深度学习·gpu
gwf2163 天前
常见驱动问题定位与解决:设备识别、性能不达预期、CQ错误码 —— 资深RDMA驱动调试排错指南
驱动开发·linux内核·性能调优·rdma·故障排查·mlx5·irdma
Eloudy3 天前
gem5 模拟 AMD GPU 的 PPA:从周期级时序到功耗与能量的完整实践
gpu
Eloudy4 天前
DOCA GPUNetIO 开源版(GDAKI)实现分析
gpu·rdma·roce
蒸鱼Yuzheng4 天前
RenderDoc 跨版本回放治理:驱动、API、资源与兼容性矩阵
数据治理·gpu·兼容性测试·vulkan·renderdoc