Skip to content

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显示作业状态squeue
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

sinfo 查看当前账号可使用的分区信息,如下图所示: Alt text

其中PARTITION表示分区,NODES表示节点数,NODELIST为节点列表,STATE表示节点运行状态。常见节点状态:

allocidlemixdowndrain
节点被分配给了job节点没有被分配给job,可用部分占用节点不可用节点不接受新job

sinfo的常用命令选项:

sinfo -N按每个节点一行的格式查看节点状态
sinfo -p partition_name显示指定分区的信息
sinfo -n node_name查看指定节点状态
sinfo -V显示版本信息
sinfo --help查看帮助说明

查看作业信息 squeue

使用squeue 可以查看当前用户当前任务的运行状态 Alt textJOBID:作业号
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]Alt text

查看历史作业使用资源 seff

查看历史作业实际使用的CPU、内存等资源以及实际运行时长。 用户可以根据历史作业资源信息指定新作业的时间和内存,准确的时间可能让用户的作业得到回填调度,从而得以提前运行。 Alt text

取消作业 scancel

取消作业号为47433887的作业 Alt text

三、三种模式提交作业

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:minutesdays-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查看帮助说明

使用示例

  1. 串行作业示例
shell
#!/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
  1. MPI作业示例

Intel MPI支持多种方式与作业调度集成,其中最推荐的方式是使用srun直接启动任务(Intel MPI Library 4.0 Update 3开始支持这种方式),启动前只需要设置I_MPI_PMI_LIBRARY环境变量到SLURM的libpmi.so库(默认安装位置/usr/lib64/libpmi.so)

shell
#!/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基本一致。

使用示例

  1. 在分区 kshcnormal 上指定节点数

  2. 任务数6,独占模式运行 hostname

    shell
    [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基本一致

使用示例

  1. 申请资源
shell
[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
  1. ssh 到计算节点执行命令
shell
[hpctest_07162@login02 ~]$ ssh a02r1n14
[hpctest_07162@a02r1n14 ~]$ hostname 
a02r1n14
[hpctest_07162@a02r1n14 ~]$ exit
logout
Connection to a02r1n14 closed.
  1. 执行exit退出,作业释放资源
shell
[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)