私は、ジョブの送信が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つの制約に基づいて、ジョブスクリプトを介してキューの選択を自動化したいと思います。
- 選択したキューの一時停止時間は、指定された作業時間より大きくなければなりません。作業時間はコマンドで指定されます
#PBS -l walltime=02:30:00
。 - キューには最小数が必要です。 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"