集群任务管理系统(SGE、PBS)使用记录
1、集群基础知识
1.1 集群任务管理系统
计算机集群:高性能集群(High Performance Computing,简称HPC)是一组松散或紧密连接在一起工作的计算机。这些计算机协同工作,可以利用多个计算机进行并行计算从而获得很高的计算速度,而且任何一个机器坏了整个系统还是能正常运行。
节点是集群中的控制器,是管理数据和执行维护任务的计算单元。
计算机集群将每个节点设置为执行相同的任务,是由软件控制和调度的,常见的资源管理和调度系统为SGE、PBS。
1.2 系统调度任务的步骤
软件做的事情就是 把不同用户投递的任务按顺序排队,按优先级(时间、重要性等维度)把任务匹配到计算节点执行,主要有四步:
(1)接受用户投放的任务;
(2)在任务运行以前,将任务放到一个存储区域;
(3)发送任务到一个执行设备,并监控任务的运行;
(4)运行结束写回结果并记录运行日志;
2、SGE系统常用命令
2.1 提交任务 qusb
示例:
# 命令行方式提交
echo "bowtie2 -p 8 -x index/ref -1 data/A_1.fq -2 data/A_2.fq | samtools sort > A.bam" | qsub -V -cwd -l vf=25G -S /bin/bash -pe openmpi 8 -N A.bt2
# sh脚步方式提交
qsub -cwd -l vf=2g,p=1 -q queuename.q -P projectname -binding linear:2 test.sh
# 任务投递到指定计算节点
qsub -cwd -l vf=1G -l p=1 -q queuename.q@compute-24-4 -P projectname api.sh
用qsub -help可以看完整的参数,但是常用的为如下几个:
-q xxx : 指定要投递到的队列,如果不指定的话,SGE会在用户可使用的队列中选择一个满足要求的队列。
-V: 将当前的环境变量传递到执行命令的节点中
-cwd:在当前目录下执行任务, sge的日志会输出到当前路径。 不增加该指令,所有投递的任务都会在家目录下执行
-l resource=value: 请求资源数, 例如 -l vf=25G -l h=node1 就是任务的预估内存要25G(内存估计的值应稍微大于真实的内存,内存预估偏小可能会导致节点跑挂), 申请在node1上运行
-S /bin/bash: 表示在bash环境下执行命令。默认tcsh.
-pe openmpi 4: 表示使用openmpi进行并行运算,且申请的线程是4,
-N 任务名: 手动执行任务的名字
-j y|n :是否将标准输入和标准输入合并成一个文件
-sync y|n: 是否等待任务结束,返回退出码
-o path: 指定标准输出的文件夹
-p: 定义工作的相对优先级,-1023 到 1024 , 默认值0
-P: 定义项目名称,前提是存在该项目
2.2 查看任务 qstat
qstat命令
qstat -j jobid #某个任务详细信息
qstat -u username #某用户的任务
qstat -u username -s r #某用户在跑的任务
qstat -u \* #所有用户任务
qstat -u \* -s r #看哪些用户在跑任务
qstat -q all.q -u \* #查看某个队列下所有任务
qstat -q all.q@node1 -u \* #查看某个队列的某一节点下所有任务
qstat -explain a|c|A|E -j jobID # 查看任务任务并给出解释
qstat -f #查看用户自己在每个节点的任务情况,没啥用
qstat -F vf,p -q bc.q # 能看到实时资源申请剩余情况
任务的状态:
① qw #表示等待状态
② hqw #任务挂起等待中,待依赖的任务完成后执行
③ Eqw #投递任务出错
④ r #任务正在运行
⑤ s #暂时挂起
⑥ dr #节点挂了之后,删除任务就会出现这个状态,只有节点重启之后,任务才会消失
2.3 删除任务 qdel
qdel jobid #可同时删除多个,如qdel jobid1 jodid2
qdel -u username #删除某用户所有任务
qstat -u USERNAME | grep "USERNAME" | cut -d "." -f1 | xargs qdel #删除所有任务
qstat -u USERNAME | grep "R" | cut -d "." -f1 | xargs qdel #删除所有正运行的任务
qstat -u USERNAME | grep "Q" | cut -d "." -f1 | xargs qdel #删除所有正等待的任务
2.4 挂起/恢复任务
qhold
挂起qw的任务,状态变为 hqw,待依赖的任务完成后执行。
qhold jobid
qhold -u \*
qrls jobid #恢复
qmod
挂起running中的任务
qmod -s jobID # 挂起某个任务
qmod -us jobID # 恢复运行某个挂起的任务
当遇到任务状态Eqw时,qmod -cj jobid ,可以清除错误状态,
qmod修改队列和任务属性
2.5 更改任务属性 qalter
qalter命令修改已提交但正处于暂挂状态的作业的属性
参数和qsub一样。
2.6 集群资源查询
qhost
显示SGE执行主机(即各个计算节点)的状态信息。其中ARCH表示CPU架构,NCPU表示CPU核数,LOAD表示负载情况。
qhost -j 按照节点显示任务
qhost -F 展示每个节点的资源
qconf
提供集群配置和队列配置的用户界面。
qconf -sel # 显示“执行主机”列表
qconf -sh # 显示“管理主机”列表
qconf -ss # 显示“提交任务主机”列表
qconf -sql # 显示“集群队列”列表
qconf -spl # 显示“集群并行环境”列表
qconf -shgrpl # 查看队列
qconf -shgrp @bc_hosts # 查看特定队列下的具体计算节点
qconf -srqs max_user_running_jobs # 查看任务投递数量
qselect
qselect -U # 查看指定用户的可用队列节点
qselect -q # 查看指定队列有哪些可用节点
qselect -q bc.q # 能看到该队列的所有节点
3、PBS系统常用命令
3.1 提交任务
qsub
1、通过命令行参数传递给 qsub 命令
echo “script.py” | qsub -l q batch1 -l nodes=1:ppn=2 (直接在终端设置PBS资源命令,并在此资源下提交可执行脚本)
echo "python script.py -i inputdir -o outdir " | qsub -q Batch1 -l nodes=1:ppn=1 -l mem=40gb -N jobname
执行script.py 脚本, 通过pbs投递任务, 任务提交到Batch1队列,所需资源为,1个节点,节点使用1个cpu, 40GB物理内存,该任务命名jobname。
2、PBS通过sh脚本执行命令
qsub 文件名.pbs/.sh (提交任务)
例如 run.sh
#参数解析
#指定节点数目 ppn指每个节点运行的cpu数量(4个小节点,每个48个CPU)
#PBS -l nodes=1:ppn=16
#指定合并到标准输出文件中
#PBS -j oe
#设置程序运行的最大时间192小时
#PBS -l walltime=192:00:00
#指定qsub的所有环境变量都传递到批处理作业中
#PBS -V
#输出文件
#PBS -o /public/home/tang/chaim/back_info/$jobname.out
#错误输出文件
#PBS -e /public/home/tang/chaim/back_info/$jobname.err
cd PBS_O_OUTDIR
# 程序执行命令
python script.py -i inputdir -o outdir
# 执行脚本
qsub run.sh
# 制定命令开始运行的时间
qusb -a 070000 run.sh #7天后运行程序,此时是处于W状态(等待状态)
qsub -a 2400 run.sh #24h后运行程序
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 命令所在的绝对路径
3.2 查看任务
qstat
主要用于查询作业状态信息。
命令格式:
qstat [-f][-a][-i][-n][-s][-R][-Q][-q][-B][-u]
参数说明:
-f jobid 列出挃定作业的信息
-a 列出系统所有作业
-i 列出正在运行的作业
-n 列出分配给此作业的结点
-s 列出队列管理员不 scheduler 所提供的建议
-R 列出磁盘预留信息
-Q 操作符是 destination id,挃明请求的是队列状态
-q 列出队列状态,并以 alternative 形式显示
-au userid 列出挃定用户的所有作业
-B 列出 PBS Server 信息
-r 列出所有正在运行的作业
-Qf queue 列出指定队列的信息
-u 若操作符为作业号,则列出其状态。若操作符为 destination id,
则列出运行在其上的属于 user_list 中用户的作业状态。
qstat 后加不同参数可以查看不同的信息
qstat -a #查看账号所有作业的状态
Job id是给提交的任务分配的任务号,S分为多种状态,(R 代表运行,Q 代表排队,E 代表正在退出,H 代表挂起,C 代表运行完毕)。
qstat -f 1386 # 查看特定作业详细信息
qstat jobid1 jobid2 # 可一次查看多个作业
qstat -u user1 # 查看指定用户的作业
任务执行所在队列信息:
qstat -q # 列出队列使用信息
qstat -n # 列出队列中使用的节点
qstat -f jobid # 查看jobid任务的详细信息
3.3 删除任务
qdel
用于删除已提交的作业。
qdel [-W 间隔时间] 作业号
命令行参数:
qdel -p 强制清除某个作业号,一般不建议使用
eg:
qdel -W 15 211 # 15 秒后删除作业号为 211 的作
3.4 挂起/恢复任务
qhold
可以挂起作业,使其不被调度执行;
qhold jobid1 jobid2 ...
# 其中 jobidX 代表需要操作的作业号,可以一次操作多个作业
qrls
可以将挂起的作业释放,使其可以被调度执行;
qrls jobid1 jobid2 ...
# 其中 jobidX 代表需要操作的作业号,可以一次操作多个作业
qrerun
重新运行作业。
3.5 任务更改
qmove
将作业移动到另一个队列
qalter
更改作业资源属性
3.6 集群资源查询
pbsnodes
查看空闲节点信息
pbsnodes # 查看所有节点
pbsnodes -l free # 查看空闲节点
pbsnodes 某节点 # 查看某节点状态
ssh 某节点 # 节点切换
exit 某节点 # 节点退出
showq
查看所有作业
showq # 展示PBS系统所有作业信息
showq -u uid # 简要显示任务的信息
参考资料:
1、集群SGE作业调度系统
2、集群任务管理系统SGE的简明教程
3、SGE作业调度系统的简单理解
4、SGE部署
5、中国科学院超级计算武汉分中心PBS 用户指南
6、集群及PBS调度系统常用命令
7、服务器集群与PBS任务管理系统的常用命令
8、PBS官方文档