第四章:分区(Partition)配置
分区配置,说白了就是给 InfiniBand 网络做「门禁管理」。我记得刚接触 IB 网络时,总觉得这玩意儿不就是个高速网络吗?搞什么分区?直到有一次,我在一个超算中心做调试,发现存储节点的流量居然跑到了计算节点上,整个网络乱成一锅粥。嗯,从那以后,我再也不敢小看分区了。
4.1 P_Key 原理:分区的「身份证」
每个 IB 节点都有一个 16 位的 P_Key,你可以把它想象成身份证号。交换机根据这个号码决定:让不让你通过,让你跟谁通信。
P_Key 的结构其实很简单:
- 第 15 位(最高位):成员类型位。0 表示受限成员,1 表示完全成员。
- 第 0-14 位:分区编号。范围 0x0001 到 0x7FFF。
我习惯把完全成员比作「VIP 会员」,受限成员就是「普通访客」。VIP 可以主动发起通信,普通访客只能被动响应。这个设计很巧妙,你想想看,安全策略一下子就灵活了。
关键点:P_Key 0x7FFF 是默认分区,所有节点默认都在这个分区里。但实际生产环境中,我建议你尽量少用默认分区。
4.2 默认分区与自定义分区
每个 IB 交换机出厂时都带一个默认分区:P_Key 0x7FFF。所有端口默认都属于这个分区。听起来很方便对吧?但我在项目中遇到过一个问题:
有一次,客户把所有节点都丢在默认分区里,结果一个存储节点的故障广播风暴,直接拖垮了整个计算集群。这就是「大锅饭」的代价——没有隔离,就没有安全。
自定义分区就灵活多了。你可以这样规划:
| 分区名称 | P_Key | 成员 | 用途 |
|---|---|---|---|
| Default | 0x7FFF | 所有节点 | 初始通信 |
| Compute | 0x0001 | 计算节点 | MPI 通信 |
| Storage | 0x0002 | 存储节点 | 文件系统 |
| Management | 0x0003 | 管理节点 | 监控管理 |
配置自定义分区时,我一般用 OpenSM 的命令行工具。举个例子:
# 创建一个计算分区
partitions.conf:
Default=0x7FFF, ipoib, sl=0, defmember=full
Compute=0x0001, ipoib, sl=0, defmember=full : ALL=full, ALL_SWITCHES=full
Storage=0x0002, ipoib, sl=0, defmember=full : ALL=full, ALL_SWITCHES=full
# 应用配置
opensm -c /etc/opensm/partitions.conf
我的小技巧:自定义分区时,P_Key 编号最好从 0x0001 开始递增,别跳着用。不然以后排查问题,光看编号就能把你绕晕。
4.3 分区隔离策略:让该见的见,不该见的别见
分区隔离的核心思想就一句话:不同分区的节点,默认不能通信。除非你明确配置了跨分区路由。
我常用的隔离策略有三种:
- 完全隔离:每个分区独立,互不干扰。适合安全要求高的场景。
- 部分互通:某些分区可以互相访问。比如管理分区可以访问所有分区。
- 层级隔离:按业务层级划分,上层可以访问下层,反之不行。
配置跨分区通信时,需要用到 P_Key 的「成员类型」:
# 管理分区可以访问计算分区
Management=0x0003, ipoib, sl=0, defmember=full : ALL=full, ALL_SWITCHES=full
Compute=0x0001, ipoib, sl=0, defmember=full : ALL=full, ALL_SWITCHES=full
# 在管理节点上配置跨分区 P_Key
# 给管理节点同时分配 0x0001 和 0x0003
注意:跨分区配置要谨慎。我曾经见过一个案例,运维人员给所有节点都配了多个 P_Key,结果分区隔离形同虚设。记住:最小权限原则——只给必要的节点配必要的分区。
4.4 实战:分区配置的避坑指南
做分区配置这么多年,我踩过不少坑。分享几个典型的:
- 坑一:忘记重启 OpenSM。改了分区配置后,必须重启 OpenSM 才能生效。我刚开始时经常忘了这步,折腾半天发现配置没变。
- 坑二:P_Key 冲突。不同交换机上的 P_Key 编号要统一规划。不然 A 交换机的 0x0001 是计算分区,B 交换机的 0x0001 是存储分区,一互联就乱套。
- 坑三:忽略默认分区。有些节点默认还在 0x7FFF 里,如果你没显式移除,它就能跟所有节点通信。这等于没做隔离。
我曾经在一个项目中,因为默认分区没清理干净,导致存储节点的流量跑到了 GPU 计算节点上。结果 GPU 训练任务被干扰,性能掉了 30%。排查了整整两天才找到原因。嗯,从那以后,我每次做完分区配置,都会用 ibswitches 和 ibstatus 检查一遍。
总结一下:分区配置是 IB 网络安全的基石。别嫌麻烦,花点时间规划好分区策略,能省掉后面无数的排查时间。我个人习惯是:先画拓扑图,再定分区方案,最后动手配置。顺序别搞反了。