本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Slurm多队列模式指南
在这里,您可以了解如何Amazon ParallelClusterSlurm管理队列(分区)节点,以及如何监控队列和节点状态。
概览
扩展架构基于Slurm云调度指南
云端生命周期
在整个生命周期中,云节点会进入以下几种状态(如果不是全部pow_up
):POWER_SAVING
、POWER_UP
ALLOCATED
(alloc
)、()和POWER_DOWN
(pow_dn
)。在某些情况下,云节点可能会进入OFFLINE
状态。以下列表详细介绍了云节点生命周期中这些状态的多个方面。
-
处于某种
POWER_SAVING
状态的节点将以~
后缀(例如idle~
)显示在sinfo
。在此状态下,没有 EC2 实例支持该节点。但是,仍然Slurm可以将任务分配给节点。 -
过渡到
POWER_UP
状态的节点将出现,其#
后缀为(例如idle#
)sinfo
。当向POWER_UP
处于状态的节点Slurm分配任务时,节点会自动转换为POWER_SAVING
状态。或者,您可以使用以下命令以
su
根用户身份将节点手动转换为POWER_UP
状态:$
scontrol update nodename=
nodename
state=power_up在此阶段,调
ResumeProgram
用,启动和配置 EC2 实例,节点过渡到POWER_UP
状态。 -
当前可供使用的节点中出现没有后缀(例如
idle
)sinfo
。设置好节点并加入集群后,它就可以运行任务了。在此阶段,节点已正确配置并准备好使用。一般而言,我们建议 EC2 实例的数量与可用节点的数量相同。在大多数情况下,静态节点在创建集群后可用。
-
将出现@@ 一个正在过渡到
POWER_DOWN
状态的节点,其%
后缀为(例如idle%
)sinfo
。动态节点在之后自动进入POWER_DOWN
状态ScaledownIdletime。相比之下,在大多数情况下,静态节点不会关闭电源。但是,您可以使用以下命令以su
根用户身份手动将节点置于POWER_DOWN
状态:$
scontrol update nodename=
nodename
state=down reason="manual draining"在此状态下,与节点关联的实例被终止,该节点被设置回该
POWER_SAVING
状态并在之后可供使用ScaledownIdletime。该ScaledownIdletime设置将保存到Slurm配置
SuspendTimeout
设置中。 -
将显示@@ 一个脱机节点,其
*
后缀为(例如down*
)sinfo
。如果Slurm控制器无法联系该节点,或者如果禁用了静态节点并终止了后备实例,则该节点将脱机。
考虑以下sinfo
示例中显示的节点状态。
$
sinfo
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST efa up infinite 4 idle~ efa-dy-efacompute1-[1-4] efa up infinite 1 idle efa-st-efacompute1-1 gpu up infinite 1 idle% gpu-dy-gpucompute1-1 gpu up infinite 9 idle~ gpu-dy-gpucompute1-[2-10] ondemand up infinite 2 mix# ondemand-dy-ondemandcompute1-[1-2] ondemand up infinite 18 idle~ ondemand-dy-ondemandcompute1-[3-10],ondemand-dy-ondemandcompute2-[1-10] spot* up infinite 13 idle~ spot-dy-spotcompute1-[1-10],spot-dy-spotcompute2-[1-3] spot* up infinite 2 idle spot-st-spotcompute2-[1-2]
spot-st-spotcompute2-[1-2]
和efa-st-efacompute1-1
节点已经设置了备份实例并可供使用。这些ondemand-dy-ondemandcompute1-[1-2]
节点处于POWER_UP
状态,应在几分钟内可用。gpu-dy-gpucompute1-1
节点处于POWER_DOWN
状态,并在之后过渡到POWER_SAVING
状态 ScaledownIdletime(默认为 10 分钟)。
所有其他节点都处于POWER_SAVING
状态,没有 EC2 实例支持它们。
使用可用节点
可用节点由 EC2 实例提供支持。默认情况下,节点名称可用于直接 SSH 到实例(例如ssh efa-st-efacompute1-1
)。可以使用以下命令检索实例的私有 IP 地址:
$
scontrol show nodes
nodename
在返回的NodeAddr
字段中检查 IP 地址。
对于不可用的节点,该NodeAddr
字段不应指向正在运行的 EC2 实例。相反,它应与节点名称相同。
Job 状态和提交
在大多数情况下,提交的任务会立即分配给系统中的节点,如果分配了所有节点,则将其置于待处理状态。
如果为任务分配的节点包括任何处于某个POWER_SAVING
状态的节点,则该作业以CF
、或CONFIGURING
状态开头。此时,作业会等待处于该状态的节点过渡到该POWER_SAVING
POWER_UP
状态并变为可用。
为任务分配的所有节点都可用后,该作业进入RUNNING
(R
) 状态。
默认情况下,所有作业都提交到默认队列(称为中的分区Slurm)。这由队列名称后的后*
缀表示。您可以使用-p
作业提交选项选择队列。
所有节点都配置了以下功能,这些功能可用于任务提交命令:
-
实例类型(例如
c5.xlarge
) -
节点类型(这是
dynamic
或static
。)
您可以使用以下命令查看特定节点的功能:
$
scontrol show nodes
nodename
在退货中,检查AvailableFeatures
清单。
以集群的初始状态为例,您可以通过运行sinfo
命令来查看该状态。
$
sinfo
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST efa up infinite 4 idle~ efa-dy-efacompute1-[1-4] efa up infinite 1 idle efa-st-efacompute1-1 gpu up infinite 10 idle~ gpu-dy-gpucompute1-[1-10] ondemand up infinite 20 idle~ ondemand-dy-ondemandcompute1-[1-10],ondemand-dy-ondemandcompute2-[1-10] spot* up infinite 13 idle~ spot-dy-spotcompute1-[1-10],spot-dy-spotcompute2-[1-3] spot* up infinite 2 idle spot-st-spotcompute2-[1-2]
请考虑spot
这是最佳队列。它由后*
缀表示。
向默认队列中的一个静态节点提交任务 (spot
)。
$
sbatch --wrap
"sleep 300"
-N1
-Cstatic
向EFA
队列中的一个动态节点提交任务。
$
sbatch --wrap
"sleep 300"
-pefa
-Cdynamic
向ondemand
队列中的八 (8) 个c5.2xlarge
节点和两 (2) 个t2.xlarge
节点提交任务。
$
sbatch --wrap
"sleep 300"
-pondemand
-N10
-C "[c5.2xlarge*8&t2.xlarge*2
]"
向gpu
队列中的一个 GPU 节点提交任务。
$
sbatch --wrap
"sleep 300"
-pgpu
-G1
使用squeue
命令考虑作业的状态。
$
squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 12 ondemand wrap ubuntu CF 0:36 10 ondemand-dy-ondemandcompute1-[1-8],ondemand-dy-ondemandcompute2-[1-2] 13 gpu wrap ubuntu CF 0:05 1 gpu-dy-gpucompute1-1 7 spot wrap ubuntu R 2:48 1 spot-st-spotcompute2-1 8 efa wrap ubuntu R 0:39 1 efa-dy-efacompute1-1
作业 7 和 8(在spot
和efa
队列中)已经在运行 (R
)。作业 12 和 13 仍在配置 (CF
),可能正在等待实例可用。
# Nodes states corresponds to state of running jobs
$
sinfo
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST efa up infinite 3 idle~ efa-dy-efacompute1-[2-4] efa up infinite 1 mix efa-dy-efacompute1-1 efa up infinite 1 idle efa-st-efacompute1-1 gpu up infinite 1 mix~ gpu-dy-gpucompute1-1 gpu up infinite 9 idle~ gpu-dy-gpucompute1-[2-10] ondemand up infinite 10 mix# ondemand-dy-ondemandcompute1-[1-8],ondemand-dy-ondemandcompute2-[1-2] ondemand up infinite 10 idle~ ondemand-dy-ondemandcompute1-[9-10],ondemand-dy-ondemandcompute2-[3-10] spot* up infinite 13 idle~ spot-dy-spotcompute1-[1-10],spot-dy-spotcompute2-[1-3] spot* up infinite 1 mix spot-st-spotcompute2-1 spot* up infinite 1 idle spot-st-spotcompute2-2
节点状态和功能
在大多数情况下,节点状态完全由Amazon ParallelCluster本主题前面所述的云节点生命周期中的特定过程进行管理。
但是,Amazon ParallelCluster也可以替换或终止状态不佳的节点DOWN
以及DRAINED
后备实例运行状况不佳的节点。有关更多信息,请参阅clustermgtd:
分区状态
Amazon ParallelCluster支持以下分区状态。Slurm分区就是队列Amazon ParallelCluster。
-
UP
:表示分区处于活动状态。这是分区的默认状态。在此状态下,分区中的所有节点都处于活动状态并可供使用。 -
INACTIVE
:表示分区处于非活动状态。在此状态下,非活动分区的所有后备节点实例都将终止。不会为非活动分区中的节点启动新实例。
pcuster update-compute-fleet
-
停止计算舰队-执行以下命令时,所有分区都将转换为
INACTIVE
状态,Amazon ParallelCluster进程将分区保持INACTIVE
状态。$
pcluster update-compute-fleet --cluster-name
testSlurm
\ --regioneu-west-1
--status STOP_REQUESTED -
启动计算舰队-当执行以下命令时,所有分区最初都会过渡到该
UP
状态。但是,Amazon ParallelCluster进程不会使分区保持UP
状态。你需要手动更改分区状态。所有静态节点将在几分钟后可用。请注意,将分区设置为UP
不会增加任何动态容量。$
pcluster update-compute-fleet --cluster-name
testSlurm
\ --regioneu-west-1
--status START_REQUESTED
运行update-compute-fleet
时,您可以通过运行pcluster describe-compute-fleet
命令并检查来检查集群的状态Status
。以下列出了可能具有状态:
-
STOP_REQUESTED
:停止计算队列请求已发送到集群。 -
STOPPING
:该pcluster
进程当前正在停止计算队列。 -
STOPPED
:该pcluster
进程完成了停止过程,所有分区都处于INACTIVE
状态,所有计算实例都已终止。 -
START_REQUESTED
:启动计算队列请求已发送到集群。 -
STARTING
:该pcluster
进程当前正在启动集群。 -
RUNNING
:该pcluster
过程完成了启动过程,所有分区都处于UP
状态,静态节点在几分钟后可用。 -
PROTECTED
:此状态表明某些分区存在持续的引导失败。受影响的分区处于非活动状态。请调查问题然后运行update-compute-fleet
以重新启用舰队。
手动控制队列
在某些情况下,您可能需要对集群中的节点或队列(称为分区Slurm)进行一些手动控制。您可以使用scontrol
命令通过以下常见过程管理集群中的节点。
-
在
POWER_SAVING
状态下打开动态节点的电源su
以 root 用户身份运行该命令:$
scontrol update nodename=
nodename
state=power_up您也可以提交占位
sleep 1
任务,请求一定数量的节点,然后依靠它Slurm来启动所需数量的节点。 -
之前关闭动态节点的电源 ScaledownIdletime
我们建议您使用以下命令将动态节点设置
DOWN
为su
root 用户:$
scontrol update nodename=
nodename
state=down reason="manually draining"Amazon ParallelCluster自动终止并重置已关闭的动态节点。
一般情况下,我们建议您不要使用
scontrol update nodename=
命令nodename
state=power_downPOWER_DOWN
直接将节点设置为节点。这是因为Amazon ParallelCluster会自动处理断电过程。 -
禁用队列(分区)或停止特定分区中的所有静态节点
使用以下命令将特定队列设置
INACTIVE
为su
root 用户:$
scontrol update partition=
queuename
state=inactive这样做会终止分区中所有支持节点的实例。
-
启用队列(分区)
使用以下命令
UP
为su
根用户设置特定队列:$
scontrol update partition=
queuename
state=up
扩展行为和调整
以下是正常扩展工作流程示例:
-
调度器收到需要两个节点的任务。
-
调度器将两个节点转换为一种
POWER_UP
状态,并使用节点名称ResumeProgram
进行调用(例如queue1-dy-spotcompute1-[1-2]
)。 -
ResumeProgram
启动两个 EC2 实例并分配的私有 IP 地址和主机名queue1-dy-spotcompute1-[1-2]
,等待ResumeTimeout
(默认时间为 30 分钟),然后重置节点。 -
实例已配置好并加入集群。作业开始在实例上运行。
-
任务完成并停止运行。
-
配置结束
SuspendTime
后(设置为 ScaledownIdletime),调度程序将实例设置为POWER_SAVING
状态。然后,调度程序设置queue1-dy-spotcompute1-[1-2]
为POWER_DOWN
状态并使用节点名称SuspendProgram
进行调用。 -
SuspendProgram
为两个节点调用。节点保持POWER_DOWN
状态,例如,通过保持 aSuspendTimeout
(默认时间为 120 秒(2 分钟))。idle%
clustermgtd
检测到节点正在关闭电源后,它会终止后备实例。然后,它会过渡queue1-dy-spotcompute1-[1-2]
到空闲状态并重置私有 IP 地址和主机名,以便为future 工作做好开机准备。
如果出现问题并且由于某种原因无法启动特定节点的实例,则会发生以下情况:
-
调度器收到需要两个节点的任务。
-
调度器将两个云突发节点转换为
POWER_UP
状态,并ResumeProgram
使用节点名进行调用(例如queue1-dy-spotcompute1-[1-2]
)。 -
ResumeProgram
仅启动一 (1) 个 EC2 实例并进行配置queue1-dy-spotcompute1-1
,其中一 (1) 个实例无法启动。queue1-dy-spotcompute1-2
-
queue1-dy-spotcompute1-1
不受影响,到达该POWER_UP
州后上线。 -
queue1-dy-spotcompute1-2
过渡到POWER_DOWN
状态,并且由于Slurm检测到节点故障,作业会自动重新排队。 -
queue1-dy-spotcompute1-2
之后变为可用SuspendTimeout
(默认值为 120 秒(2 分钟))。同时,作业被重新排队,可以开始在另一个节点上运行。 -
重复上述过程,直到作业可以在可用节点上运行而不会出现故障。
如果需要,可以调整两个定时参数:
-
ResumeTimeout
(默认值为 30 分钟):ResumeTimeout
控制将节点过渡到关闭状态之前的Slurm等待时间。-
ResumeTimeout
如果你的安装前/安装后过程需要差不多那么长时间,那么扩展可能会很有用。 -
ResumeTimeout
也是出现问题时在替换或重置节点之前Amazon ParallelCluster等待的最长时间。如果在启动或设置期间发生任何错误,计算节点会自行终止。 Amazon ParallelCluster进程在检测到已终止的实例时替换节点。
-
-
SuspendTimeout
(默认值为 120 秒(2 分钟)):SuspendTimeout
控制节点重新放置到系统中并准备好再次使用的速度。-
更短
SuspendTimeout
意味着重置节点的速度更快,并且Slurm可以尝试更频繁地启动实例。 -
时间越长
SuspendTimeout
意味着重置失效节点的速度越慢。同时,Slurm尝试使用其他节点。如果超过几分钟,SuspendTimeout
则Slurm尝试循环遍历系统中的所有节点。对于大型系统(超过 1,000 个节点)来说,更长的时间SuspendTimeout
可能有助于减轻它在尝试频繁重新排队失败的作业Slurm时的stress。 -
请注意,
SuspendTimeout
这并不是指Amazon ParallelCluster等待终止节点的后备实例的时间。POWER_DOWN
节点的后备实例将立即终止。终止过程通常在几分钟内完成。但是,在这段时间内,节点保持POWER_DOWN
状态,无法供调度程序使用。
-
架构日志
以下列表包含密钥日志。与 Amazon Logs 一起使用的 CloudWatch 日志流名称的格式为
,其中 {hostname}
.{instance_id}
.{logIdentifier}
LogIdentifier
遵循日志名称。
-
ResumeProgram
:/var/log/parallelcluster/slurm_resume.log
(slurm_resume
) -
SuspendProgram
:/var/log/parallelcluster/slurm_suspend.log
(slurm_suspend
) -
clustermgtd
:/var/log/parallelcluster/clustermgtd.log
(clustermgtd
) -
computemgtd
:/var/log/parallelcluster/computemgtd.log
(computemgtd
) -
slurmctld
:/var/log/slurmctld.log
(slurmctld
) -
slurmd
:/var/log/slurmd.log
(slurmd
)
常见问题以及如何调试:
未能启动、启动或加入集群的节点
-
动态节点:
-
检查
ResumeProgram
日志以查看节点是否ResumeProgram
调用了该日志。如果不是,请检查slurmctld
日志以确定是否Slurm尝试调ResumeProgram
用该节点。请注意,权限不正确ResumeProgram
可能会导致它以静默方式失败。 -
如果调
ResumeProgram
用,请检查是否为该节点启动了实例。如果实例未启动,则应显示明确的错误消息,说明实例无法启动的原因。 -
如果启动了实例,则在引导过程中可能会出现一些问题。从
ResumeProgram
日志中找到相应的私有 IP 地址和实例 ID,然后在日志中查看特定实例的相应引导 CloudWatch 日志。
-
-
静态节点:
-
检查日
clustermgtd
志,查看是否为该节点启动了实例。如果实例未启动,则应该有关于实例无法启动的原因的明显错误。 -
如果启动了实例,则引导过程存在一些问题。从
clustermgtd
日志中找到相应的私有 IP 和实例 ID,然后在日志中查看特定实例的相应引导 CloudWatch 日志。
-
节点意外更换或终止,节点故障
-
节点意外被替换/终止:
-
在大多数情况下,
clustermgtd
处理所有节点维护操作。要检查节点是clustermgtd
替换还是终止,请检查日clustermgtd
志。 -
如果
clustermgtd
替换或终止了节点,则应显示一条消息,指明操作的原因。如果原因与调度程序相关(例如,节点是DOWN
),请查看slurmctld
日志以了解更多详细信息。如果原因与 EC2 相关,请使用 Amazon CloudWatch 或Amazon EC2 控制台、CLI 或 SDK 等工具来检查该实例的状态或日志。例如,您可以检查实例是否有预定事件或 EC2 运行状况检查失败。 -
如果
clustermgtd
没有终止节点,请检查是否computemgtd
终止了该节点,或者 EC2 是否终止了该实例以收回竞价型实例。
-
-
节点故障:
-
在大多数情况下,如果节点出现故障,作业会自动重新排队。查看
slurmctld
日志以了解任务或节点失败的原因,然后从那里评估情况。
-
更换或终止实例时失败,关闭节点电源时失败
-
通常,会
clustermgtd
处理所有预期的实例终止操作。查看clustermgtd
日志,看看为什么它未能替换或终止节点。 -
对于动态节点失败 ScaledownIdletime,请查看
SuspendProgram
日志以查看slurmctld
进程是否使用特定节点作为参数进行调用。Note 实际上SuspendProgram
并未执行任何特定操作。相反,它只在被调用时记录。所有实例终止和NodeAddr
重置均由完成clustermgtd
。 Slurm将节点过渡到IDLE
之后SuspendTimeout
。
其他问题:
-
Amazon ParallelCluster不做出工作分配或扩大规模的决定。它仅尝试根据指示启动、终止和维护资源。Slurm
有关任务分配、节点分配和扩展决策的问题,请查看
slurmctld
日志中是否存在错误。