更新时间: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 表示两个子层级)。

验证配置

  1. 检查拓扑结构
    scontrol show topology

    输出示例:

    SwitchName=rack1 Nodes=node[1-10]
    SwitchName=rack2 Nodes=node[11-20]
  2. 查看节点关联的拓扑
    scontrol show node node01

    输出中的SwitchName字段显示所属拓扑层级:

    NodeName=node01 ... SwitchName=rack1
  3. 提交测试作业
    # 要求分配同一机架内的两个节点
    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 会失败。

最佳实践

  • 与实际硬件对齐

    确保 topology.conf 中的层级结构(如机架、交换机)与物理网络一致。

  • 简化层级深度

    避免过度嵌套(如 集群→机房→机架→交换机→节点),通常 2-3 层即可。

  • 结合QoS限制拓扑资源
    通过QoS限制用户在特定拓扑层级的资源使用:
    sacctmgr add qos high_priority --max-switches-per-job=2

高级示例(动态资源分区)

# 定义 GPU 节点的独立拓扑
SwitchName=gpu_rack Nodes=gpu[1-4]  # GPU 节点专用机架
# 提交作业时指定 GPU 拓扑
sbatch --gres=gpu:2 --switches=1@gpu_rack job.sh