更新时间:2025-05-21 GMT+08:00
资源拓扑
在Slurm中,topology.conf 文件用于定义集群的物理拓扑结构(如机架、交换机层级),从而优化作业调度策略(如优先分配相邻节点)。
以下是配置文件的详细说明和示例。
基本语法
SwitchName=<层级名称> [Nodes=<节点列表>] [Switches=<子层级列表>] [Children=<子节点数量>]
- SwitchName:定义拓扑层级名称(如机架、交换机)。
- Nodes:关联到该层级的节点列表(如 node[1-10])。
- Switches:该层级包含的子层级(用于嵌套结构)。
- Children:子层级的数量(可选)。
配置示例
- 单层拓扑(机架→节点)
# 定义两个机架(rack1, rack2),每个机架包含10个节点 SwitchName=rack1 Nodes=node[1-10] SwitchName=rack2 Nodes=node[11-20]
- 多层拓扑(集群→机架→交换机→节点)
# 集群层(cluster1 包含两个机房) SwitchName=cluster1 Switches=room1,room2 # 机房层(room1 包含两个机架) SwitchName=room1 Switches=rack1,rack2 # 机架层(rack1 包含两个交换机) SwitchName=rack1 Switches=switch1,switch2 # 交换机层(switch1 关联10个节点) SwitchName=switch1 Nodes=node[1-10] SwitchName=switch2 Nodes=node[11-20]
- 混合层级(交换机与节点共存)
# 机架直接关联节点和交换机 SwitchName=rack1 Nodes=node1,node2 Switches=switch1 SwitchName=switch1 Nodes=node3,node4
关键参数说明
参数 |
说明 |
---|---|
Nodes |
节点列表(支持 node[1-5,10] 格式的连续或离散节点)。 |
Switches |
子层级名称列表(用于定义嵌套结构,如机架包含交换机)。 |
Children |
子层级的数量(通常与 Switches 结合使用,如 Children=2 表示两个子层级)。 |
验证配置
- 检查拓扑结构
scontrol show topology
输出示例:
SwitchName=rack1 Nodes=node[1-10] SwitchName=rack2 Nodes=node[11-20]
- 查看节点关联的拓扑
scontrol show node node01
输出中的SwitchName字段显示所属拓扑层级:
NodeName=node01 ... SwitchName=rack1
- 提交测试作业
# 要求分配同一机架内的两个节点 sbatch --nodes=2 --switches=1@rack1 --wrap="hostname" squeue -o "%N" # 查看分配的节点是否属于 rack1
常见问题
- 节点未关联到任何层级
- 现象:scontrol show node 中 SwitchName 为空。
- 解决:检查 Nodes 参数是否包含该节点。
- 语法错误
- 现象:slurmctld 启动失败,日志报错 invalid topology.conf。
- 解决:使用 scontrol reconfigure 重载配置,观察日志:
tail -f /var/log/slurm/slurmctld.log
- 作业无法分配节点
- 原因:--switches 参数超出实际层级容量。
- 示例:若机架 rack1 只有10个节点,提交 --nodes=12 --switches=1@rack1 会失败。
最佳实践
高级示例(动态资源分区)
# 定义 GPU 节点的独立拓扑 SwitchName=gpu_rack Nodes=gpu[1-4] # GPU 节点专用机架 # 提交作业时指定 GPU 拓扑 sbatch --gres=gpu:2 --switches=1@gpu_rack job.sh
父主题: HPC管理调度插件