在实际应用中,对规模比较大的高性能计算任务,一般会提交到集群或超级计算机平台上进行计算。
集群系统具有低成本、高性能的特性,提供了强大的批处理和并行计算能力,代表了高性能计算机发展的新方向。
在集群或者超级计算机平台上,一般不能随意地直接以 mpiexec 或 mpirun 运行我们的并行计算程序,而必须通过其上提供的作业管理系统来提交计算任务。
作为集群系统软件的重要组成部分,集群作业管理系统可以根据用户的需求,统一管理和调度集群的软硬件资源,保证用户作业公平合理地共享集群资源,提高系统利用率和吞吐率。
下面我们将简要地介绍几个常用的集群作业管理系统:PBS,LSF 和 SLURM。下面我们首先简要介绍 PBS 作业管理系统。
PBS 简介
PBS (Protable Batch System) 作业管理系统会根据一个集群上的可用计算节点的计算资源管理和调度所有计算作业(无论是批处理作业还是交互式作业)。
PBS 常用命令
作业控制
qsub:提交作业
qdel:取消作业
qsig:给作业发送信号
qhold:挂起作业
qrls:释放挂起的作业
qrerun:重新运行作业
qmove:将作业移动到另一个队列
qalter: 更改作业资源属性
作业监测
qstat:显示作业状态
showq: 查看所有作业
节点状态
pbsnodes:列出集群中所有节点的状态和属性
PBS 作业属性
可以用两种方式设置 PBS 作业属性:
通过命令行参数传递给 qsub 命令;
在 PBS 脚本中以 #PBS 方式指定。
下表列出常用的 PBS 作业属性
属性 | 取值 | 说明 |
---|---|---|
-l | 以逗号分隔的资源列表 | 设定作业所需资源 |
-N | 作业名称 | 设定作业名称 |
-o | 文件路径 | 设定作业的标准输出文件路径 |
-e | 文件路径 | 设定作业的标准错误文件路径 |
-p | -1024 到 +1023 之间的整数 | 设定作业优先级,越大优先级越高 |
-q | 队列名称 | 设定作业队列名称 |
比较常用的作业资源如下:
资源 | 取值 | 说明 |
---|---|---|
nodes | 节点资源构型 | 设定作业所需计算节点资源 |
walltime | hh:mm:ss | 设定作业所需的最大 wallclock 时间 |
cput | hh:mm:ss | 设定作业所需的最大 CPU 时间 |
mem | 正整数,后面可跟 b,kb,mb,gb | 设定作业所需的最大内存 |
ncpus | 正整数 | 设定作业所需的 CPU 数目 |
可以用以下方法设定节点资源构型:
设定所需节点数:
nodes=<num nodes>
设定所需节点数和每个节点上使用的处理器数目:
nodes=<num nodes>:ppn=<num procs per node>
设定所用的节点:
nodes=<list of node names separated by ‘+’>
PBS 环境变量
下表列出常用的 PBS 环境变量:
环境变量 | 说明 |
---|---|
PBS_ENVIRONMENT | 批处理作业为 PBS_BATCH,交互式作业为 PBS_INTERACTIVE |
PBS_JOBID | PBS 系统给作业分配的标识号 |
PBS_JOBNAME | 用户指定的作业名称 |
PBS_NODEFILE | 包含作业所用计算节点的文件名 |
PBS_QUEUE | 作业所执行的队列名称 |
PBS_O_HOME | 执行 qsub 命令的 HOME 环境变量值 |
PBS_O_PATH | 执行 qsub 命令的 PATH 环境变量值 |
PBS_O_SHELL | 执行 qsub 命令的 SHELL 环境变量值 |
PBS_O_HOST | 执行 qsub 命令节点名称 |
PBS_O_QUEUE | 提交的作业的最初队列名称 |
PBS_O_WORKDIR | 执行 qsub 命令所在的绝对路径 |
提交批处理作业
用以下命令形式提交批处理作业:
$ qsub [options] <control script>
作业提交后一般会先排队等待,PBS 系统会根据作业的优先级和可用的计算资源来调度和执行作业。
PBS 脚本本质上是一个 Linux shell 脚本,在 PBS 脚本中可以用一种特殊形式的注释(#PBS)作为 PBS 指令以设定作业属性。下面是一个 PBS 脚本示例:
#!/bin/bash
# file: example.pbs
### set job name
#PBS -N example-job
### set output files
#PBS -o example.stdout
#PBS -e example.stderr
### set queue name
#PBS -q example-queue
### set number of nodes
#PBS -l nodes=2:ppn=4
# enter job's working directory
cd $PBS_O_WORKDIR
# get the number of processors
NP=`cat $PBS_NODEFILE | wc -l`
# run an example mpi4py job
mpirun -np $NP -machinefile $PBS_NODEFILE python example_mpi4py.py
用以下命令提交该作业:
$ qsub example.pbs
取消或停止作业
要取消或停止一个作业,需要得到该作业的作业标识号 <job ID >,可以通过 qstat 命令获得。
取消排队等待的作业
取消一个正在排队等待的作业,可用以下命令:
$ qdel <job ID >
停止正在运行的作业
要停止一个正在运行的作业,可用向其发送 KILL 信号:
$ qsig -s KILL <job ID>
交互式作业
交互式的计算作业通过类似于下面的命令使用:
$ qsub -I [options]
例如要求 2 台计算节点,运行在 example-queue 队列上的交互式作业,执行如下命令:
$ qsub -I -l nodes=2 -q example-queue
执行完以上命令,等 PBS 系统分配好资源后会进入所分配的第一台计算节点,可在其命令终端上执行交互式的计算任务,如要退出交互作业,可在终端输入 exit 命令,或使用按键 Ctrl+D。
LSF 作业管理系统。
简介
LSF (Load Sharing Facility)是一个被广泛使用的作业管理系统,具有高吞吐、配置灵活的优点。
通过 LSF 集中监控和调度,可以充分利用计算机的CPU、内存、磁盘等资源。
常用命令
bqueues:查看计算队列
bhosts:查看计算节点列表
lsload:查看负载
bsub:提交作业
bjobs:查看作业状态
bkill:终止作业
bpeek:查看作业的标准输出
bhist:作业历史信息
作业提交bsub
bsub调用方法
可以通过以下三种方法使用 bsub 来提交作业:
直接在命令行中输入完整参数:
进入 bsub 环境交互提交:
编写作业提交脚本供 bsub 处理。
直接输入完整参数
可以直接在 bsub 的命令行中输入完整的参数来提交一个作业,比如:
$ bsub -n 4 -q example-queue -o example.out ./example "-input data.txt"
其中所用的参数说明如下:
-n 指定所需的处理器数目;
-q 指定作业运行的队列;
-o 指定作业运行信息的输出文件;
“-input data.txt” 是传递给执行程序 example 的命令行参数。
这种方式比较适合提交简单的作业,更复杂的作业控制需要编写作业脚本。
使用作业提交脚本
LSF 作业脚本本质上也是一个 shell 脚本,在其中可以用 #BSUB开头的行来指明 bsub作业参数。下面是一个 LSF 作业脚本示例:
# example.lsf
#BSUB -L /bin/bash
#BSUB -J example-mpi4py
#BSUB -q example-queue
#BSUB -n 4
#BSUB -o example.out
#BSUB -e example.err
mpirun python example-mpi4py.py
其中各参数说明如下:
-L 指明所用的执行 shell,默认会调用 /bin/sh 执行脚本;
-J 指定作业名;
-q 指定作业队列;
-n 指定作业所需的进程数;
-o 指定作业的标准输出文件;
-e 指定作业的错误输出文件。
提交作业脚本,使用下面的命令:
$ bsub < example.lsf
交互式提交
在终端中输入 bsub 并回车后会进入 bsub 交互环境,在其中可输入作业参数和执行作业程序。在 bsub 交互环境下可以一次提交多个参数相同的作业,例如:
$ bsub
bsub> -n 4
bsub> -q example-queue
bsub> -o example.out
bsub> PROG1
bsub> PROG2
bsub> PROG3
bsub> Ctrl+D
使用 Ctrl+D 可退出 bsub 交互环境。
查看作业信息
可以用 bjobs 命令查看用户正在运行中的作业:
$ bjobs
使用 -l参数和某个作业的 JOBID,可以查看该作业的详细信息:
$ bjobs -l JOBID
中止作业
使用 bkill 命令中止某个作业:
$ bkill JOBID
SLURM 资源管理系统。
简介
SLURM (Simple Linux Utility for Resource Management)是一种可用于大型计算节点集群的高度可伸缩和容错的集群管理器和作业调度系统,被世界范围内的超级计算机和计算集群广泛采用。
SLURM 维护着一个待处理工作的队列并管理此工作的整体资源利用。它以一种共享或非共享的方式管理可用的计算节点(取决于资源的需求),以供用户执行工作。
SLURM 会为任务队列合理地分配资源,并监视作业至其完成。如今,SLURM 已经成为了很多最强大的超级计算机上使用的领先资源管理器,如天河二号上便使用了 SLURM 资源管理系统。
常用命令
下面是一些最常用的 SLURM 命令:
sacct:查看历史作业信息
salloc:分配资源
sbatch:提交批处理作业
scancel:取消作业
scontrol:系统控制
sinfo:查看节点与分区状态
squeue:查看队列状态
srun:执行作业
常用环境变量
下表是 SLURM 环境变量:
变量 | 说明 |
---|---|
SLURM_NPROCS | 要加载的进程数 |
SLURM_TASKS_PER_NODE | 每节点要加载的任务数 |
SLURM_JOB_ID | 作业的 JobID |
SLURM_SUBMIT_DIR | 提交作业时的工作目录 |
SLURM_JOB_NODELIST | 作业分配的节点列表 |
SLURM_JOB_CPUS_PER_NODE | 每个节点上分配给作业的 CPU 数 |
SLURM_JOB_NUM_NODES | 作业分配的节点数 |
HOSTNAME | 对于批处理作业,此变量被设置为批处理脚本所执行节点的节点名 |
资源管理系统实体
SLURM 资源管理系统的管理对象包括:节点,分区,作业和作业步。
节点:Node
即指计算节点
包含处理器、内存、磁盘空间等资源
具有空闲、分配、故障等状态
使用节点名字标识
分区:Partition
节点的逻辑分组
提供一种管理机制,可设置资源限制、访问权限、优先级等
分区可重叠,提供类似于队列的功能
使用分区名字标识
作业:Job
一次资源分配
位于一个分区中,作业不能跨分区
排队调度后分配资源运行
通过作业 ID 标识
作业步:Jobstep
通过 srun 进行的任务加载
作业步可只使用作业中的部分节点
一个作业可包含多个作业步,可并发运行
在作业内通过作业步 ID 标识
作业运行模式
SLURM 系统有三种作业运行模式:
交互模式,以 srun 命令运行;
批处理模式,以 sbatch 命令运行;
分配模式,以 salloc 命令运行。
交互模式
交互模式作业的使用过程为:
在终端提交资源分配请求,指定资源数量与限制;
等待资源分配;
获得资源后,加载计算任务;
运行中,任务 I/O 传递到终端;
可与任务进行交互,包括 I/O,信号等;
任务执行结束后,资源被释放。
例如使用 srun 申请 4 个进程生成一个作业步:
$ srun -n 4 ./example
批处理模式
批处理模式作业的使用过程为:
用户编写作业脚本;
提交作业;
作业排队等待资源分配;
分配资源后执行作业;
脚本执行结束,释放资源;
运行结果定向到指定的文件中记录。
下面给出作业脚本示例:
#!/bin/env bash
# file: example.sh
# set the number of nodes
#SBATCH --nodes=2
# set the number of tasks (processes) per node
#SBATCH --ntasks-per-node=4
# set partition
#SBATCH --partition=example-partition
# set max wallclock time
#SBATCH --time=2:00:00
# set name of job
#SBATCH --job-name=example-mpi4py
# set batch script's standard output
#SBATCH --output=example.out
# mail alert at start, end and abortion of execution
#SBATCH --mail-type=ALL
# send mail to this address
#SBATCH --mail-user=user@mail.com
# run the application
srun python example-mpi4py.py
用以下命令提交批处理作业:
$ sbatch example.sh
分配模式
分配模式作业的使用过程为:
提交资源分配请求;
作业排队等待资源分配;
执行用户指定的命令;
命令执行结束,释放资源。
分配模式通过 salloc 命令运行,举例如下(使用 2 个节点,4 个进程,预计运行时间 100 秒):
$ salloc -N 2 -n 4 -p example-partition -t 100 /bin/bash
资源分配请求成功后会进入 bash shell 终端,在其中可以使用 srun 交互式地执行作业任务。在终端输入 exit 命令或 Ctrl+D 退出分配模式。
天河二号上的 SLURM 管理系统
天河二号上使用的是 SLURM 资源管理系统,不过天河二号上使用的 SLURM 命令都是将标准的 SLURM 命令开头的 s 改成了 yh,如下:
yhacct:查看历史作业信息
yhalloc:分配资源
yhbatch:提交批处理作业
yhcancel:取消作业
yhcontrol:系统控制
yhinfo/yhi:查看节点与分区状态
yhqueue/yhq:查看队列状态
yhrun:执行作业
来源:
https://www.jianshu.com/p/2f6c799ca147
https://www.jianshu.com/p/601ca9f33b31
https://www.jianshu.com/p/e560b19dbd3e