Slurm 联邦管理:创建跨集群调度域、查看状态与退出

原文:Slurm Federated Scheduling Guide。作者归属:SchedMD / Slurm 官方文档维护者。中文翻译与核验:未完纪 / Codex。原页未明确注明首发日期;本文核验日期为 2026-10-05。

Slurm 联邦:一个作业,多处候选:1  提交 → 来源集群,来源集群生成联邦作业 ID,并向符合条件的成员发送兄弟作业;2  集群 A / B / C → 各自按本地策略调度,分配前协调;某处启动成功后,其他副本转入 revoked 状态;3  状态查看 → --federation / --sibling,统一作业视图与逐副本视图分别回答不同的运维问题;4  退出 → DRAIN+REMOVE,停止接收新作业,等待已有联邦作业完成,再退出联邦
图:Slurm 联邦:一个作业,多处候选。根据原文与静态核验内容自主绘制,非软件界面截图。

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 在联邦全部集群内唯一。Slurm 使用一个无符号 32 位整数,把来源集群 ID 与集群本地作业 ID 编码在一起:


Bits 0-25:  Local Job ID
Bits 26-31: Cluster Origin ID

控制器通过作业 ID 中的来源集群字段,可以判断作业最初提交到了哪个集群。

提交作业

联邦成员收到作业后,会向每个符合条件的集群提交作业副本,也就是“兄弟作业”。各集群独立尝试调度。使用 -M / --clusters=<cluster_list>,以及 --cluster-constraint=[!]<constraint_list>,可以限制目标集群。

使用 -M 或 --clusters 时,提交命令(sbatch、salloc、srun)从列表里选择一个集群接收最初提交,同时把这个列表随作业传递。只有列表中的集群才有资格接收兄弟作业。原文示例是在 cluster1 上执行:


cluster1$ sbatch -Mcluster2,cluster3 script.sh

它会把作业提交给 cluster2 或 cluster3,兄弟作业也只会投递给这两个集群,即使联邦还包含更多集群。

使用 --cluster-constraint 时,兄弟作业只会投递给具有指定特征的集群;加 ! 表示排除具有该特征的集群。特征通过前述 sacctmgr modify cluster … set features[+-]=… 设置。使用 ! 时应加引号,避免 shell 解释它,例如 --cluster-constraint='!highmem'。

同时使用 --cluster-constraint 与 --clusters 时,来源集群只向同时满足两类条件的集群提交兄弟作业。被挂起或带有未满足依赖的作业暂时只留在来源集群;解除挂起或依赖满足后,才投递到联邦内其他可运行集群。若已经投递的作业后来被挂起或增加了依赖,它在来源集群之外的所有副本会被移除。

调度协调

每个集群独立尝试调度作业,但在为联邦作业分配资源时必须与来源集群协调。某集群判断可以尝试分配资源时,会先联系来源集群,确认没有其他集群同时为该作业分配资源。

如果没有其他集群正在尝试,它就开始分配资源。成功后,它通知来源集群作业已经启动;来源集群再通知持有兄弟作业的其他集群移除这些副本,并把它们置为 revoked 状态。如果分配失败,该集群也会通知来源集群,以便其他集群继续尝试。

若执行该尝试的是主调度器,主调度器会停止继续考察该作业分区中的后续作业;若是回填调度器,则会为这个作业预留资源。若来源集群宕机,远端兄弟作业会与其他具有运行资格的兄弟协调调度;来源集群恢复后,再与其他兄弟同步状态。

重新排队

联邦作业重新排队时,来源集群会收到通知,继而向可运行集群重新提交兄弟作业。因此,作业可能在不同于上次运行地点的集群上重新启动。slurm.conf 中的 RequeueExit 和 RequeueExitHold 由来源集群控制。

交互作业

通过 srun 或 salloc 提交的交互作业,可以提交到本地集群,却从另一个集群获得资源分配。当 salloc 获得远端集群的分配时,Slurm 会设置环境变量 SLURM_WORKING_CLUSTER,其中包含远端兄弟集群的 IP 地址、端口和 RPC 版本,后续 srun 据此知道应联系哪个集群。

要使这一机制工作,所有提交主机必须能够访问所有计算节点。原文还指出,Slurm 当前的 MPI 接口要求:执行 srun 的主机与分配到的计算节点使用相同的 SlurmdSpooldir。若不相同,可让资源分配把用户放到实际计算节点上,再在该节点执行 srun,这样会使用对应集群正确的 slurm.conf。在 slurm.conf 中设置 LaunchParameters=use_interactive_step,即可让 salloc 将用户放到实际计算节点。

取消、修改与作业数组

取消请求会取消正在运行的兄弟作业,或取消所有等待中的兄弟作业。若只想移除某个等待中的副本,可使用 scancel --sibling=<cluster_name>,将该副本从作业的活动兄弟列表中移除。

作业修改请求会被路由到来源集群,再由来源集群把修改推送到各个兄弟作业。当前作业数组只在来源集群运行。

查看状态

squeue、sinfo、sprio、sacct 和 sreport 默认只显示本地集群视图。加上 --federation 后,命令先检查本地集群是否属于某个联邦;如果属于,就并行查询各集群,再把信息合并为统一视图。

配置 FederationParameters=fed_display,相当于为各状态命令默认添加 --federation。--local 可以覆盖这个默认行为;--clusters / -M 同样会覆盖联邦视图,并按指定集群分别列出本地信息,保留原有的逐集群输出格式。

squeue

--sibling 会逐个显示兄弟作业,而不是合并成一条。长格式字段包括:

字段 含义
cluster 运行该作业或作业步的集群名。
siblingsactive 目前存在活动兄弟作业的集群名称。
siblingsactiveraw 目前存在活动兄弟作业的集群 ID。
siblingsviable 有资格运行兄弟作业的集群名称。
siblingsviableraw 有资格运行兄弟作业的集群 ID;原联邦指南写成“集群名称”,这里按官方 squeue 手册修正。

可以用 -S cluster 按集群排序 squeue 输出。

sinfo

联邦视图把每个集群的分区放到同一视图,并在每个分区旁显示集群名。格式字符串可使用短格式 %V 或长格式 cluster 指定集群名;可使用 -S %[+-]V 按集群名排序。

sprio

联邦视图显示本地集群提供的作业信息,或者最先报告该作业的集群提供的信息。由于同一兄弟作业在不同集群可能有不同优先级,使用 --sibling 查看全部记录更有助于理解优先级。%c 可以显示报告记录的集群名;使用 --sibling 时默认显示集群名。

sacct

默认不显示 revoked 作业,只显示实际运行作业的集群记录。使用 --duplicate / -D 可以查看 revoked 记录。

sreport

它会把各集群的报表合并显示。

scontrol

以下操作支持联邦视图:

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

以下作业操作在联邦中会按需要路由到来源集群:hold、uhold、release、requeue、requeuehold、suspend、update job。其他 scontrol 操作应明确发给目标集群:可以直接在那个集群上运行,或使用 --cluster / -M。

术语表

术语 定义
联邦作业(Federated Job) 提交给联邦成员的作业,具有整个联邦唯一的 ID:来源集群 ID 加本地作业 ID。
兄弟作业(Sibling Job) 提交给其他联邦成员的联邦作业副本。
本地集群(Local Cluster) slurm.conf 指定、命令默认联系的集群。
来源集群(Origin Cluster) 最初接收联邦作业的集群,负责提交兄弟作业并决定其能否运行;联邦作业通信经由它路由。
兄弟集群(Sibling Cluster) 与一个兄弟作业关联的集群。
来源作业(Origin Job) 驻留在原始提交集群上的联邦作业。
撤销状态(Revoked / RV) 来源作业未在来源集群主动调度时的状态,例如本地不具备运行资格或远端兄弟正在运行;其他兄弟已经分配到节点时,远端副本也进入这个状态。
可运行兄弟(Viable Sibling) 根据请求的集群列表、集群特征及状态(如 active、draining),具有运行副本资格的集群。
活动兄弟(Active Sibling) 当前存在并能够参与调度的兄弟作业。

限制

  • 若联邦作业在本地集群因分区、节点数量等资源条件不满足而失败,作业会被拒绝;即使其他兄弟集群能够运行,也不会继续投递给它们。
  • 作业数组只在最初提交的集群运行。
  • 作业修改必须先在来源集群成功,才能推送到远端兄弟作业。
  • sview 禁止修改作业以外的对象。
  • 联邦视图中禁用 sview 网格。

来源、版本与许可说明

SchedMD 官方在线指南未单独明示正文转载许可证;不把 Slurm 软件许可证推定为文章许可。

本译稿保留原文的技术步骤、示例与限制,并以“译注”或“补充核验”区分修正和新增说明。示例只做静态审查,未安装、运行或测试。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容