Slurm 联邦调度指南

概述

Slurm 支持创建集群的联邦并在它们之间以对等方式调度作业。提交到联邦的作业会收到一个在所有集群中唯一的作业 ID。作业提交到本地集群(在 slurm.conf 中定义的集群),然后在联邦中的集群之间复制。每个集群独立尝试根据自己的调度策略调度作业。集群与“源”集群(提交作业的集群)协调以调度作业。

注意:这并不适用于高吞吐量环境。如果每天调度超过 50,000 个作业,请考虑配置更少的集群,以便兄弟作业可以提交,或者仅将负载定向到本地集群(例如,可以使用 --cluster-constraint= 或 -M 提交选项来实现)。

配置

使用 sacctmgr 命令在数据库中创建联邦并将集群添加到联邦来创建联邦。


要创建联邦,请使用:
sacctmgr add federation <federation_name> [clusters=<list_of_clusters>]
可以使用以下命令将集群添加到或从联邦中移除:
注意:一个集群一次只能是一个联邦的成员。
sacctmgr modify federation <federation_name> set clusters[+-]=<list_of_clusters>
sacctmgr modify cluster <cluster_name> set federation=<federation_name>
sacctmgr modify federation <federation_name> set clusters=
sacctmgr modify cluster <cluster_name> set federation=
注意:如果从联邦中移除集群而不先将其排空,则在被移除的集群上运行的作业,或源自被移除集群的作业,将继续作为非联邦作业运行。如果在源集群上有作业处于待处理状态,则该作业将作为非联邦作业保持待处理状态,并且剩余的兄弟作业将被移除。如果源集群正在被移除,并且作业处于待处理状态且仅在一个集群上可行,则它将作为非联邦作业保持在可行集群上待处理。如果源集群正在被移除,并且作业处于待处理状态且在多个集群上可行(除了源集群),则剩余的待处理作业将作为联邦作业保持待处理状态,剩余的兄弟集群将相互调度以启动作业。

可以使用以下命令删除联邦:
sacctmgr delete federation <federation_name>
可以将通用特性分配给集群,并在提交时使用 --cluster-constraint=[!]<feature_list> 选项请求:
sacctmgr modify cluster <cluster_name> set features[+-]=<feature_list>
可以使用以下命令设置集群的联邦状态:
sacctmgr modify cluster <cluster_name> set fedstate=<state>
可能的状态包括:
  • ACTIVE: 集群将主动接受和调度联邦作业
  • INACTIVE: 集群将不调度或接受任何作业
  • DRAIN: 集群将不接受任何新作业,并将让现有的联邦作业完成
  • DRAIN+REMOVE: 集群将不接受任何新作业,并将在所有联邦作业完成后将自己移除出联邦。被移除后,集群将作为非联邦集群接受作业
可以使用以下命令查看联邦配置:
sacctmgr show federation [tree]
sacctmgr show cluster withfed
在集群添加到联邦并启动控制器后,可以从控制器查看其状态:
scontrol show federation
默认情况下,状态命令将显示本地视图。可以通过在 slurm.conf 中配置以下参数来设置默认的联邦视图:
FederationParameters=fed_display

联邦作业 ID

当作业提交到联邦时,它会获得一个联邦作业 ID。联邦中的作业 ID 在所有集群中是唯一的。联邦作业 ID 是通过利用一个无符号的 32 位整数来分配集群的 ID 和集群的本地 ID。
位 0-25:  本地作业 ID
位 26-31: 集群源 ID
联邦作业 ID 使控制器能够通过查看作业的集群源 ID 来知道作业是提交到哪个集群的。

作业提交

当联邦集群接收到作业提交时,它将向每个合格的集群提交作业副本(兄弟作业)。每个集群将独立尝试调度作业。

可以使用 -M,--clusters=<cluster_list> 和新的 --cluster-constraint=[!]<constraint_list> 选项将作业定向到联邦中的特定集群。

使用 -M,--clusters=<cluster_list> 提交命令(sbatch, salloc, srun)将从集群列表中选择一个集群来提交作业,并将集群列表传递给作业。列表中的集群将是唯一可以提交兄弟作业的可行集群。例如,提交:

cluster1$ sbatch -Mcluster2,cluster3 script.sh
将作业提交到 cluster2 或 cluster3,并且只会将兄弟作业提交到 cluster2 和 cluster3,即使联邦中还有更多集群。

使用 --cluster-constraint=[!]<constraint_list> 选项将只向具有请求的集群特性(如果使用 ! 则表示没有这些特性)的集群提交兄弟作业。集群特性通过 sacctmgr modify cluster <cluster_name> set features[+-]=<feature_list> 选项添加。

注意:使用 ! 选项时,请在选项周围添加引号,以防止 shell 解释 !(例如 --cluster-constraint='!highmem')。

当同时使用 --cluster-constraint=--clusters= 选项时,源集群将只向满足两个要求的集群提交兄弟作业。

被保留或依赖的作业将保留在源集群上,直到它们被释放或不再依赖,此时它们将提交到联邦中的其他可行集群。如果作业在提交后变为被保留或依赖,则该作业将从除了源集群以外的每个集群中移除。

作业调度

联邦中的每个集群独立尝试调度每个作业,除了与 源集群(提交作业的集群)协调以为联邦作业分配资源。当一个集群确定可以尝试为作业分配资源时,它会与源集群通信以确认没有其他集群同时尝试分配资源。如果没有其他集群尝试分配资源,该集群将尝试为作业分配资源。如果成功,它将通知源集群已启动作业,源集群将通知具有兄弟作业的集群移除兄弟作业并将其置于 撤销 状态。如果集群无法为作业分配资源,则会通知源集群,以便其他集群可以尝试调度作业。如果是主调度器尝试分配资源,则主调度器将停止查看作业分区中的进一步作业。如果是回填调度器尝试分配资源,则资源将被保留给该作业。

如果源集群宕机,则远程兄弟将与作业的可行兄弟协调以调度作业。当源集群恢复时,它将与其他兄弟同步。

作业重新排队

当联邦作业被重新排队时,源集群会收到通知,源集群随后将向可行集群提交新的兄弟作业,联邦作业有资格在不同于其运行的集群上启动。

slurm.conf 选项 RequeueExitRequeueExitHold 由源集群控制。

交互式作业

交互式作业 -- 使用 srun 和 salloc 提交的作业 -- 可以提交到本地集群并从不同的集群获得分配。当由非本地集群授予 salloc 作业分配时,将设置一个新的环境变量 SLURM_WORKING_CLUSTER,包含远程兄弟集群的 IP 地址、端口和 RPC 版本,以便任何 srun 知道与哪个集群通信。

注意:所有计算节点必须对所有提交主机可访问,才能使其正常工作。
注意:Slurm 中 MPI 接口的当前实现要求 SlurmdSpooldir 在运行 srun 的主机上与分配中的计算节点相同。如果它们不相同,解决方法是获取一个将用户放在实际计算节点上的分配。然后,计算节点上的 srun 将使用与正确集群对应的 slurm.conf。设置 LaunchParameters=use_interactive_step slurm.conf 将在使用 salloc 时将用户放在实际计算节点上。

取消作业

联邦中的取消请求将取消正在运行的兄弟作业或所有待处理的兄弟作业。可以使用 scancel--sibling=<cluster_name> 选项删除特定的待处理兄弟作业,以将兄弟作业从作业的活动兄弟列表中移除。

作业修改

作业修改被路由到源集群,源集群将把更改推送到每个兄弟作业。

作业数组

目前,作业数组仅在其提交的源集群上运行。

状态命令

默认情况下,状态命令,如:squeue, sinfo, sprio, sacct, sreport,将显示本地集群的本地视图。可以使用 --federation 选项查看联邦中作业的统一视图。--federation 命令使状态命令首先检查本地集群是否是联邦的一部分。如果是,则该命令将并行查询每个集群以获取作业信息,并将信息合并为一个统一视图。

添加了一个新的 FederationParameters=fed_display slurm.conf 参数,以便所有状态命令默认呈现联邦视图 -- 相当于为每个状态命令设置 --federation 选项。可以使用 --local 选项覆盖联邦视图。使用 --clusters,-M 选项也将覆盖联邦视图,并为给定集群提供本地视图。

使用现有的 --clusters,-M 选项,状态命令将以与今天相同的格式输出信息,其中每个集群的信息单独列出。

squeue

squeue 还具有一个新的 --sibling 选项,将显示每个兄弟作业,而不是将它们合并为一个。

添加了几个新的长格式选项以显示作业的联邦信息:

  • cluster: 正在运行作业或作业步骤的集群名称。
  • siblingsactive: 存在联邦兄弟作业的集群名称。
  • siblingsactiveraw: 存在联邦兄弟作业的集群 ID。
  • siblingsviable: 联邦兄弟作业可运行的集群名称。
  • siblingsviableraw: 联邦兄弟作业可运行的集群名称。

squeue 输出可以使用 -S cluster 选项进行排序。

sinfo

sinfo 将在一个视图中显示每个集群的分区。在联邦视图中,每个分区都显示集群名称。可以使用短格式 %V 或长格式 cluster 选项在格式选项中指定集群名称。输出可以使用 -S %[+-]V 选项按集群名称排序。

sprio

在联邦视图中,sprio 显示来自本地集群或第一个报告作业的集群的作业信息。由于每个兄弟作业在每个集群上可能具有不同的优先级,因此使用 --sibling 选项显示作业的所有记录可能会更有帮助,以更好地了解作业的优先级。报告作业记录的集群名称可以使用 %c 格式选项显示。使用 --sibling 选项时,集群名称默认显示。

sacct

默认情况下,sacct 不会显示“撤销”作业,并将显示来自运行作业的集群的作业。然而,可以使用 --duplicate/-D 选项查看“撤销”作业。

sreport

sreport 将合并来自每个集群的报告并将其显示为一个。

scontrol

以下 scontrol 选项将显示联邦视图:

  • show [--federation|--sibling] jobs
  • show [--federation] steps
  • completing

以下 scontrol 选项在联邦中处理。如果命令从联邦集群以外的集群运行,它将被路由到源集群。

  • hold
  • uhold
  • release
  • requeue
  • requeuehold
  • suspend
  • update job

所有其他 scontrol 选项应通过在集群上发出命令或使用 --cluster/-M 选项直接指向特定集群。

术语表

  • 联邦作业: 提交到联邦集群的作业。它在所有集群中具有唯一的作业 ID(源集群 ID + 本地作业 ID)。
  • 兄弟作业: 提交到其他联邦集群的联邦作业的副本。
  • 本地集群: 在 slurm.conf 中找到的集群,命令默认将与其通信。
  • 源集群: 联邦作业最初提交的集群。源集群将兄弟作业提交到联邦中的其他集群。源集群决定兄弟作业是否可以运行。联邦作业的通信通过源集群路由。
  • 兄弟集群: 与兄弟作业相关联的集群。
  • 源作业: 存在于最初提交的集群上的联邦作业。
  • 撤销(RV)状态: 当源作业未在源集群上积极调度时,源作业所处的状态(例如,不是可行的兄弟,或者其中一个兄弟作业在远程集群上运行)。或者,当另一个兄弟分配节点时,远程兄弟作业被置于的状态。
  • 可行兄弟: 基于请求的集群、集群特性和集群状态(例如,活动、排空等)有资格运行兄弟作业的集群。
  • 活动兄弟: 积极拥有兄弟作业并能够调度作业的兄弟作业。

限制

  • 由于本地集群的资源(分区、节点数等)而失败的联邦作业将被拒绝,并且不会提交到其他兄弟集群,即使它可以在它们上运行。
  • 作业数组仅在提交它们的集群上运行。
  • 作业修改必须在源集群上成功,才能将更改推送到远程集群的兄弟作业。
  • 对作业以外的任何内容的修改在 sview 中被禁用。
  • sview 网格在联邦视图中被禁用。

最后修改于 2021 年 6 月 9 日