ジョブの送信中に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

2つの制約に基づいて、ジョブスクリプトを介してキューの選択を自動化したいと思います。

  1. 選択したキューの一時停止時間は、指定された作業時間より大きくなければなりません。作業時間はコマンドで指定されます#PBS -l walltime=02:30:00
  2. キューには最小数が必要です。 Que のジョブ数は上の出力に表示されます。

キューの選択を自動化するのに役立つように、端末でどのツールを使用する必要があるのか​​わかりません。

ベストアンサー1

あなたが説明するツールが壊れたPBS設定のように聞こえるかどうか疑問です。

キューは、目的の用途/ユーザーごとに区別する必要があります。 2つのキューが同じ要件を持つ同じユーザーにサービスを提供する場合は、要求された問題を排除するために特別にマージする必要があります。デプロイメントスケジューラの全体的な目的は、ユーザー/タスク間のリソースバランスをとることです。ユーザーが手動で方程式に入力を追加する必要がある場合は、プロセスに問題があるようです。
これは良い解決策ではありませんが、キューを取得するスクリプトを直接作成できます。たとえば、次のようになります。

#!/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"

おすすめ記事