如何在作业提交期间动态选择 PBS 队列

如何在作业提交期间动态选择 PBS 队列

我在远程集群中运行许多小型计算作业,其中作业提交由 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

我想根据两个约束通过作业脚本自动执行队列选择

  1. 所选队列的挂起时间必须大于指定的作业时间。作业时间通过命令指定#PBS -l walltime=02:30:00
  2. 队列中必须有最少的号码。 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"

相关内容