pbs 查看队列计算核限制
超算上一般都是使用PBS的作业管理系统对提交的作业进行资源分配和利用的管理.
队列计算核限制问题
在使用超算的过程中,因为不知道队列的核数限制(主要还是不太懂pbs工作的原理),如何知道提交的计算资源是否超过了队列的限制?
我今天使用学校的超算free队列进行测试。
测试
官方宣称队列最多只能进行2个节点,每个节点只能进行2个核的计算.
下面使用超算mpi环境安装和使用使用到的简单的测试代码.
先使用官方宣称的资源进行测试:2个节点,每个节点2个计算核.
对应的pbs(free.pbs)文件如下:
2节点2核
#PBS -N test
#PBS -l nodes=2:ppn=2
#PBS -j oe
#PBS -q free
#PBS -l walltime=0:05:0
cd $PBS_O_WORKDIR
JOBID=`echo $PBS_JOBID | awk -F. '{print $1}'`
echo This job id is $JOBID | tee job_info.log
echo Working directory is $PBS_O_WORKDIR | tee -a job_info.log
echo Start time is `date` | tee -a job_info.log
echo This job runs on the following nodes: | tee -a job_info.log
echo `cat $PBS_NODEFILE | sort | uniq` | tee -a job_info.log
NPROCS=`cat $PBS_NODEFILE | wc -l`
NNODES=`uniq $PBS_NODEFILE | wc -l`
PPROCS=$(($NPROCS/$NNODES))
echo This job has allocated $NNODES nodes, $NPROCS processors.| tee -a job_info.log
uniq $PBS_NODEFILE | sort | sed s/$/i:$PPROCS/ > $PBS_O_WORKDIR/hostfile
#source your profile
MPIRUN="mpiexec -np $NPROCS -f $PBS_O_WORKDIR/hostfile -env I_MPI_DEVICE=rdma"
JOBCMD="./a.out"
{ time $MPIRUN $JOBCMD; } >$PBS_O_WORKDIR/output_$JOBID.log 2>&1
echo End time is `date`| tee -a job_info.log
rm -f $PBS_O_WORKDIR/hostfile
pkill -P $$
exit 0
之后提交进行计算
*****@login5:[/public/home/********/code/temp]ls
a.out free.pbs main.c
# 提交
*****@login5:[/public/home/********/code/temp]qsub free.pbs
360237.admin-ha
# 提交成功 查看作业信息
*****@login5:[/public/home/********/code/temp]qstat -a
360237.admin-ha zh****g free test 30894 2 4 -- 00:05:00 C --
# 计算完成 查看计算结果
*****@login5:[/public/home/********/code/temp]ls
a.out free.pbs job_info.log main.c output_360237.log test.o360237
# 输出结果
*****@login5:[/public/home/********/code/temp]cat output_360237.log
hello world from process 0 of size 4 -- name c1137 .
hello world from process 1 of size 4 -- name c1137 .
hello world from process 2 of size 4 -- name c1138 .
hello world from process 3 of size 4 -- name c1138 .
real 0m0.865s
user 0m0.043s
sys 0m0.028s
上述操作完成后,说明使用2个节点的2核计算是成功的.
3节点2核
尝试使用3个节点,每个节点2个计算核.
只需要将之前的free.pbs文件的第二行修改为:
#PBS -l nodes=3:ppn=2
进行提交计算:
# 提交计算
*****@login5:[/public/home/********/code/temp]qsub free.pbs
360245.admin-ha
# 提交成功 查看队列情况
# 数据表示意思分别是
# 作业id号 用户名(隐私用**) 提交的队列名称 作业名称(在pbs文件中指定) --- 3代表3个节点 6代表一共3*2个计算核 时间限制5分钟 目前作业运行情况Q(等待),R(正在执行)
*****@login5:[/public/home/********/code/temp]qstat -a
360245.admin-ha zh****g free test -- 3 6 -- 00:05:00 Q --
发现提交的队列一直属于等待状态(Q),故删除该队列.
*****@login5:[/public/home/********/code/temp]qdel 360245
上述发现学校官方的数据不太准确,不是说好这个队列只支持2个节点,每个节点,最大限制是2个核吗?
暂时先不管之后再解决这个问题.
在进行如下测试:
2节点5核
同样修改对应的free.pbs文件
#PBS -l nodes=2:ppn=5
进行如下操作:
*****@login5:[/public/home/********/code/temp]qsub free.pbs
qsub: submit error (Job exceeds queue resource limits MSG=cannot satisfy queue max procct requirement)
提交作业不成功,说明该队列对核数进行了限制.此时提交的2*5=10计算核超过了该队列的上限.
上述测试证实了当提交的计算核超过该队列支持的最大上限时,是不能提交作业成功的,直接提示作业错误.
如何查看队列的最大核数呢?
# 查看超算上一共有多少个队列
# 对应的参数分别代表的含义
# 队列名称(Queue) 最大同时执行作业数(Max) 当前总共提交的作业数(Tot) (Ena)(Str) 应该代表该队列是否激活 当前队列下等待的作业数(Que) 当前队列下正在执行的作业数(Run)
*****@login5:[/public/home/********/code/temp]qstat -Q
Queue Max Tot Ena Str Que Run Hld Wat Trn Ext T Cpt
---------------- --- ---- -- -- --- --- --- --- --- --- - ---
gpu_test 200 0 yes yes 0 0 0 0 0 0 E 0
mic_phy1 200 0 no no 0 0 0 0 0 0 E 0
long 150 163 yes yes 65 98 0 0 0 0 E 0
low 200 0 yes yes 0 0 0 0 0 0 E 0
blades 300 274 yes yes 206 67 0 0 0 0 E 1
fat4t 0 0 no no 0 0 0 0 0 0 E 0
fat1t 0 75 yes yes 56 19 0 0 0 0 E 0
free 20 1 yes yes 0 0 0 0 0 0 E 1
gpu536 200 5 yes yes 2 1 0 0 0 0 E 2
single 20 0 yes yes 0 0 0 0 0 0 E 0
short 40 42 yes yes 31 11 0 0 0 0 E 0
yxma_256 200 0 no no 0 0 0 0 0 0 E 0
mic_asc 200 0 yes yes 0 0 0 0 0 0 E 0
lzz_973 200 0 yes yes 0 0 0 0 0 0 E 0
defaultApp 0 0 yes yes 0 0 0 0 0 0 E 0
little 0 93 yes yes 57 35 0 0 0 0 E 1
c536 0 7 yes yes 4 3 0 0 0 0 E 0
f536 0 4 yes yes 1 3 0 0 0 0 E 0
c561 0 4 yes yes 0 4 0 0 0 0 E 0
此时看到了熟悉的free队列,查看free队列详细的信息.
*****@login5:[/public/home/********/code/temp]qstat -Qf free
Queue: free
queue_type = Execution
max_user_queuable = 5
total_jobs = 0
state_count = Transit:0 Queued:0 Held:0 Waiting:0 Running:0 Exiting:0 Comp
lete:0
max_running = 20
acl_host_enable = False
acl_hosts = c1138,c1137
acl_user_enable = False
resources_max.procct = 8
resources_max.walltime = 00:20:00
resources_default.walltime = 00:20:00
mtime = 1544882636
resources_assigned.nodect = 0
max_user_run = 10
enabled = True
started = True
其中:
resources_max.procct = 8 # 表示该队列最大支持8个计算核
当没有这条语句命令(resources_max.procct)的话,应该默认下该队列对计算核是不给限制的.
所以当我设置1个节点8个计算核提交成功,1个节点9个计算核则提交失败.
解释为什么官方说2个节点.
查看我们之前程序的输出结果:
hello world from process 0 of size 4 -- name c1137 .
hello world from process 1 of size 4 -- name c1137 .
hello world from process 2 of size 4 -- name c1138 .
hello world from process 3 of size 4 -- name c1138 .
恰好是该队列指定的2个节点名称.
acl_hosts = c1138,c1137
解释为什么使用3个节点提交计算也能成功.
原因猜想的,该队列没有对节点进行限制,但指定了特定的节点( acl_hosts = c1138,c1137),意思可能是当该队列提交任务时,优先使用这些节点进行计算,当节点数不够时,再去找其他空余的节点进行操作.
pbs具体的使用还是得看帮助文档,无奈帮助文档太长,而且是英文的,看不下去,所有只能自己摸索下去,文中对有些概念的理解可能有误,官方为主.