Slurm集群管理系统
Slurm(Simple Linux Utility for Resource Management,https://slurm.schedmd.com/)是一个开源的、容错的、高度可扩展的集群管理和作业调度系统,适用于大型和小型高性能计算(HPC)集群。计算系统可利用Slurm对资源和作业进行管理,以避免相互干扰,提高运行效率。所有需运行的作业,无论是用于程序调试还是业务计算,都可以通过交互式并行 srun
、批处理式 sbatch
或分配式 salloc
等命令提交,提交后可以利用相关命令查询作业状态等。作为一个集群工作负载管理器,Slurm有三个关键功能。
-
将资源(计算节点)的排他或非排他访问权分配给用户,让他们在一定的时间内执行作业。 -
提供了一个框架,用于启动、执行和监控所分配节点上的工作(通常是一个平行作业)。 -
通过管理一个待处理作业的队列来仲裁对资源的争夺。
扫码关注微信公众号【生信F3】获取文章完整信息,分享生物信息学最新知识。
术语
-
节点
Hea Node:头节点、管理节点、控制节点,运行slurmctld管理服务的节点。
Compute Node:计算节点,运行作业计算任务的节点,需运行slurmd服务。
Login Node:用户登录节点,用于用户登录的节点,注意不要在登陆节点执行复杂任务。
SlurmDBD Node:SlurmDBD节点、SlurmDBD数据库节点,存储调度策略、记账和作业等信息的节点,需运行slurmdbd服务。
客户节点:含计算节点和用户登录节点。
-
用户
account:账户,一个账户可以含有多个用户。
user:用户,多个用户可以共享一个账户。
bank account:银行账户,对应机时费等。
-
资源
GRES:Generic Resource,通用资源。
TRES:Trackable RESources,可追踪资源。
QOS:Quality of Service,服务质量,作业优先级。
association:关联。可利用其实现,如用户的关联不在数据库中,这将阻止用户运行作业。该选项可以阻止用户访问无效账户。
Partition:队列、分区。用于对计算节点、作业并行规模、作业时长、用户等进行分组管理,以合理分配资源。不同的节点的特性和硬件属性不同,设置分区可以帮助用户更好确定节点的特点,进而选择最适合自己的节点进行运算。此外,如果集群中部分机器是私有的,那么设置分区可以使得只有部分用户能在这个分区提交作业。总的来说,分区(Partition)可看做 一系列节点的集合。
Slurm架构
Slurm由一个运行在每个计算节点上的slurmd守护进程(Slurm Daemon)和一个运行在管理节点上的中央slurmctld守护进程(Slurm Central Daemon)组成。各计算节点需启动slurmd守护进程,以便被作为远程shell使用:等待作业、执行作业、返回状态、再等待更多作业。
slurmdbd数据库守护进程(Slurm DataBase Daemon)可以将多个slurm管理的集群的记账信息记录在同一个数据库中。用户工具包含:
-
srun
运行作业; -
scancel
终止排队中或运行中的作业; -
sinfo
查看系统状态; -
squeue
查看作业状态; -
sacct
查看运行中或结束了的作业及作业步信息等命令。 -
sview
命令可以图形化显示系统和作业状态(可含有网络拓扑)。 -
scontrol
作为管理工具,可以监控、修改集群的配置和状态信息等。
由 Slurm守护进程(Slurmd)管理的实体包括:
-
节点(node),Slurm中的计算资源; -
分区(partition),将节点分组为逻辑(可能是重叠的)集合。 -
作业(job),在特定时间内分配给一个用户的资源分配; -
作业步骤(job step),一个作业中的一组(可能是平行的)任务。
分区可以被认为是作业队列,每个队列都有各种各样的约束,如作业大小限制、作业时间限制、允许使用的用户等。按优先级排序的作业在一个分区内被分配节点,直到该分区内的资源(节点、处理器、内存等)被用完。一旦作业被分配到一组节点,用户就能在分配范围内以作业步骤的形式启动并行工作。例如,可以利用分配给作业的所有节点启动一个作业步骤,或者几个作业步骤可以相互独立的使用分配给作业的节点。
Slurm用法
作业提交(Job Submission)
交互式作业任务 srun
srun
用于在Slurm管理的集群上提交并行作业任务。一般情况下,srun将首先创建一个资源分配(jobid),后在其中运行并行作业。srun 有多种选项来指定资源要求,包括:最小和最大的节点数、处理器数、使用或不使用的特定节点,以及特定的节点特性(内存、磁盘空间、某些需要的功能等)。一个作业可以包含多个作业步骤,在作业的节点分配范围内的独立或共享资源上顺序或平行执行。
# 请求在all分区上使用1个线程1G内存执行sh脚本
srun -p all -c 1 --mem 1G sh sleep_1.sh
# 请求在all分区上使用1个线程1G内存执行sleep命令
srun -p all -c 1 sleep 5s
参数详解:
-p, --partition=<name>
指定分区
-c, --cpus-per-task
请求为每个进程分配的 cpu 核数。
批处理提交任务 sbatch
sbatch
用于向集群提交一个批处理脚本。批处理脚本可以通过命令行上的文件名提供给sbatch,如果没有指定文件名,sbatch将从标准输入读入脚本。在将脚本成功转移到Slurm控制器并为其分配Slurm作业ID后,sbatch将立即退出。批处理脚本不一定会立即获得资源,在所需资源可用之前,它可能会在待处理作业队列中等待一段时间。这种方式类似于通过将 srun 指令压入后台执行:
$ sbatch myscript.sh
# 类似于
$ nohup srun -p partition1 sh myscript.sh &
默认情况下,标准输出和标准错误都被定向到名为“slurm-%j”的文件中。,其中“%j”被替换为作业分配号。sbatch 成功时返回 0,失败时返回错误代码。
通常来说,一个sbatch作业脚本分为3个部分:
-
#!/bin/bash
第一行是脚本语言解释器的路径,一般选择bash
作为解释器; -
(可省略)以
#SBATCH
引导的 Slurm 设置选项; -
要运行的命令。
注意,我们应当把所有的 #SBATCH
开头的行放在一起,同时放在脚本的顶部。必须在所有的 #SBATCH
行结束之后才能写 bash code 和变量设置,一个典型的任务提交脚本如下:
#!/bin/sh
#SBATCH --time=1
srun hostname |sort
将该脚本投递到4个计算节点上执行:
$ sbatch -N4 myscript
salloc: Granted job allocation 65537
$ cat slurm-65537.out
host1
host2
host3
host4
常用设置选项如下:
#SBATCH -J, --job-name=<name> # 指定作业名
#SBATCH -n, --ntasks=<count> # Number of tasks to be launched
#SBATCH -N<minnodes[-maxnodes]> # 指定节点数
#SBATCH -p, --partition=<name> # 指定分区
#SBATCH --mem=<MB> # 指定单个或多个核心可用的整个内存池的大小
#SBATCH --time=minutes # 限定运行时间
#SBATCH -N<minnodes[-maxnodes]> # 请求节点数
#SBATCH -c, --cpus-per-task=<ncpus> # number of cpus required per task
#SBATCH -o, --output=<filename> # 指定用于批处理脚本标准输出的文件
#SBATCH -e, --error=<filename> # 指定用于批处理脚本标准错误输出的文件
作业管理(Job Management)
Slurm 提供了丰富的追踪任务的命令,这些命令有助于查看正在运行或已完成的任务状态。当用户认为任务异常时,可使用这些工具来追踪任务的信息。
sinfo
查询计算节点和分区状态
其中 STATE 常见的有
-
alloc
,节点已经被分配给作业任务 -
down
,节点当前不可用 -
drain
,节点被管理员设置为退出服务 -
idle
,节点当前空闲 -
mix
,节点有部分计算资源已被分配,还有部分资源空闲可用
squeue
报告作业或作业步骤的状态。它有各种各样的过滤、排序和格式化选项。默认情况下,它按优先顺序报告正在运行的作业,然后按优先顺序报告待处理的作业。
squeue -u Username
squeue -p Partition
squeue -j JobIDs
squeue 显示的信息包括以下内容
-
JobID
,作业编号 -
PARTITION
,作业在哪个分区上运行 -
NAME
,作业名称,默认是作业脚本的名字 -
USER
,作业的所有者 -
ST
,作业当前状态,详见 Job State Codes,常见的有-
CG
作业正在完成 -
F
作业失败 -
PD
作业正在等待分配资源 -
R
作业正在运行
-
-
TIME
,作业已运行时间 -
NODES
,作业占用的计算节点数 -
NODELIST
,作业占用的计算节点名 -
(REASON)
,作业正在等待执行的原因,详见 Job Reason Codes
显示的状态信息里包括了作业程序运行所在的计算节点名,使用 ssh 计算节点名
可以登录到计算节点。在计算节点上,使用 top
命令可以查看程序使用 CPU 的状况。
scancel
取消作业。先运行 squeue
命令查询作业编号数字 JobID ,然后运行以下命令取消作业:
scancel JOBID
scontrol
是用来查看和/或修改Slurm状态的管理工具。注意,许多 scontrol 命令只能以 root 身份执行。对于正在运行或排队的任务,可以使用
scontrol show job JobID
扫码关注微信公众号【生信F3】获取文章完整信息,分享生物信息学最新知识。
参考资料:
作业调度管理系统 http://docs.hpc.whu.edu.cn/files/whuhpcdocs.wiki/slurm_basic.html
Slurm资源管理与作业调度系统安装配置 http://hmli.ustc.edu.cn/doc/linux/slurm-install/slurm-install.html
SLURM 使用参考 https://bicmr.pku.edu.cn/~wenzw/pages/slurm.html
本文由 mdnice 多平台发布