关于程序员:快速入门Slurm资源管理与作业调度系统

7次阅读

共计 6736 个字符,预计需要花费 17 分钟才能阅读完成。

疾速入门:Slurm 资源管理与作业调度零碎

导读

本文将介绍 slurm,一个 Linux 服务器中的集群治理和作业调度零碎。并对其根底命令和运行形式进行实战演练。

1. 简介

Slurm(doc:Simple Linux Utility for Resource Management)是一个开源、容错和高度可扩大的集群治理和作业调度零碎,实用于大型和小型 Linux 集群。Slurm 的运行不须要内核批改,并且绝对独立。作为集群工作负载管理器,Slurm 具备三个要害性能。首先,它在一段时间内为用户调配对资源(计算节点)的独占和 / 或非独占拜访权限,以便他们能够执行工作。其次,它为在调配的节点集上启动、执行和监控工作(通常是并行工作)提供了一个框架。最初,它通过治理待处理工作队列来仲裁资源的争用。

2. 指标

  1. 让用户申请计算节点进行剖析(作业)
  2. 提供一个框架(命令)来启动、勾销和监控作业
  3. 跟踪所有作业,以确保每个人都能够无效地应用所有计算资源,而不会相互烦扰。

3. 命令

command Description
sbatch 向 SLURM 提交批处理脚本
squeue 列出以后正在运行或在队列中的所有作业
scancel 勾销提交的工作
sinfo 查看所有分区中节点的可用性
scontrol 查看特定节点的配置或无关作业的信息
sacct 显示所有作业的数据
salloc 预留交互节点

3.1. squeue

第一个 SLURM 命令是 squeue。它能够显示所有应用超级计算机的人提交给 SLURM 调度程序的所有作业的列表。此命令能够告诉您超级计算资源的忙碌水平以及您的作业是否正在运行。

  • 后果解读
Header column Definition
JOBID 该作业的 ID,通常是一个很大的数字
PARTITION 调配给给定作业的分区
NAME 用户为此作业提供给 SLURM 的名称
USER 提交作业的用户名
ST 作业状态,running(R), PenDing(PD)
NODES 申请的节点数
NODELIST(REASON) 作业在哪个节点上运行(或未运行的起因)
  • 依据用户名查看工作运行状况
squeue -u $USER  # 用户名

3.2. scancel

如果您提交作业并意识到因为某种原因须要勾销它,您将在 squeue 中应用带有上述 JOBID 的 scancel 命令

scancel 2867457

这会向 SLURM 调度发送信号以进行正在运行的作业或从 SLURM 队列中删除待处理的作业。

3.3. sbatch

sbatch 命令是最重要的命令,用于向超级计算集群提交作业。作业是在计算资源上运行的脚本。该脚本蕴含您要在超级计算节点上运行的命令。

sbatch slurm.batch.sh

一旦您编写了 SLURM 提交脚本,就超级容易应用。这是许多新用户卡住的局部,但它的确还不错。您只需将题目增加到其中蕴含您的命令的文本文件。

3.4. sinfo

有时可能很难取得一个节点并且您最终在 SLURM 队列中很长一段时间,或者您只是想在提交之前测试一个脚本并来到以确保它运行良好。找出可用节点的最简略办法是应用 sinfo 命令。

$ sinfo
PARTITION        AVAIL  TIMELIMIT  NODES  STATE NODELIST
debug               up    1:00:00      1  maint ceres19-compute-26
debug               up    1:00:00      1    mix ceres14-compute-4
debug               up    1:00:00      1   idle ceres19-compute-25
brief-low           up    2:00:00      2  maint ceres19-compute-[26,40]
brief-low           up    2:00:00      1  down* ceres19-compute-37
brief-low           up    2:00:00     59    mix ceres18-compute-[0-17,19-27],ceres19-compute-[0-5,7-9,12,21-24,35-36,38-39,41-42,44-45,47,55-63]
brief-low           up    2:00:00      4  alloc ceres18-compute-18,ceres19-compute-[6,28,43]
brief-low           up    2:00:00     26   idle ceres19-compute-[10-11,13-20,25,27,29-34,46,48-54]
mem768-low          up    2:00:00      3   idle ceres18-mem768-0,ceres19-mem768-[0-1]
mem-low             up    2:00:00      3    mix ceres18-mem-[0-1],ceres19-mem-1

SINFO提供以下信息

Header column Definition
PARTITION 一组节点
AVAIL 节点是否启动、敞开或处于其余状态
TIMELIMIT 用户能够申请给定分区中的节点的工夫量
NODES 给定分区中的节点数
STATE 保护、混合、闲暇、停机、调配
NODELIST 具备给定状态的节点名称

应用此信息,能够找到具备可用于作业的闲暇节点的分区。可怜的是,sinfo 自身有点凌乱,所以我创立了一个别名,将输入格式化为更易于浏览

sinfo -o "%20P %5D %14F %10m %11l %N"
PARTITION            NODES NODES(A/I/O/T) MEMORY     TIMELIMIT   NODELIST
debug                3     0/3/0/3        126000+    1:00:00     ceres14-compute-4,ceres19-compute-[25-26]
brief-low            92    33/58/1/92     381000     2:00:00     ceres18-compute-[0-27],ceres19-compute-[0-63]
priority-gpu         1     1/0/0/1        379000     14-00:00:00 ceres18-gpu-0
short*               100   51/48/1/100    126000+    2-00:00:00  ceres14-compute-[1-24,26-29,32-39,44-56,58-67],ceres18-compute-[24-27],ceres19-compute-[27-63]
medium               67    49/17/1/67     126000+    7-00:00:00  ceres14-compute-[26-29,32-39,44-56,58-67],ceres18-compute-[25-27],ceres19-compute-[35-63]
long                 34    31/3/0/34      126000+    21-00:00:00 ceres14-compute-[44-56,58-67],ceres18-compute-[26-27],ceres19-compute-[55-63]
mem                  8     3/4/1/8        1530000+   7-00:00:00  ceres14-mem-[0-3],ceres18-mem-2,ceres19-mem-[2-4]
mem768               1     0/1/0/1        763000     7-00:00:00  ceres18-mem768-1
huge                 1     1/0/0/1        4:16:1   3095104    14990      1-00:00:00  fat,AVX,AVX2,AVX novahuge001

3.5. scontrol

如果您须要查看特定节点的配置以确定该类型的节点是否足以进行剖析或诊断问题(如内存分段有余故障)。scontrol 可用于查找节点上的信息,例如 ceres14-compute-8

$ scontrol show nodes ceres14-compute-8

NodeName=ceres14-compute-8 Arch=x86_64 CoresPerSocket=10
   CPUAlloc=0 CPUTot=40 CPULoad=0.01
   AvailableFeatures=AVX
   ActiveFeatures=AVX
   Gres=(null)
   NodeAddr=ceres14-compute-8 NodeHostName=ceres14-compute-8 Version=19.05.5
   OS=Linux 3.10.0-1062.12.1.el7.x86_64 #1 SMP Tue Feb 4 23:02:59 UTC 2020
   RealMemory=126000 AllocMem=0 FreeMem=85536 Sockets=2 Boards=1
   State=IDLE ThreadsPerCore=2 TmpDisk=975 Weight=1 Owner=N/A MCS_label=N/A
   Partitions=short,geneious
   BootTime=2020-02-17T17:14:55 SlurmdStartTime=2020-02-18T17:12:06
   CfgTRES=cpu=40,mem=126000M,billing=40
   AllocTRES=
   CapWatts=n/a
   CurrentWatts=0 AveWatts=0
   ExtSensorsJoules=n/s ExtSensorsWatts=0 ExtSensorsTemp=n/s

有时,您想理解更多对于您刚刚运行或以后运行的作业的信息。

scontrol show job 2909617

JobId=2909617 JobName=bash
   UserId=remkv6(298590) GroupId=domain users(101) MCS_label=N/A
   Priority=84730 Nice=0 Account=gif QOS=gif
   JobState=RUNNING Reason=None Dependency=(null)
   Requeue=1 Restarts=0 BatchFlag=0 Reboot=0 ExitCode=0:0
   RunTime=06:58:38 TimeLimit=10:00:00 TimeMin=N/A
   SubmitTime=2020-05-18T07:29:05 EligibleTime=2020-05-18T07:29:05
   AccrueTime=Unknown
   StartTime=2020-05-18T07:29:05 EndTime=2020-05-18T17:29:05 Deadline=N/A
   SuspendTime=None SecsPreSuspend=0 LastSchedEval=2020-05-18T07:29:05
   Partition=long_1node192 AllocNode:Sid=nova:71501
   ReqNodeList=(null) ExcNodeList=(null)
   NodeList=nova027
   BatchHost=nova027
   NumNodes=1 NumCPUs=4 NumTasks=4 CPUs/Task=1 ReqB:S:C:T=0:0:*:*
   TRES=cpu=4,mem=20400M,node=1
   Socks/Node=* NtasksPerN:B:S:C=4:0:*:* CoreSpec=*
   MinCPUsNode=4 MinMemoryCPU=5100M MinTmpDiskNode=0
   Features=(null) DelayBoot=00:00:00
   OverSubscribe=OK Contiguous=0 Licenses=(null) Network=(null)
   Command=bash
   WorkDir=/work/gif/remkv6/Baum/04_DovetailSCNGenome/01_mikadoRerurn/01_BrakerFix/braker
   Comment=Time 600, Med priority, overdrawn
   Power=

提醒如果您将上面代码放在 SLURM 脚本的开端,它将在您的工作实现后将其输入到您的规范输入文件。

scontrol show job $SLURM_JOB_ID

3.6. sacct

此命令提供无关已提交作业的有用信息。

Column Description
JobID 作业编号
JobName 工作名称
Partition 它正在运行或排队期待 SLURM 队列的哪个分区
Account 它在哪个帐户 / 组上运行
AllocCPUS 调配 / 申请的 CPU 数量
State ExitCode 工作状态或退出代码

该命令自身只会为您提供无关您的工作的信息

sacct

# 增加 -a 参数将提供无关所有帐户的信息。sacct -a

# 上面的命令能够提供更多有用的列信息。sacct -a --format JobID,Partition,Timelimit,Start,Elapsed,NodeList%20,ExitCode,ReqMem,MaxRSS,MaxVMSize,AllocCPUS

3.7. salloc

也能够通过首先应用 salloc 在分区中保留一个节点来交互地运行作业脚本中的命令

# 上面的命令将在短分区中为 1 个节点提供 4 个 cpu,工夫为 00 小时:30 分钟:00 秒

$ salloc -N 1 -n 4 -p short -t 00:30:00

salloc: Pending job allocation 2935626
salloc: job 2935626 queued and waiting for resources
salloc: job 2935626 has been allocated resources
salloc: Granted job allocation 2935626
salloc: Waiting for resource configuration
salloc: Nodes ceres14-compute-48 are ready for job
export TMPDIR=/local/bgfs//2935626
export TMOUT=5400

4. Scripts

SLURM 脚本蕴含一个带有 SLURM SBATCH 正文 #SBATCH 的题目。这些正文通知 SLURM 以下信息。

  • 节点数
  • 所需的处理器或作业数量
  • 要应用的分区 / 队列类型(可选)
  • 内存要求(可选)
  • 想要运行作业的工夫长度(每个分区都有一个默认值)
  • 在哪里写入输入和谬误文件
  • 在 HPC 上运行时的作业名称
  • 获取工作状态的电子邮件 ID(可选)

这是最罕用的 #SBATCH 正文的表格阐明

SBATCH command Description
#SBATCH -N 1 预留单个节点
#SBATCH -n 4 作业步骤将启动最多 4 个作业
#SBATCH -p short 预留在短分区
#SBATCH -t 01:00:00 预留 01 时:00 分:00 秒
#SBATCH -J sleep 工作的名称是“睡眠”
#SBATCH -o sleep.o%j 将任何 std 输入写入名为 sleep.o%j 的文件,其中 %j 主动替换为 jobid
#SBATCH -e sleep.e%j 将任何 std 输入写入名为 sleep.e%j 的文件,其中 %j 主动替换为 jobid
#SBATCH –mail-user=[email protected] 通过此电子邮件地址告诉我
#SBATCH –mail-type=begin 工作开始时通过电子邮件告诉
#SBATCH –mail-type=end 工作完结时通过电子邮件告诉

5. script

当初您对 #SBATCH 正文有了更多理解,SLURM 作业脚本能够间接编写,蕴含两个组件:

  • 带有 #SBATCH 正文的 SLURM 标头定义了您须要的资源
  • 您要运行的命令

5.1. header

一旦你编写了这个,你能够通过依据你的须要批改 #SBATCH 正文来将它重用于你须要的其余脚本。

#!/bin/bash

# 上面以单个 `#SBATCH` 结尾的所有行都是 SLURM SBATCH 正文

#SBATCH -N 1
#SBATCH -n 4
#SBATCH -p short
#SBATCH -t 01:00:00
#SBATCH -J sleep
#SBATCH -o sleep.o%j
#SBATCH -e sleep.e%j
#SBATCH [email protected]
#SBATCH --mail-type=begin
#SBATCH --mail-type=end

cd $SLURM_SUBMIT_DIR # 此行将您更改为作业开始后提交脚本的目录

5.2. 命令

## 以下几行是要运行的命令

sleep 10 && echo "I slept for 10 seconds"

scontrol show job $SLURM_JOB_ID
## scontrol 是一个 slurm 命令,用于查看 slurm 配置或状态。查看您应用了多少资源。

5.3. 提交

sbatch slurm.batch.sh  # 提交命令

作业实现后会呈现以下文件

sleep.o2935316 # 这是规范输入,其中 2935316 是 JOBID
sleep.e2935316 # 这是规范谬误,其中 2935316 是 JOBID

本文由 mdnice 多平台公布

正文完
 0