SLURM 作业调度系统
一、Slurm 简介/基本术语
Slurm简介
Slurm(Simple Linux Utility for Resource Management)是一个开源的分布式资源管理和作业调度软件,用于超级计算机和大中小型计算节点集群的管理,具有高度的扩展性和容错性。Slurm调度系统使用简单、功能强大、应用广泛,是HPC调度领域事实上的标准。
Slurm 利用分区(partition)对 CPU、内存、网络等资源进行分类,以便将不同需求的任务运行到不同规格的计算节点上。用户需利用 Slurm 命令将该任务及所需资源请求等提交到特定的分区中,等任务申请的资源得到满足后,任务才开始运行。任务运行受分区、账户、服务质量 (QOS)等限制。
Slurm 官方网站:Slurm Workload Manager - Documentation 在新窗口打开
更多详细命令请查看在此网页查看 Slurm Workload Manager - Man Pages 在新窗口打开
基本术语
user
:用户名,一般为系统登录名。account
:账户,记账账户,多个用户可以在同一个账户下,一般为用户所在的组,如task1。core
:CPU核,单颗CPU可以具有多颗CPU核。job
:作业。job step
:作业步,单个作业(job)可以有多个作业步。partition
:分区(可理解为LSF、PBS等作业调度系统中的队列)。作业需在特定分区中运行,一般不同分区允许的资源不一样,比如单作业核数等。qos
:服务质量(Quality of Service),可以理解为用户可使用的CPU、内存等资源限制。rank
:秩,如MPI进程号。tasks
:任务数,单个作业或作业步可有多个任务,一般一个任务需一个CPU核,可理解为所需的CPU核数。socket
:CPU插槽,可以简单理解为CPU。stdin
:标准输入文件,一般指可以通过屏幕输入或采用<文件名方式传递给程序的文件,对应C程序中的文件描述符0。stdout
:标准输出文件,程序运行正常时输出信息到的文件,一般指输出到屏幕的,并可采用文件名定向到的文件,对应C程序中的文件描述符1。stderr
:标准出错文件,程序运行出错时输出信息到的文件,一般指也输出到屏幕,并可采用2>定向到的文件(注意这里的2),对应C程序中的文件描述符2。<ENTITY>
:实体<SPECS>
:明细、规格
二、Slurm 常用命令
命令 | 功能介绍 | 常用命令例子 |
---|---|---|
sinfo |
显示分区和节点的状态 | sinfo |
squeue |
显示作业状态 | squene |
srun |
用于交互式作业提交 | srun -n 2 -p p1-c1-2 hostname |
sbatch |
用于批处理作业提交 | sbatch -n 2 job.sh |
salloc |
用于分配模式作业提交 | salloc -p p1-c1-2 |
scancel |
用于取消已提交的作业 | scancel JOBID |
scontrol |
用于查看和修改slurm配置和状态,包括查询节点信息或正在运行的作业信息 | scontrol show job JOBID |
查看集群状态 sinfo
其中PARTITION表示分区,NODES表示节点数,NODELIST为节点列表,STATE表示节点运行状态。常见节点状态:
alloc | idle | mix | down | drain |
---|---|---|---|---|
节点被分配给了job | 节点没有被分配给job,可用 | 部分占用 | 节点不可用 | 节点不接受新job |
sinfo的常用命令选项:
sinfo -N |
按每个节点一行的格式查看节点状态 |
---|---|
sinfo -p partition_name |
显示指定分区的信息 |
sinfo -n node_name |
查看指定节点状态 |
sinfo -V |
显示版本信息 |
sinfo --help |
查看帮助说明 |
查看作业信息 squeue
使用squeue 可以查看当前用户当前任务的运行状态
JOBID
:作业号
ST
:状态 (R:运行中;CF:配置中;PD:排队中)
如果 squeue 没有任务信息,说明任务已退出并且退出的时间已经超出清理时间。
squeue的常用命令选项:
squeue -j job_id |
根据指定的作业号查询作业信息 |
---|---|
squeue -p partition_name |
按分区查询作业 |
squeue -t state |
指定要查看的作业的状态 |
squeue -w nodelist |
指定要显示的作业的节点列表 |
squeue --start |
以启动时间升序显示等待的作业的预期开始时间和分配的资源 |
查看作业信息 scontrol
查看所有作业详细信息 scontrol show jobs
查看指定ID作业详情 scontrol show job [JOB_ID]
查看历史作业使用资源 seff
查看历史作业实际使用的CPU、内存等资源以及实际运行时长。 用户可以根据历史作业资源信息指定新作业的时间和内存,准确的时间可能让用户的作业得到回填调度,从而得以提前运行。
取消作业 scancel
三、三种模式提交作业
sbatch 批处理模式提交作业
简介
sbatch用于提交一个批处理作业脚本到Slurm。用户使用sbatch命令提交作业脚本,其基本格式为sbatch jobfile
。jobfile为作业脚本文件,文件中指定资源请求和任务内容。sbatch命令在脚本正确传递给作业调度系统后立即退出,同时获取到一个作业号。作业等所需资源满足后开始运行,调度系统将在所分配的第一个计算节点(而不是登录节点)上加载执行用户的作业脚本。HPC系统上使用最多的提交作业方式,几乎所有不需要交互的场景都是用sbatch进行提交。
sbatch的常用命令选项
参数 | 功能 |
---|---|
-J,-job-name=<jobname> |
赋予作业的作业名为<jobname> |
-n 或 --ntasks=number |
指定要运行的任务数,默认每个任务一个处理器核,仅对作业起作用,不对作业步起作用。 |
-N 或 --nodes=nnodes |
请求为作业分配nnodes 个节点。如果作业的请求节点个数超出了分区中配置的节点数目,作业将被拒绝。 |
-p 或 --partition=partition_name |
在指定分区中分配资源。如未指定,则在系统默认分区中分配资源。 |
-ntasks-per-node |
指定每个节点运行进程数 |
-cpu_per_task=<count> |
指定任务需要的处理器数目 |
-c 或 --cpus-per-task=ncpus |
作业步的每个任务需要 ncpus 个处理器核。若未指定该选项,则默认为每个任务分配一个处理器核。 |
-t |
指定作业执行时间,若超过该时间,作业将会被杀死。时间格式为:minutes、minutes:seconds、hours:minutes:seconds、days-hours、days- hours:minutes 和days-hours:minutes:seconds 。 |
-o |
指定作业标准输出文件的名称,不能使用shell环境变量 |
-e |
指定作业标准错误输出文件的名称,不能使用shell环境变量 |
-w 或 --nodelist=nodenamelist |
请求指定的节点名称列表。列表可以用逗号分隔的节点名或节点范围(如 h02r1n[00-19])指定。 |
--mem=<size[units]> |
指定作业在每个节点使用的内存限制。 |
-d, --dependency=<dependency_list> |
作业依赖关系设置 |
--exclusive |
作业独占节点,作业运行过程中不允许其他作业使用节点,即使节点核心未用满。 |
--gres=<list> |
指定每个节点使用的通用资源名称及数量 eg:--gres=gpu:2 表示本作业使用gpu卡,且每个节点使用2卡 |
-x,-exclude=<host1,host2,…or filename> |
在特定<host1,host2> 节点或filename文件中指定的节点上运行。 |
-ntasks-per-socket=<ntasks> |
每颗CPU运行<ntasks> 个任务,需与-n,-ntasks=<number> 配合,并自动绑定<ntasks> 个任务到每颗CPU。仅对作业起作用,不对作业步起作用。 |
--mem-per-cpu=<size> |
分配的CPU需要的最小内存 |
-no-requeue |
任何情况下都不重新运行 |
-h, --help |
查看帮助说明 |
使用示例
- 串行作业示例
#!/bin/bash
#SBATCH –J TestSerial
#SBATCH -p normal
#SBATCH -N 1
#SBATCH –n 1
#SBATCH -o log/%j.loop
#SBATCH -e log/%j.loop
echo “SLURM_JOB_PARTITION=$SLURM_JOB_PARTITION”
echo “SLURM_JOB_NODELIST=$SLURM_JOB_NODELIST”
srun ./calc_serial 1000000
- MPI作业示例
Intel MPI支持多种方式与作业调度集成,其中最推荐的方式是使用srun直接启动任务(Intel MPI Library 4.0 Update 3开始支持这种方式),启动前只需要设置I_MPI_PMI_LIBRARY环境变量到SLURM的libpmi.so库(默认安装位置/usr/lib64/libpmi.so)
#!/bin/bash
#SBATCH -J wrf
#SBATCH --comment=WRF
#SBATCH -n 128
#SBATCH --ntasks-per-node=32
#SBATCH --ntasks-per-socket=16
#SBATCH -p normal
#SBATCH -o %j
#SBATCH -e %j
export I_MPI_PMI_LIBRARY=/opt/gridview/slurm/lib/libpmi.so
module load compiler/intel/composer_xe_2017.2.174
module load mpi/intelmpi/2017.2.174
export FORT_BUFFERED=1
srun --cpu_bind=cores --mpi=pmi2 ./wrf.exe
作业环境变量
名称 | 含义 | 类型 | 示例 |
---|---|---|---|
SLURM_JOB_ID |
作业id,即作业调度系统为作业分配的作业号,可用于bjobs等命令 | 数值 | hostfile=" ma.$SLURM_JOB_ID" 使用$SLURM_JOB_ID定义machinefile,指定mpi节点文件 |
SLURM_JOB_NAME |
作业名称,即-J 选项指定的名称 | 字符串 | mkdir ${SLURM_JOB_NAME} 根据作业名称创建临时工作目录 |
SLURM_JOB_NUM_NODES |
作业分配到的节点总数 | 数值 | echo $SLURM_JOB_NUM_NODES |
SLURM_JOB_NODELIST |
作业被分配到的节点列表 | 字符串 | echo $SLURM_JOB_NODELIST |
SLURM_JOB_PARTITION |
作业被分配到的队列名 | 字符串 | echo $SLURM_JOB_PARTITION |
srun 交互模式提交作业
简介
交互式提交作业,交互式意味着在任务的执行过程中,需要与任务进行交互。有屏幕输出,但容易受网络波动影响,断网或关闭窗口会导致作业中断。常用命令选项同sbatch基本一致。
使用示例
- 在分区 kshcnormal 上指定节点数
任务数6,独占模式运行 hostname
[hpctest_07162@login02 ~]$ srun -p kshcnormal -N 2 -n6 --exclusive hostname srun: job 47416331 queued and waiting for resources srun: job 47416331 has been allocated resources a07r1n05 a07r1n05 a07r1n05 a07r1n04 a07r1n04 a07r1n04
salloc 分配模式提交作业
简介
该命令支持用户在提交作业前,先获取所需计算资源,用户可以ssh进入计算节点运行相关计算程序,当命令结束后释放分配的资源。常用作调试。 常用命令选项同sbatch基本一致
使用示例
- 申请资源
[hpctest_07162@login02 ~]$ salloc -p kshcnormal -N 1 -n 4
salloc: Pending job allocation 47416155
salloc: job 47416155 queued and waiting for resources
salloc: job 47416155 has been allocated resources
salloc: Granted job allocation 47416155
salloc: Waiting for resource configuration
salloc: Nodes a02r1n14 are ready for job
- ssh 到计算节点执行命令
[hpctest_07162@login02 ~]$ ssh a02r1n14
[hpctest_07162@a02r1n14 ~]$ hostname
a02r1n14
[hpctest_07162@a02r1n14 ~]$ exit
logout
Connection to a02r1n14 closed.
- 执行exit退出,作业释放资源
[hpctest_07162@login02 ~]$ exit
exit
salloc: Relinquishing job allocation 47416155
salloc: Job allocation 47416155 has been revoked.
[hpctest_07162@login02 ~]$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)