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

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] jobsshow [--federation] stepscompleting
以下作业操作在联邦中会按需要路由到来源集群: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 软件许可证推定为文章许可。
本译稿保留原文的技术步骤、示例与限制,并以“译注”或“补充核验”区分修正和新增说明。示例只做静态审查,未安装、运行或测试。












暂无评论内容