4、IB子网配置:子网管理器(OpenSM)的部署与配置、分区(PKey)管理
4.1 核心原理:为什么IB子网必须由OpenSM“管理”
InfiniBand(IB)网络与以太网的本质区别在于:IB网络是集中式管理的交换网络,所有数据通路的建立、路由计算和链路状态监控都依赖一个权威控制实体——子网管理器(Subnet Manager,SM)。IB规范规定,每个子网内必须至少有一个活跃的SM,否则交换机和端口的链路层无法完成初始化,即使物理链路已连接,端口也会停留在“初始化”状态,无法进行IPoIB通信或RDMA数据传输。
OpenSM是IB子网中最常用的开源SM实现,运行在Linux用户态。它的核心职责包括:
- 发现子网拓扑:通过SMP(子网管理包)逐跳探测所有交换机、CA(通道适配器)和路由器。
- 分配LID:为每个端口分配唯一的16位本地标识符(LID),LID是IB网络内数据转发的寻址基础。
- 计算路由:基于最短路径算法(默认Dijkstra)生成从任意源到任意目的地的转发表,并下发到各交换机。
- 监控链路状态:周期性发送SMP Trap和Notice,检测链路故障并触发重配置。
- 执行分区策略:将PKey(分区密钥)配置下发到所有端口,实现网络隔离与访问控制。
4.2 方法流程:OpenSM部署与配置实战
4.2.1 安装与基础配置
在管理节点(通常选择一台GPU服务器或独立管理机)上安装OpenSM。以RHEL/CentOS系为例:
# 安装OpenSM
yum install -y opensm
# 或 apt install -y opensm (Ubuntu/Debian)
# 启动前确认IB内核模块已加载
modprobe ib_umad
modprobe ib_uverbs
# 查看本机IB端口状态
ibstat | grep -E "State|Port|LID"
OpenSM的主配置文件位于 /etc/opensm/opensm.conf。核心参数如下:
| 参数 | 默认值 | 说明 |
|---|---|---|
sm_priority | 15 | SM优先级,值越大越优先成为主SM |
lid | 1 | SM自身使用的LID,通常保留1 |
routing_engine | ftree | 路由算法,多GPU集群推荐ftree(Fat-Tree) |
max_wire_smps | 64 | 并发SMP数量,大集群可调至128 |
console_log_level | 1 | 日志级别,排障时调至2或3 |
4.2.2 主备SM配置
生产环境必须配置至少两台SM实现高可用。在备用节点上修改 /etc/opensm/opensm.conf:
# 备用SM配置
sm_priority 7
# 主SM使用15,备用使用7,主故障后自动接管
# 启用主动接管(主恢复后夺回控制权)
force_heavy_sweep 1
# 设置sweep间隔(秒),默认60秒
sweep_interval 30
启动服务并验证主备状态:
systemctl start opensm
systemctl enable opensm
# 查看当前活跃SM
ibstat | grep -A2 "SM state"
# 期望输出: SM state: 4 (STANDBY) 或 3 (MASTER)
4.3 分区(PKey)管理:从原理到配置
PKey是IB网络实现隔离与共享的核心机制,类似以太网的VLAN。每个IB端口可以同时属于多个分区,最多支持32个PKey条目。PKey分为两类:
- 完整成员(Full Member):PKey最高位为0,如0x0001,可主动与其他完整成员通信。
- 受限成员(Limited Member):PKey最高位为1,如0x8001,只能与完整成员通信,不能与受限成员直接通信。
在多GPU集群中,通常将GPU计算节点划入一个分区(如0x8001),存储节点划入另一个分区(如0x8002),再通过一个“共享分区”允许特定节点跨分区访问存储。配置PKey需修改OpenSM的partitions.conf文件:
# /etc/opensm/partitions.conf
# 默认分区(所有节点必须属于0x7fff)
Default=0x7fff, ALL
# GPU计算分区:包含所有GPU服务器
GPU_Cluster=0x8001, ALL_SWITCHES, ALL_CA_PORTS
# 存储分区:仅存储服务器
Storage_Cluster=0x8002, ALL_SWITCHES, ALL_CA_PORTS
# 跨分区访问:允许GPU服务器访问存储
GPU_to_Storage=0x8003, ALL_SWITCHES, ALL_CA_PORTS
# 在GPU服务器上添加0x8003,存储服务器也添加0x8003
修改后需重启OpenSM或执行opensm -F /etc/opensm/opensm.conf重新加载。验证PKey是否生效:
# 查看某端口所属分区
ibquery -p 1 -P 0x8001
# 或使用ibswitches查看交换机端口PKey表
ibswitches -v | grep -A5 "Port 1"
4.4 案例/场景:40节点GPU集群的OpenSM部署
某AI训练集群包含40台GPU服务器(每台8卡A100)、4台存储服务器和2台核心交换机(36端口)。部署要点如下:
- SM部署位置:选择两台GPU服务器作为主备SM,避免占用独立管理机。
- 路由算法:使用
routing_engine ftree,适配Fat-Tree拓扑,实测比默认minhop算法降低30%的转发延迟。 - 分区规划:GPU服务器全部加入
0x8001(计算分区),存储服务器加入0x8002(存储分区),另设0x8003作为跨分区访问通道。 - 性能验证:配置完成后运行
ibping和ib_write_bw测试:
# 在GPU服务器A1上启动服务端
ib_write_bw -d mlx5_0 -p 8001 -s 1048576
# 在GPU服务器A2上运行客户端
ib_write_bw -d mlx5_0 -p 8001 -s 1048576 192.168.1.1
# 预期结果: 带宽 95-98 Gb/s (EDR),延迟 1.2-1.5μs
max_wire_smps提升至128,并考虑将SM部署在独立管理网络,避免与业务流量争抢CPU。
4.5 误区/复盘:PKey配置的常见陷阱
所有IB节点必须属于0x7fff分区,否则即使物理链路正常,端口也无法完成子网初始化。症状为
ibstat显示端口State=Down,但物理链路指示灯正常。
IPoIB通信依赖0x7fff分区,而RDMA通信依赖自定义PKey。若GPU服务器A1的0x8001与A2的0x8001配置不一致(如大小写或数值错误),
ibping可能成功,但ib_write_bw会报connection refused或timeout。
若备用SM的
partitions.conf与主SM不一致,主SM故障后备用SM接管时会重新配置PKey,导致正在运行的RDMA连接中断。务必使用rsync或配置管理工具同步所有SM节点的配置文件。
复盘建议:每次修改PKey后,使用ibquery -p检查所有关键端口的PKey表,并执行一次跨节点ib_write_bw验证。在OpenSM日志(/var/log/opensm.log)中搜索partition关键字,确认分区配置无错误。对于超过200节点的集群,建议使用opensm -c /etc/opensm/opensm.conf生成完整配置模板,再手动修改PKey部分,避免语法错误。