我在远程集群中运行许多小型计算作业,其中作业提交由 PBS 管理。通常,在 PBS(bash)脚本中,我指定要通过命令提交作业的队列
#PBS -q <queue_name>
我需要选择的作业队列取决于特定队列的负载。每次在提交作业之前,我都会通过终端上的命令进行分析
qstat -q
它为我提供了如下所示的输出
Queue Memory CPU Time Walltime Node Run Que Lm State
---------------- ------ -------- -------- ---- --- --- -- -----
queue1 -- -- 03:00:00 -- 0 2 -- E R
queue2 -- -- 06:00:00 -- 8 6 -- E R
我想根据两个约束通过作业脚本自动执行队列选择
- 所选队列的挂起时间必须大于指定的作业时间。作业时间通过命令指定
#PBS -l walltime=02:30:00
。 - 队列中必须有最少的号码。 Que 中的作业数量如上面的输出所示。
我无法确定需要在终端中使用哪些工具来帮助我自动执行队列选择
答案1
我怀疑您是否会发现您所描述的这些工具听起来像是一个损坏的 PBS 设置。
队列应按预期用途/用户进行区分。如果两个队列为具有相同要求的相同用户提供服务,则应专门合并它们以消除您提出的问题。批处理调度程序的全部目的是在用户/作业之间平衡资源。如果用户必须手动将输入添加到方程中,我认为该过程中的某些内容就会被破坏。
这不是一个好的解决方案,但您可以自己编写一个脚本来获取队列,例如:
#!/bin/bash
case $# in
2) ;;
*) echo "Usage: $(basename $0) 'WALLTIME' 'JOBNAME'"
echo "WALLTIME should be in format HH:MM:SS"
echo "JOBNAME should be filename of PBS script (full path if not in local directory)"
exit 0
;;
esac
MYWALL="$1"
MYJOB="$2"
cnt=0
i=0
qstat -q|
while read q
do
if (( cnt < 2 ))
then
((cnt++))
continue
else
((i++))
WALL[$i]=$(echo $q|awk '{print $4}')
Q[$i]=$(echo $q|awk '{print $7}')
NAME[$i]=$(echo $q|awk '{print $1}')
fi
done
MINQ=${Q[1]}
for ((q=1; q <= i; q++))
do
if [[ "${MYWALL}" > "${WALL[$q]}" ]]
then
continue
else
if [[ ${Q[$q]} -le $MINQ ]]
then
MINQ=${Q[$q]}
NAMEQ="${NAME[$q]}"
fi
fi
done
if [[ ! "$NAMEQ" ]]
then
echo "WALLTIME $MYWALL greater than walltime of any queue"
fi
echo "qsub -q $NAMEQ $MYJOB"
qsub -q "$NAMEQ" "$MYJOB"