如果你有一个性能还不错的工作站 ,例如 2*E5-2690 v4 (每个 CPU 有14 核心、28 线程)、512 g 内存,有100个个体的重测序数据需要分析,你会如何做呢?用 for 循环一个个体接一个个体的分析么?不要吧!太浪费计算资源了。
再有,如果多人同时使用同一个工作站,同一时间投递任务过多,会出现系统卡顿现象或者某些任务占用资源过多直接被系统 kill 的情况,会浪费时间、精力和计算资源。
怎么才能更好地使用工作站或者集群的计算资源呢?在这里我推荐大家使用 "集群作业调度系统"。即使你使用的仅是一个工作站,也可以安装集群作业调度系统,从而高效、稳定地利用你的计算资源。其实,各个超算中心都是使用 "作业调度系统" 来管理计算资源的。本期我将简单地介绍几个 "作业调度系统" 的使用方法。
Torque 作业调度系统
#PBS -N fastqc
#PBS -S /bin/bash
#PBS -l nodes=1:ppn=8
#PBS -l walltime=100:00:00
#PBS -q batch
#PBS -o run.out
#PBS -e run.err
cd $PBS_O_WORKDIR
mkdir 00.FastQC
fastqc --noextract -t 2 test.1.fq.gz test.2.fq.gz -o ./00.FastQC
上面这个例子是用 fastqc 对 test 个体的正向和反向数据进行分析;
-N 设置任务的名称;
-S 其实是 shebang,指定用哪个 shell 来执行脚本;
-l 用来指定申请资源的情况,nodes 指明想要申请的节点数,ppn 指明每个节点申请的线程数;
walltime 用来指明任务运行时间,这里需要注意的是如果时间结束任务还没完成的话,任务将被终止;
-q 指明申请的队列,一个集群往往有多个队列 (例如:普通节点队列、大内存节点队列等),任务提交以后,将会在其申请的队列排队;
-o 指明标准输出文件;
-e 指明标出错误文件;
最重要的是 cd $PBS_O_WORKDIR 这句命令 ,它表示进入脚本文件所在的目录,执行脚本中的命令。如果没有这个命令,系统把用户 home 目录里当作工作目录,执行脚本中的命令;
本例中,系统将在脚本所在的目录建立 00.FastQC 文件夹,寻找 test.1.fq.gz test.2.fq.gz 两个文件作为输入文件,并把 fastqc 的运行结果写入 00.FastQC 文件夹内。
将上面的脚本存为 fastqc.sh,运行 qsub fastqc.sh,会将脚本递交到集群 batch 队列进行计算。
递交脚本以后,使用 qstat 可以查看脚本运行状态,结果会显示 Job ID (作业调度系统分配的任务代号)、Name (脚本的名称)、User (递交任务的用户)、Time use (已经运行的时间)、S (任务状态,R 表示运行、E 表示出错、C 表示停止) 以及 Queue (任务投递的队列);
使用 qstat -u username 可以查看指定用户的任务状态;
使用 qdel + JobID 来终止指定任务、qdel + username 终止用户所有任务;
使用 pbsnode -a 查看各节点的工作状态。
SLURM 作业调度系统
#!/bin/bash
#SBATCH -A projname
#SBATCH -n 10
#SBATCH -t 12:00:00
#SBATCH -J job_name
#SBATCH --output=test.out
#SBATCH --error=test.err
mkdir 00.FastQC
fastqc --noextract -t 2 test.1.fq.gz test.2.fq.gz -o ./00.FastQC
-A 指定项目名称,这个项目名称是指从特定集群申请来的计算资源;
-n 指明申请的线程数;
-t 指明任务运行时间,申请的时间不是越长越好,申请很长的时间可以保证任务完成,但是可能需要更久的排队时间;
-J 指明任务的名称;
其它各的参数解释与 Torque 类似。
将上面的脚本存为 fastqc.sh,运行 sbatch fastqc.sh,会将脚本递交到集群 batch 队列进行计算。
使用 squeue -u username 来查看指定用户的任务状态,包含 JOBID、PARTITION、NAME、USER、ST、TIME、NODES NODELIST(REASON) 等几方面;
使用 scancel JOBID 可以取消指定任务,scancel -u username 可以取消指定用户的所有任务;
使用 scontrol show job JOBID 可以查看指定任务的状态;
使用 projinfo 可以查看用户所属项目的资源使用情况。
LSF作业调度系统
#BSUB -n 12
#BSUB -q batch
#BSUB -o %J.out
#BSUB -e %J.err
#BSUB -W 168:00
mkdir 00.FastQC
fastqc --noextract -t 2 test.1.fq.gz test.2.fq.gz -o ./00.FastQC
将上面的脚本存为 fastqc.sh,运行 bsub < fastqc.sh,会将脚本递交到集群 batch 队列进行计算。
使用 bqueues 可以查看现有队列信息;
使用 bkill、bstop、bresume、bstop、bbot、bmod 等命令管理作业;
使用 bjobs、bpeek 查看作业情况;
使用 buser 查看用户信息。
往期回顾: