Slurm快速入门用户指南

打印 上一主题 下一主题

主题 862|帖子 862|积分 2586

概述

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 命令有许多选项,可让您以自己喜欢的格式轻松查看感爱好的信息。
  1. # sinfo
  2. PARTITION AVAIL  TIMELIMIT NODES  STATE NODELIST
  3. debug*       up      30:00     2  down* adev[1-2]
  4. debug*       up      30:00     3   idle adev[3-5]
  5. batch        up      30:00     3  down* adev[6,13,15]
  6. batch        up      30:00     3  alloc adev[7-8,14]
  7. batch        up      30:00     4   idle adev[9-12]
复制代码
接下来,我们利用 squeue 命令确定体系中存在哪些作业。ST 字段是作业状态。两个作业处于运行状态(R 是 Running 的缩写),一个作业处于待执行状态(PD 是 Pending 的缩写)。TIME 字段显示作业运行了多长时间,格式为天-小时:分钟:秒。NODELIST(REASON)(原因)字段体现作业正在运行的位置或仍处于待处理惩罚状态的原因。待处理惩罚作业的典型原因是资源(等候可用资源)和优先级(排在优先级更高的作业后面)。squeue 命令有许多选项,可让您以自己喜欢的格式轻松查看感爱好的信息。
  1. # squeue
  2. JOBID PARTITION  NAME  USER ST  TIME NODES NODELIST(REASON)
  3. 65646     batch  chem  mike  R 24:19     2 adev[7-8]
  4. 65647     batch   bio  joan  R  0:09     1 adev14
  5. 65648     batch  math  phil PD  0:00     6 (Resources)
复制代码
scontrol 命令可用于报告有关节点、分区、作业、作业步骤和设置的更详细信息。体系管理员也可以用它来更改设置。下面是几个示例。更多信息,请参阅手册页面。
  1. adev0: scontrol show partition
  2. PartitionName=debug TotalNodes=5 TotalCPUs=40 RootOnly=NO
  3.    Default=YES OverSubscribe=FORCE:4 PriorityTier=1 State=UP
  4.    MaxTime=00:30:00 Hidden=NO
  5.    MinNodes=1 MaxNodes=26 DisableRootJobs=NO AllowGroups=ALL
  6.    Nodes=adev[1-5] NodeIndices=0-4
  7. PartitionName=batch TotalNodes=10 TotalCPUs=80 RootOnly=NO
  8.    Default=NO OverSubscribe=FORCE:4 PriorityTier=1 State=UP
  9.    MaxTime=16:00:00 Hidden=NO
  10.    MinNodes=1 MaxNodes=26 DisableRootJobs=NO AllowGroups=ALL
  11.    Nodes=adev[6-15] NodeIndices=5-14
  12. adev0: scontrol show node adev1
  13. NodeName=adev1 State=DOWN* CPUs=8 AllocCPUs=0
  14.    RealMemory=4000 TmpDisk=0
  15.    Sockets=2 Cores=4 Threads=1 Weight=1 Features=intel
  16.    Reason=Not responding [slurm@06/02-14:01:24]
  17. 65648     batch  math  phil PD  0:00     6 (Resources)
  18. adev0: scontrol show job
  19. JobId=65672 UserId=phil(5136) GroupId=phil(5136)
  20.    Name=math
  21.    Priority=4294901603 Partition=batch BatchFlag=1
  22.    AllocNode:Sid=adev0:16726 TimeLimit=00:10:00 ExitCode=0:0
  23.    StartTime=06/02-15:27:11 EndTime=06/02-15:37:11
  24.    JobState=PENDING NodeList=(null) NodeListIndices=
  25.    NumCPUs=24 ReqNodes=1 ReqS:C:T=1-65535:1-65535:1-65535
  26.    OverSubscribe=1 Contiguous=0 CPUs/task=0 Licenses=(null)
  27.    MinCPUs=1 MinSockets=1 MinCores=1 MinThreads=1
  28.    MinMemory=0 MinTmpDisk=0 Features=(null)
  29.    Dependency=(null) Account=(null) Requeue=1
  30.    Reason=None Network=(null)
  31.    ReqNodeList=(null) ReqNodeListIndices=
  32.    ExcNodeList=(null) ExcNodeListIndices=
  33.    SubmitTime=06/02-15:27:11 SuspendTime=None PreSusTime=0
  34.    Command=/home/phil/math
  35.    WorkDir=/home/phil
复制代码
利用 srun 命令,可以在单行命令行中为作业步骤创建资源分配并启动任务。根据所利用的 MPI 实现,MPI 作业也可以用这种方式启动。有关 MPI 的详细信息,请参阅 MPI 部门。在本例中,我们在三个节点上执行 /bin/hostname (-N3),并在输出中包含任务编号 (-l)。将利用默认分区。每个节点默认利用一个任务。请留意,srun 命令有许多可用选项,可用于控制分配了哪些资源以及任务如安在这些资源上分配。
  1. adev0: srun -N3 -l /bin/hostname
  2. 0: adev3
  3. 1: adev4
  4. 2: adev5
复制代码
与上一示例差别的是,该示例将 /bin/hostname 分四个任务执行 (-n4)。每个任务默认利用一个处理惩罚器(留意我们没有指定节点数)。
  1. adev0: srun -n4 -l /bin/hostname
  2. 0: adev3
  3. 1: adev3
  4. 2: adev3
  5. 3: adev3
复制代码
一种常见的操作模式是提交脚本供稍后执行。在本例中,脚本名称为 my.script,我们明白利用了 adev9 和 adev10 节点(-w “adev[9-10]”,留意节点范围表达式的利用)。我们还明白指出,随后的作业步骤将分别产生四个任务,这将确保我们的分配至少包含四个处理惩罚器(每个要启动的任务包含一个处理惩罚器)。输出将显示在 my.stdout 文件中(“-o my.stdout”)。该脚本自己包含一个任务时限。还可以根据需要提供其他选项,方法是在脚本开头(在脚本中要执行的任何命令之前)利用前缀 “#SBATCH”,并在厥后跟上选项。命令行中提供的选项将覆盖脚本中指定的任何选项。请留意,my.script 包含在分配的第一个节点(脚本运行的节点)上执行的 /bin/hostname 命令,以及利用 srun 命令启动并按顺序执行的两个作业步骤。
  1. adev0: cat my.script
  2. #!/bin/sh
  3. #SBATCH --time=1
  4. /bin/hostname
  5. srun -l /bin/hostname
  6. srun -l /bin/pwd
  7. adev0: sbatch -n4 -w "adev[9-10]" -o my.stdout my.script
  8. sbatch: Submitted batch job 469
  9. adev0: cat my.stdout
  10. adev9
  11. 0: adev9
  12. 1: adev9
  13. 2: adev10
  14. 3: adev10
  15. 0: /home/jette
  16. 1: /home/jette
  17. 2: /home/jette
  18. 3: /home/jette
复制代码
最后一种操作模式是创建资源分配,并在分配中天生作业步骤。salloc 命令用于创建资源分配,通常会在分配区内启动一个 shell。通常会利用 srun 命令启动任务,在分配区内执行一个或多个作业步骤(根据所利用的 MPI 类型,启动机制大概有所差别,请参阅下文的 MPI 详情)。最后,将利用 exit 命令终止由 salloc 创建的 shell。Slurm 不会自动将可执行文件或数据文件迁移到分配给任务的节点上。文件必须存在于当地磁盘或某个全局文件体系(如 NFS 或 Lustre)中。我们提供的工具 sbcast 可利用 Slurm 的分层通信将文件传输到已分配节点的当地存储中。在本例中,我们利用 sbcast 将可执行程序 a.out 传输到已分配节点当地存储上的 /tmp/joe.a.out。执行程序后,我们将其从当地存储中删除:
  1. tux0: salloc -N1024 bash
  2. $ sbcast a.out /tmp/joe.a.out
  3. Granted job allocation 471
  4. $ srun /tmp/joe.a.out
  5. Result is 3.14159
  6. $ srun rm /tmp/joe.a.out
  7. $ exit
  8. salloc: Relinquishing job allocation 471
复制代码
在这个示例中,我们提交一个批处理惩罚作业,获取其状态并取消它。
  1. adev0: sbatch test
  2. srun: jobid 473 submitted
  3. adev0: squeue
  4. JOBID PARTITION NAME USER ST TIME  NODES NODELIST(REASON)
  5.   473 batch     test jill R  00:00 1     adev9
  6. adev0: scancel 473
  7. adev0: squeue
  8. JOBID PARTITION NAME USER ST TIME  NODES NODELIST(REASON)
复制代码
参考资料

最佳实践,大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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

天津储鑫盛钢材现货供应商

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表