概述
Slurm 是一个开源、容错、高度可扩展的集群管理和作业调度系统,适用于大型和小型 Linux 集群。Slurm 的运行无需修改内核,而且相对独立。作为集群工作负载管理器,Slurm 有三个主要功能。首先,它为用户分配一定时间内对资源(计算节点)的独占和/或非独占访问权限,以便用户执行工作。其次,它为在所分配的节点上启动、执行和监控工作(通常是并行作业)提供了框架。最后,它通过管理待处理工作队列来仲裁对资源的争用。
架构
Slurm 由运行在每个计算节点上的 slurmd 守护进程和运行在管理节点上的中央 slurmctld 守护进程(可选故障转移双子节点)组成。slurmd 守护进程提供容错分级通信。用户命令包括:sacct、sacctmgr、salloc、sattach、sbatch、sbcast、scancel、scontrol、scrontab、sdiag、sh5util、sinfo、sprio、squeue、sreport、srun、sshare、sstat、strigger 和 sview。所有命令都可以在集群中的任何位置运行。
由这些 Slurm 守护进程管理的实体包括节点(Slurm 中的计算资源)、分区(将节点分组为逻辑集(可能相互重叠))、作业(在指定时间内分配给用户的资源分配)和作业步骤(作业中的任务集(可能并行))。分区可视为作业队列,每个队列都有各种限制,如作业大小限制、作业时间限制、允许使用的用户等。按优先级排序的作业会在分区内分配节点,直到分区内的资源(节点、处理器、内存等)耗尽为止。一旦作业被分配到一组节点,用户就可以在分配范围内以作业步骤的形式启动并行工作。例如,可以启动一个作业步骤,利用分配给该作业的所有节点,也可以启动多个作业步骤,独立使用分配的部分节点。
命令
所有 Slurm 守护进程、命令和 API 函数都有手册。命令选项 --help 还提供了选项的简要摘要。请注意,命令选项都区分大小写。
- sacct 用于报告活动或已完成作业的作业或作业步骤计费信息。
- salloc 用于实时为作业分配资源。通常用于分配资源和生成 shell。然后使用 shell 执行 srun 命令来启动并行任务。
- sattach 用于为当前运行的作业或作业步骤附加标准输入、输出、错误和信号功能。可以多次附加到作业或从作业中分离。
- sbatch 用于提交作业脚本供稍后执行。脚本通常包含一条或多条 srun 命令,用于启动并行任务。
- sbcast 用于将文件从本地磁盘传输到分配给作业的节点上的本地磁盘。这可用于有效使用无磁盘计算节点,或提高共享文件系统的性能。
- scancel 用于取消待处理或正在运行的作业或作业步骤。它还可用于向与正在运行的作业或作业步骤相关的所有进程发送任意信号。
- scontrol 是用于查看和/或修改 Slurm 状态的管理工具。请注意,许多 scontrol 命令只能以 root 用户身份执行。
- sinfo 报告由 Slurm 管理的分区和节点的状态。它有多种过滤、排序和格式化选项。
- sprio 用于显示影响作业优先级的组件的详细视图。
- squeue 报告作业或作业步骤的状态。它有多种过滤、排序和格式化选项。默认情况下,它按优先级顺序报告正在运行的作业,然后按优先级顺序报告待处理的作业。
- srun 有多种选项可用于指定资源需求,包括:最小和最大节点数、处理器数、使用或不使用的特定节点,以及特定的节点特性(如内存、磁盘空间、某些必要功能等)。一个作业可包含多个作业步骤,这些步骤可在作业节点分配范围内的独立或共享资源上顺序或并行执行。
- sshare 显示有关集群公平分配使用情况的详细信息。请注意,只有在使用 priority/multifactor 插件时才可行。
- sstat 用于获取正在运行的作业或作业步骤所使用资源的信息。
- strigger 用于设置、获取或查看事件触发器。事件触发器包括节点宕机或作业接近时间限制等。
- sview 是一个图形用户界面,用于获取和更新 Slurm 管理的作业、分区和节点的状态信息。
示例
首先,我们要确定系统上有哪些分区、它们包括哪些节点以及系统的一般状态。这些信息由 sinfo 命令提供。在下面的示例中,我们发现有两个分区:debug 和 batch。debug 后面的 * 表示这是提交作业的默认分区。我们看到两个分区都处于 UP 状态。某些配置可能包括用于大型作业的分区,这些分区除周末或晚上外都处于 DOWN 状态。每个分区的信息可能会被分成多行,以便识别处于不同状态的节点。在本例中,两个节点 adev[1-2] 处于停机状态。状态 down 后面的 * 表示节点没有响应。请注意,节点名称说明使用了简洁的表达式,前缀为常用的 adev,并标明了数字范围或具体数字。这种格式便于管理大型集群。sinfo 命令有许多选项,可让您以自己喜欢的格式轻松查看感兴趣的信息。
# sinfo
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
debug* up 30:00 2 down* adev[1-2]
debug* up 30:00 3 idle adev[3-5]
batch up 30:00 3 down* adev[6,13,15]
batch up 30:00 3 alloc adev[7-8,14]
batch up 30:00 4 idle adev[9-12]
接下来,我们使用 squeue 命令确定系统中存在哪些作业。ST 字段是作业状态。两个作业处于运行状态(R 是 Running 的缩写),一个作业处于待执行状态(PD 是 Pending 的缩写)。TIME 字段显示作业运行了多长时间,格式为天-小时:分钟:秒。NODELIST(REASON)(原因)字段表示作业正在运行的位置或仍处于待处理状态的原因。待处理作业的典型原因是资源(等待可用资源)和优先级(排在优先级更高的作业后面)。squeue 命令有许多选项,可让您以自己喜欢的格式轻松查看感兴趣的信息。
# squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
65646 batch chem mike R 24:19 2 adev[7-8]
65647 batch bio joan R 0:09 1 adev14
65648 batch math phil PD 0:00 6 (Resources)
scontrol 命令可用于报告有关节点、分区、作业、作业步骤和配置的更详细信息。系统管理员也可以用它来更改配置。下面是几个示例。更多信息,请参阅手册页面。
adev0: scontrol show partition
PartitionName=debug TotalNodes=5 TotalCPUs=40 RootOnly=NO
Default=YES OverSubscribe=FORCE:4 PriorityTier=1 State=UP
MaxTime=00:30:00 Hidden=NO
MinNodes=1 MaxNodes=26 DisableRootJobs=NO AllowGroups=ALL
Nodes=adev[1-5] NodeIndices=0-4
PartitionName=batch TotalNodes=10 TotalCPUs=80 RootOnly=NO
Default=NO OverSubscribe=FORCE:4 PriorityTier=1 State=UP
MaxTime=16:00:00 Hidden=NO
MinNodes=1 MaxNodes=26 DisableRootJobs=NO AllowGroups=ALL
Nodes=adev[6-15] NodeIndices=5-14
adev0: scontrol show node adev1
NodeName=adev1 State=DOWN* CPUs=8 AllocCPUs=0
RealMemory=4000 TmpDisk=0
Sockets=2 Cores=4 Threads=1 Weight=1 Features=intel
Reason=Not responding [slurm@06/02-14:01:24]
65648 batch math phil PD 0:00 6 (Resources)
adev0: scontrol show job
JobId=65672 UserId=phil(5136) GroupId=phil(5136)
Name=math
Priority=4294901603 Partition=batch BatchFlag=1
AllocNode:Sid=adev0:16726 TimeLimit=00:10:00 ExitCode=0:0
StartTime=06/02-15:27:11 EndTime=06/02-15:37:11
JobState=PENDING NodeList=(null) NodeListIndices=
NumCPUs=24 ReqNodes=1 ReqS:C:T=1-65535:1-65535:1-65535
OverSubscribe=1 Contiguous=0 CPUs/task=0 Licenses=(null)
MinCPUs=1 MinSockets=1 MinCores=1 MinThreads=1
MinMemory=0 MinTmpDisk=0 Features=(null)
Dependency=(null) Account=(null) Requeue=1
Reason=None Network=(null)
ReqNodeList=(null) ReqNodeListIndices=
ExcNodeList=(null) ExcNodeListIndices=
SubmitTime=06/02-15:27:11 SuspendTime=None PreSusTime=0
Command=/home/phil/math
WorkDir=/home/phil
使用 srun 命令,可以在单行命令行中为作业步骤创建资源分配并启动任务。根据所使用的 MPI 实现,MPI 作业也可以用这种方式启动。有关 MPI 的详细信息,请参阅 MPI 部分。在本例中,我们在三个节点上执行 /bin/hostname (-N3),并在输出中包含任务编号 (-l)。将使用默认分区。每个节点默认使用一个任务。请注意,srun 命令有许多可用选项,可用于控制分配了哪些资源以及任务如何在这些资源上分配。
adev0: srun -N3 -l /bin/hostname
0: adev3
1: adev4
2: adev5
与上一示例不同的是,该示例将 /bin/hostname 分四个任务执行 (-n4)。每个任务默认使用一个处理器(注意我们没有指定节点数)。
adev0: srun -n4 -l /bin/hostname
0: adev3
1: adev3
2: adev3
3: adev3
一种常见的操作模式是提交脚本供稍后执行。在本例中,脚本名称为 my.script,我们明确使用了 adev9 和 adev10 节点(-w “adev[9-10]”,注意节点范围表达式的使用)。我们还明确指出,随后的作业步骤将分别产生四个任务,这将确保我们的分配至少包含四个处理器(每个要启动的任务包含一个处理器)。输出将显示在 my.stdout 文件中(“-o my.stdout”)。该脚本本身包含一个任务时限。还可以根据需要提供其他选项,方法是在脚本开头(在脚本中要执行的任何命令之前)使用前缀 “#SBATCH”,并在其后跟上选项。命令行中提供的选项将覆盖脚本中指定的任何选项。请注意,my.script 包含在分配的第一个节点(脚本运行的节点)上执行的 /bin/hostname 命令,以及使用 srun 命令启动并按顺序执行的两个作业步骤。
adev0: cat my.script
#!/bin/sh
#SBATCH --time=1
/bin/hostname
srun -l /bin/hostname
srun -l /bin/pwd
adev0: sbatch -n4 -w "adev[9-10]" -o my.stdout my.script
sbatch: Submitted batch job 469
adev0: cat my.stdout
adev9
0: adev9
1: adev9
2: adev10
3: adev10
0: /home/jette
1: /home/jette
2: /home/jette
3: /home/jette
最后一种操作模式是创建资源分配,并在分配中生成作业步骤。salloc 命令用于创建资源分配,通常会在分配区内启动一个 shell。通常会使用 srun 命令启动任务,在分配区内执行一个或多个作业步骤(根据所使用的 MPI 类型,启动机制可能有所不同,请参阅下文的 MPI 详情)。最后,将使用 exit 命令终止由 salloc 创建的 shell。Slurm 不会自动将可执行文件或数据文件迁移到分配给任务的节点上。文件必须存在于本地磁盘或某个全局文件系统(如 NFS 或 Lustre)中。我们提供的工具 sbcast 可使用 Slurm 的分层通信将文件传输到已分配节点的本地存储中。在本例中,我们使用 sbcast 将可执行程序 a.out 传输到已分配节点本地存储上的 /tmp/joe.a.out。执行程序后,我们将其从本地存储中删除:
tux0: salloc -N1024 bash
$ sbcast a.out /tmp/joe.a.out
Granted job allocation 471
$ srun /tmp/joe.a.out
Result is 3.14159
$ srun rm /tmp/joe.a.out
$ exit
salloc: Relinquishing job allocation 471
在这个示例中,我们提交一个批处理作业,获取其状态并取消它。
adev0: sbatch test
srun: jobid 473 submitted
adev0: squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
473 batch test jill R 00:00 1 adev9
adev0: scancel 473
adev0: squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
参考资料
- 软件测试精品书籍文档下载持续更新 https://github.com/china-testing/python-testing-examples 请点赞,谢谢!
- 本文涉及的python测试开发库 谢谢点赞! https://github.com/china-testing/python_cn_resouce
- python精品书籍下载 https://github.com/china-testing/python_cn_resouce/blob/main/python_good_books.md
- Linux精品书籍下载 https://www.cnblogs.com/testing-/p/17438558.html
- https://slurm.schedmd.com/quickstart.html
最佳实践,大Job统计
出于性能和便于管理的考虑,可将相关工作放入具有多个作业步骤的单个 Slurm 作业中。每个 Slurm 作业都可以包含多个作业步骤,而且 Slurm 管理作业步骤的开销远低于单个作业的开销。
作业数组是管理具有相同资源需求的批处理作业集合的有效机制。大多数 Slurm 命令都可以将作业阵列作为单个元素(任务)或单个实体来管理(例如,在一条命令中删除整个作业阵列)。
MPI
MPI 的使用取决于所使用的 MPI 类型。这些不同的 MPI 实现使用三种基本不同的操作模式。
- Slurm 通过 PMI2 或 PMIx API 直接启动任务并执行通信初始化。(大多数现代 MPI 实现都支持这种模式)。
- Slurm 为作业创建资源分配,然后 mpirun 使用 Slurm 的基础架构(旧版本的 OpenMPI)启动任务。
- Slurm 为作业创建资源分配,然后 mpirun 使用 Slurm 以外的机制(如 SSH 或 RSH)启动任务。这些任务的启动不受 Slurm 的监控。应配置 Slurm 的后记,以便在放弃作业分配时清除这些任务。同时强烈建议使用 pam_slurm_adopt。
下面提供了将多种 MPI 与 Slurm 结合使用的说明链接。
- Intel MPI
- MPICH2
- MVAPICH2
- Open MPI