Slurm快速入门-用户指南

Ms.Haoz大约 12 分钟

概述

Slurm 是一个开源、容错和高度可扩展的集群管理和作业调度系统,适用于大型和小型 Linux 集群。Slurm 的运行不需要内核修改,并且相对独立。作为集群工作负载管理器,Slurm 具有三个关键功能。首先,它在一段时间内为用户分配对资源(计算节点)的独占和/或非独占访问权限,以便他们可以执行工作。其次,它为在分配的节点集上启动、执行和监控工作(通常是并行工作)提供了一个框架。最后,它通过管理待处理工作队列来仲裁资源争用。

系统架构

Slurm 由在每个计算节点上运行的 slurmd 守护程序和在管理节点上运行的中央slurmctld守护程序(带有可选的故障转移孪生)组成。slurmd守护进程提供容错分层通信。

如图1所示,为Slurm组件:

Slurm组件
Slurm组件

Slurm用户命令包括:​​ sacct,sacctmgr,salloc,sattach,sbatch,sbcast,scancel,scontrol,scrontab,sdiag,sh5util,sinfo,sprio,squeue,sreport,srun,sshare,sstat, striggersview。所有命令都可以在集群中的任何位置运行。

如图 2 所示,为这些 Slurm 守护程序管理的实体,包括:节点、Slurm 中的计算资源、 分区(将节点分组为逻辑集(可能有重叠)、 作业或分配给用户的指定数量的资源)时间和 工作步骤,它们是作业中的一组任务(可能是并行的)。分区可以被认为是作业队列,每个队列都有各种各样的约束,例如:作业大小限制、作业时间限制、允许使用它的用户等。按优先级排序的作业被分配到分区内的节点,直到资源(节点、该分区内的处理器、内存等)已耗尽。一旦为作业分配了一组节点,用户就可以在分配中的任何配置中以作业步骤的形式启动并行工作。例如,可以启动一个单个作业步骤使用分配给该作业的所有节点,或者多个作业步骤可以只使用分配的一部分。

Slurm实体
Slurm实体

图2.Slurm实体

命令

所有 Slurm 守护程序、命令和 API 函数都存在 man page。命令选项--help还提供了选项的简短摘要。请注意,命令选项都区分大小写。

  • sacct 用于报告有关活动或已完成作业的作业或作业步骤记帐信息。
  • salloc 用于实时为作业分配资源。通常,这用于分配资源和生成 shell。然后使用 shell 执行 srun 命令来启动并行任务。
  • sattach 用于将标准输入、输出和错误以及信号功能附加到当前正在运行的作业或作业步骤。可以多次附加到作业和从作业分离。
  • sbatch 用于提交作业脚本以供以后执行。该脚本通常包含一个或多个 srun 命令来启动并行任务。
  • sbcast 用于将文件从本地磁盘传输到分配给作业的节点上的本地磁盘。这可用于有效使用无盘计算节点或提供相对于共享文件系统的改进性能。
  • scancel 用于取消挂起或正在运行的作业或作业步骤。它还可用于向与正在运行的作业或作业步骤关联的所有进程发送任意信号。
  • scontrol 是用于查看和/或修改 Slurm 状态的管理工具。请注意,许多scontrol 命令只能以 root 用户身份执行。
  • sinfo 报告 Slurm 管理的分区和节点的状态。它具有多种过滤、排序和格式化选项。
  • sprio 用于显示影响作业优先级的组件的详细视图。
  • squeue 报告作业或作业步骤的状态。它具有多种过滤、排序和格式化选项。默认情况下,它按优先级顺序报告正在运行的作业,然后按优先级顺序报告待处理的作业。
  • srun 用于实时提交作业以执行或启动作业步骤。 srun 有多种选项来指定资源要求,包括:最小和最大节点数、处理器数、要使用或不使用的特定节点以及特定节点特征(如此多的内存、磁盘空间、某些必需的功能等)。 一个作业可以包含多个作业步骤,在作业节点分配内的独立或共享资源上按顺序或并行执行。
  • sshare 显示有关集群上 fairshare 使用情况的详细信息。请注意,这仅在使用优先级/多因素插件时才可行。
  • sstat 用于获取有关正在运行的作业或作业步骤使用的资源的信息。
  • strigger 用于设置、获取或查看事件触发器。事件触发器包括诸如节点关闭或作业接近其时间限制之类的事情。
  • sview 是一个图形用户界面,用于获取和更新由 Slurm 管理的作业、分区和节点的状态信息。

例子

首先,我们确定系统上存在哪些分区、它们包含哪些节点以及一般系统状态。此信息由 sinfo 命令提供。在下面的示例中,我们发现有两个分区:调试 和批处理。名称 debug 后面的 * 表示这是提交作业的默认分区。我们看到两个分区都处于 UP状态。某些配置可能包括用于除周末或晚上以外的较大作业的分区。每个分区的信息可以分成多行,以便可以识别处于不同状态的节点。在这种情况下,两个节点 adev[1-2] 都下来了。状态 down 后的 * 表示节点没有响应。请注意节点名称规范的简洁表达式的使用,该表达式具有公共前缀 adev 和数字范围或标识的特定数字。这种格式允许轻松管理非常大的集群。sinfo命令有许多选项可以让您轻松地以您喜欢的任何格式查看您感兴趣的信息。有关更多信息,请参见 man page。

adev0: 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字段使用days-hours:minutes:seconds格式显示作业运行了多长时间。NODELIST (REASON)字段指示作业正在运行的位置或其仍处于挂起状态的原因。挂起作业的典型原因是资源(等待资源可用)和优先级 (排在优先级更高的作业后面)。squeue命令有许多选项可以让您轻松地以您喜欢的任何格式查看您感兴趣的信息。有关更多信息,请参见 man page。

adev0: 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命令可用于报告有关节点、分区、作业、作业步骤和配置的更详细信息。系统管理员也可以使用它来进行配置更改。下面显示了几个示例。有关更多信息,请参见 man page。

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部分。在此示例中,我们 在三个节点 ( -N3 ) 上执行/bin/hostname ,并在输出中包含任务编号 ( -l )。将使用默认分区。默认情况下,每个节点将使用一个任务。请注意,srun命令有许多选项可用于控制分配哪些资源以及如何在这些资源之间分配任务。

adev0: srun -N3 -l /bin/hostname
0: adev3
1: adev4
2: adev5

上一个示例的这种变体 在四个任务 ( -n4 )中执行/bin/hostname 。默认情况下,每个任务将使用一个处理器(请注意,我们没有指定节点数)。

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”前缀后跟选项(在脚本中要执行的任何命令之前)来提供其他选项。命令行上提供的选项将覆盖脚本中指定的任何选项。请注意,我的。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详细信息)。最后,由salloc创建的 shell将使用exit终止命令。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)

最佳实践,批量作业

出于性能原因和易于管理的考虑,考虑将相关工作放入具有多个作业步骤的单个 Slurm 作业中。每个 Slurm 作业可以包含多个作业步骤,并且在 Slurm 中管理多个作业步骤的开销远低于单个作业的开销。

Job arrays 是管理具有相同资源要求的批处理作业集合的有效机制。大多数 Slurm 命令可以将 Job arrays管理为单个元素(tasks)或单个实体(例如,在单个命令中删除整个 Job arrays)。

MPI

MPI 的使用取决于所使用的 MPI 的类型。这些不同的 MPI 实现使用三种根本不同的操作模式。

1、Slurm 直接启动任务并通过 PMI2 或 PMIx API 执行通信初始化。(大多数现代 MPI 实现都支持。) 2、Slurm 为作业创建资源分配,然后 mpirun 使用 Slurm 的基础架构(旧版本的 OpenMPI)启动任务。 3、Slurm 为作业创建资源分配,然后 mpirun 使用 Slurm 以外的某种机制(例如 SSH 或 RSH)启动任务。这些任务是在 Slurm 的监视或控制之外启动的。Slurm 的 Epilog 应配置为在放弃作业分配时清除这些任务。也强烈推荐使用 pam_slurm_adopt。

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.14.7

回到顶部