拓扑指南
Slurm 可以配置为支持拓扑感知的资源分配,以优化作业性能。 Slurm 支持多种操作模式,一种用于优化具有三维环形互连的系统性能,另一种用于分层互连。 分层操作模式支持胖树或蜻蜓网络,使用略有不同的算法。
Slurm 的原生资源选择模式是将节点视为一维数组。 作业在最佳匹配的基础上分配资源。 对于较大的作业,这最小化了分配给作业的连续节点集的数量。
三维拓扑
一些大型计算机依赖于三维环形互连。 Cray XT 和 XE 系统也具有三维环形互连,但不要求作业在相邻节点上执行。 在这些系统上,Slurm 只需将资源分配给网络上相邻的作业。 Slurm 使用 Hilbert 曲线 将节点从三维空间映射到一维空间。 因此,Slurm 的原生最佳匹配算法能够为作业实现高度的局部性。
分层网络
Slurm 还可以配置为在分层网络上为作业分配资源,以最小化网络争用。 基本算法是识别层次结构中可以满足作业请求的最低级别交换机,然后使用最佳匹配算法在其底层叶交换机上分配资源。 使用此逻辑需要配置设置为TopologyPlugin=topology/tree。
请注意,slurm 在当前可用资源上使用最佳匹配算法。这可能导致分配的交换机数量超过最佳数量。用户可以使用 salloc、sbatch 和 srun 命令的--switches选项请求作业的最大叶交换机数量以及愿意等待该数量的最大时间。可以使用 scontrol 和 squeue 命令更改挂起作业的参数。
未来某个时候可能会提供 Slurm 代码以直接收集网络拓扑信息。 现在必须在topology.conf配置文件中包含网络拓扑信息,如下例所示。 第一个示例描述了一个三层交换机,其中每个交换机有两个子节点。 请注意,SwitchName值是任意的,仅用于记账目的,但每行必须指定一个名称。 叶交换机描述包含一个SwitchName字段和一个Nodes字段,以标识连接到交换机的节点。 更高级别的交换机描述包含一个SwitchName字段和一个Switches字段,以标识子交换机。 使用 Slurm 的主机列表表达式解析器,因此节点和交换机名称不必是连续的(例如 "Nodes=tux[0-3,12,18-20]" 和 "Switches=s[0-2,4-8,12]" 将被正确解析)。
可选的 LinkSpeed 选项可用于指示链路的相对性能。 使用的单位是任意的,目前此信息未被使用。 将来可能会用于优化资源分配。
第一个示例展示了一个拓扑在一个八节点集群中的样子,其中所有交换机只有两个子节点,如图所示(不是一个非常现实的配置,但对于示例很有用)。
# topology.conf # 交换机配置 SwitchName=s0 Nodes=tux[0-1] SwitchName=s1 Nodes=tux[2-3] SwitchName=s2 Nodes=tux[4-5] SwitchName=s3 Nodes=tux[6-7] SwitchName=s4 Switches=s[0-1] SwitchName=s5 Switches=s[2-3] SwitchName=s6 Switches=s[4-5]

下一个示例是一个具有两级的网络,每个交换机有四个连接。
# topology.conf # 交换机配置 SwitchName=s0 Nodes=tux[0-3] LinkSpeed=900 SwitchName=s1 Nodes=tux[4-7] LinkSpeed=900 SwitchName=s2 Nodes=tux[8-11] LinkSpeed=900 SwitchName=s3 Nodes=tux[12-15] LinkSpeed=1800 SwitchName=s4 Switches=s[0-3] LinkSpeed=1800 SwitchName=s5 Switches=s[0-3] LinkSpeed=1800 SwitchName=s6 Switches=s[0-3] LinkSpeed=1800 SwitchName=s7 Switches=s[0-3] LinkSpeed=1800

实际上,列出每个交换机连接肯定会导致 Slurm 的调度算法变慢,以优化作业放置。 应用程序性能可能从这种优化中获得的好处很少。 列出带有节点的叶交换机加上一个顶级交换机应该能够为应用程序和 Slurm 提供良好的性能。 前一个示例可以配置如下:
# topology.conf # 交换机配置 SwitchName=s0 Nodes=tux[0-3] SwitchName=s1 Nodes=tux[4-7] SwitchName=s2 Nodes=tux[8-11] SwitchName=s3 Nodes=tux[12-15] SwitchName=s4 Switches=s[0-3]
请注意,缺乏共同父交换机的交换机上的计算节点可以使用,但没有作业会跨越没有共同父节点的叶交换机(除非使用 TopologyParam=TopoOptional 选项)。 例如,可以合法地从上述 topology.conf 文件中删除 "SwitchName=s4 Switches=s[0-3]" 行。 在这种情况下,没有作业会跨越任何单个叶交换机上的四个以上计算节点。 如果希望将多个物理集群作为单个逻辑集群调度,并由单个 slurmctld 守护程序控制,则此配置可能很有用。
如果您有节点位于不同网络中并且在您的topology.conf文件中与唯一交换机相关联,可能会出现作业无法运行的情况。如果作业请求位于不同网络中的节点,无论是直接请求节点还是请求特性,作业都会失败,因为请求的节点无法相互通信。我们建议将节点放置在不同网络段中的不相交分区中。
对于具有蜻蜓网络的系统,配置 Slurm 时使用TopologyPlugin=topology/tree加上TopologyParam=dragonfly。 如果单个作业无法完全放置在单个网络叶交换机内,作业将尽可能分布在多个叶交换机上,以优化作业的网络带宽。
注意:使用topology/tree插件时,Slurm 会识别出为挂起作业提供最佳匹配的网络交换机。如果节点定义了Weight,这将覆盖基于网络拓扑的资源选择。如果通过节点权重优化资源选择比优化网络拓扑更重要,则不要使用topology/tree插件。
配置生成器
以下独立维护的工具可能在为某些交换机类型生成topology.conf文件时有用:- Infiniband 交换机 - slurmibtopology
https://github.com/OleHolmNielsen/Slurm_tools/tree/master/slurmibtopology - Omni-Path (OPA) 交换机 - opa2slurm
https://gitlab.com/jtfrey/opa2slurm - AWS 弹性网络适配器 (EFA) - ec2-topology
https://github.com/aws-samples/ec2-topology-aware-for-slurm
块拓扑
Slurm 可以配置为在严格执行的分层块结构内为作业分配资源,使用 TopologyPlugin=topology/block。 这种方法从“基本块”(bblocks)开始,这些是定义在 topology.conf中的基本、连续节点组。 这些基本块可以与其他相邻的基本块组合形成“聚合块”。反过来,这些更高级别的块可以与其他同一层次级别的连续块聚合,以构建逐步更大的块。这种分层安排旨在确保在这些块中运行的作业的通信性能得到优化。 BlockSizes配置参数定义了此层次结构中每个级别的特定、可执行的块大小。
分配算法的操作如下:
- 识别由BlockSizes定义的可以满足作业资源请求的最小块级别
- 选择该聚合块的组成部分的“较低级别块”(llblocks)的合适子集
- 从构成该所选 llblocks 子集的底层基本块中分配资源,使用最佳匹配算法进行作业的精确放置。
用户选项
对于使用topology/tree插件的情况,用户还可以指定作业使用的最大叶交换机数量以及作业应等待此优化配置的最大时间。此选项的语法为--switches=count[@time]。 系统管理员可以使用SchedulerParameters配置参数限制任何作业等待此优化配置的最大时间,使用 max_switch_wait选项。
当配置了topology/tree或topology/block时,主机列表函数可以替代或与常规主机列表表达式一起使用,用于与 slurmctld 交互的命令或配置文件中。有效的拓扑函数包括:
- block{blockX} 和 switch{switchY} - 展开为指定块/交换机中的所有节点。
- blockwith{nodeX} 和 switchwith{nodeY} - 展开为与指定节点在同一块/交换机中的所有节点。
例如:
scontrol update node=block{b1} state=resume sbatch --nodelist=blockwith{node0} -N 10 program PartitionName=Block10 Nodes=block{block10} ...另请参见主机列表函数feature{myfeature} 此处。
环境变量
如果使用 topology/tree 插件,将设置两个环境变量来描述该作业的网络拓扑。请注意,这些环境变量将为每个节点启动的任务包含不同的数据。使用这些环境变量由用户自行决定。
SLURM_TOPOLOGY_ADDR: 该值将设置为可能涉及作业通信的网络交换机的名称,从系统的顶级交换机到叶交换机,最后是节点名称。使用句点分隔每个硬件组件名称。
SLURM_TOPOLOGY_ADDR_PATTERN: 仅当系统配置了 topology/tree 插件时才设置此项。 该值将设置为 SLURM_TOPOLOGY_ADDR 中列出的组件类型。 每个组件将被标识为“交换机”或“节点”。 使用句点分隔每个硬件组件类型。
多重拓扑
Slurm 25.05 引入了使用 topology.yaml配置文件定义多个网络拓扑的能力。 每个分区可以通过在其分区配置行中指定 拓扑来配置使用特定拓扑。 Slurm 控制器将使用所选拓扑优化提交到该分区的作业的资源分配。 如果没有为分区显式指定拓扑,Slurm 将默认为 cluster_default 拓扑。
最后修改于 2025 年 5 月 30 日