by_queue スケジューラパラメータの動作確認を例としたscheduling 設定の評価方法

Shiratori Altair
Shiratori Altair
Altair Employee
edited February 2021 in Altair HPCWorks

この記事では、PBS Professionalの基本的なscheduling パラメータである"by_queue"の動作確認を通じ、基本的なスケジューリング設定、およびその後の動作確認の流れを説明します。

 

・by_queueパラメータ
by_queue スケジューラパラメータは、キュー毎にジョブのソートをするか、
全てのキューを一つのキューのように見做してジョブの並び替えをするかの動作をコントロールします。

 

・PBSのスケジューリング設定変更と動作確認のながれは以下になります。
----------------------------------------------------
1.現在の設定確認
2.動作確認に必要な設定を確認・追加・変更
(今回は、by_queue=trueの動作、by_queue=falseへ変更した場合の動作をそれぞれ確認します。)
3.テストの実施
3-1.schedulingを止める(意図しないスケジューリングサイクルの実行を避けるため)
3-2.テストジョブの実行
3-3.schedulingを開始  (すべてのテストジョブを一つのスケジューリングサイクル対象に含めるため)
3-4.qstatでジョブが開始(R)されたことを確認
3-5.schedulerログを確認し、意図したジョブの並び替えが達成されているかを確認し、動作を評価する。
4.[1]-[3]の結果、意図したものでない動作の場合は別の設定を試し再び[1]-[3]を繰り返す。
----------------------------------------------------

 


1. 現在の設定(by_queueパラメータが有効:デフォルト設定)の確認をします。
*by_queue ”True”はこれが有効であることを意味します。

[root@pbssv ~]# . /etc/pbs.conf
[root@pbssv ~]# cat $PBS_HOME/sched_priv/sched_config | grep -v -e '^#' | grep by_queue
by_queue: True prime
by_queue: True non_prime

 

 

2.Test用のPriorityの異なる二つのキューを作成します。

* test1キューはPriority=20とします。
* test2キューはPriority=10とします。

[root@pbssv ~]# qmgr -c 'c q test1 queue_type=execution,priority=20,enabled=true,started=true'
[root@pbssv ~]# qmgr -c 'c q test2 queue_type=execution,priority=10,enabled=true,started=true'

 

 

3.by_queue パラメータ(デフォルト値)の動作確認

 3-1. schedulerの動作を一時停止します。

[root@pbssv ~]# qmgr -c 's s scheduling = false'

 3-2. ジョブ実行ユーザでジョブをsubmitします。
   *この際、test1,test2キューにそれぞれジョブを投入します。


[user01@pbssv ~]$ qsub -q test1 -l select=1:ncpus=1 -- /bin/sleep 100
2245.pbssv
[user01@pbssv ~]$ qsub -q test2 -l select=1:ncpus=1 -- /bin/sleep 100
2246.pbssv
[user01@pbssv ~]$ qsub -q test2 -l select=1:ncpus=1 -- /bin/sleep 100
2247.pbssv
[user01@pbssv ~]$ qsub -q test1 -l select=1:ncpus=1 -- /bin/sleep 100
2248.pbssv


 3-3.rootでschedulerの動作を開始します。

[root@pbssv ~]# qmgr -c 's s scheduling = true'

 3-4.ジョブが"R"になっていることを確認します。

*以下ではリソースが足りているのですべてのジョブが"R"になっています。

[root@pbssv ~]# qstat -s

pbssv:
Req'd Req'd Elap
Job ID Username Queue Jobname SessID NDS TSK Memory Time S Time
--------------- -------- -------- ---------- ------ --- --- ------ ----- - -----
2245.pbssv user01 test1 STDIN 18349 1 1 -- -- R 00:00
Job run at Tue Feb 09 at 18:50 on (pbsnd01:ncpus=1)
2246.pbssv user01 test2 STDIN 18351 1 1 -- -- R 00:00
Job run at Tue Feb 09 at 18:50 on (pbsnd01:ncpus=1)
2247.pbssv user01 test2 STDIN 18352 1 1 -- -- R 00:00
Job run at Tue Feb 09 at 18:50 on (pbsnd01:ncpus=1)
2248.pbssv user01 test1 STDIN 18350 1 1 -- -- R 00:00
Job run at Tue Feb 09 at 18:50 on (pbsnd01:ncpus=1)
[root@pbssv ~]#

 3-5.スケジューラログで動作を確認します

(エディタなどでスケジューラログを開きます)

[root@pbssv ~]# . /etc/pbs.conf
[root@pbssv ~]# date
2021年 2月 9日 火曜日 18:51:32 JST
[root@pbssv ~]# view $PBS_HOME/sched_logs/20210209

開いたログから、上記qstatで確認したJOBIDが最初にでてくる箇所を確認します。

*PBSのジョブの並び替えは"スケジューリングサイクル"という処理で実施します。
"スケジューリングサイクル"はその時点で"Q"待ちであったジョブを対象とし、ジョブを優先順に並び替えます。この処理での”優先度”を決定するのが各種スケジューリングパラメータになります。

またそれはスケジューラログで確認でき、
Starting Scheduling Cycle メッセージと、
Leaving Scheduling Cycle メッセージの間が、
一回のスケジューリングサイクルで実施したジョブの並び替えの結果です。


つまり、一つのスケジューリングサイクルでどのジョブが対象であったか?
また、そのようにPBSはそれらのジョブを並び替えたか?
は、schedulerログをみることによって明らかにすることができます。

このテストの例でログを見ると、
以下、
Starting Scheduling Cycle メッセージから
Leaving Scheduling Cycle メッセージの
間では、
2245,2248,2246,2247が対象であったと読み取れます。


02/09/2021 18:50:47;0080;pbs_sched;Req;;Starting Scheduling Cycle
02/09/2021 18:50:47;0080;pbs_sched;Job;2245.pbssv;Considering job to run
02/09/2021 18:50:47;0040;pbs_sched;Job;2245.pbssv;Job run
02/09/2021 18:50:47;0080;pbs_sched;Job;2248.pbssv;Considering job to run
02/09/2021 18:50:47;0040;pbs_sched;Job;2248.pbssv;Job run
02/09/2021 18:50:47;0080;pbs_sched;Job;2246.pbssv;Considering job to run
02/09/2021 18:50:47;0040;pbs_sched;Job;2246.pbssv;Job run
02/09/2021 18:50:47;0080;pbs_sched;Job;2247.pbssv;Considering job to run
02/09/2021 18:50:47;0040;pbs_sched;Job;2247.pbssv;Job run
02/09/2021 18:50:47;0080;pbs_sched;Req;;Leaving Scheduling Cycle


さらに、PBSは以下のようにジョブを並び替えたことが分かります。

* 単純に上から優先度高->低と判断した結果をログに記録します。

2245
2248
2246
2247

 

なお、それぞれのジョブは以下のキューで実行されていますので、

2245は、test1キュー
2248は、test1キュー
2246は、test2キュー
2247は、test2キュー

PBSはby_queue=trueにより、ジョブのsubmit順でなく、まずキュー単位に並び替えていることが分かります。

なお、test1キューでsubmitした2245,2248をtest2キューでsubmitした2246,2247よりも優先度が高いと判断しています。

これは、デフォルトではpriorityが高い値を持つキューを優先しますので、その結果です。

 

 

 


4.by_queue パラメータを無効にした場合の動作確認

 4-1.by_queueパラメータの変更と反映処理

  4-1-1.エディタで by_queueパラメータを"false"に変更します。

[root@pbssv ~]# vi $PBS_HOME/sched_priv/sched_config

[root@pbssv ~]# cat $PBS_HOME/sched_priv/sched_config | grep -v -e '^#' | grep by_queue
by_queue: false prime
by_queue: false non_prime
[root@pbssv ~]#

  4-1-2.sched_configファイルの変更を反映するためにpbs_schedデーモンをHUPします。

[root@pbssv ~]# ps -ef | grep pbs_sched
root 2181 1 0 2月09 ? 00:00:00 /opt/pbs/sbin/pbs_sched
root 53935 6166 0 15:30 pts/0 00:00:00 grep --color=auto pbs_sched
[root@pbssv ~]# kill -HUP 2181
[root@pbssv ~]#


 4-2. schedulerの動作を一時停止します。

[root@pbssv ~]# qmgr -c 's s scheduling = false'

 4-3. ジョブ実行ユーザでジョブをsubmitします。
   *この際、test1,test2キューにそれぞれジョブを投入します。
(比較結果を明確にするため[3-2.]と同じパターン (test1->test2->test2->test1キューの順番で投入)

[user01@pbssv ~]$ qsub -q test1 -l select=1:ncpus=1 -- /bin/sleep 100
2249.pbssv
[user01@pbssv ~]$ qsub -q test2 -l select=1:ncpus=1 -- /bin/sleep 100
2250.pbssv
[user01@pbssv ~]$ qsub -q test2 -l select=1:ncpus=1 -- /bin/sleep 100
2251.pbssv
[user01@pbssv ~]$ qsub -q test1 -l select=1:ncpus=1 -- /bin/sleep 100
2252.pbssv


 4-4.rootでschedulerの動作を開始します。

[root@pbssv ~]# qmgr -c 's s scheduling = true'

 4-5.ジョブが"R"になっていることを確認します。

[root@pbssv ~]# qstat -s

pbssv:
Req'd Req'd Elap
Job ID Username Queue Jobname SessID NDS TSK Memory Time S Time
--------------- -------- -------- ---------- ------ --- --- ------ ----- - -----
2249.pbssv user01 test1 STDIN 24075 1 1 -- -- R 00:00
Job run at Wed Feb 10 at 15:55 on (pbsnd01:ncpus=1)
2250.pbssv user01 test2 STDIN 24076 1 1 -- -- R 00:00
Job run at Wed Feb 10 at 15:55 on (pbsnd01:ncpus=1)
2251.pbssv user01 test2 STDIN 24077 1 1 -- -- R 00:00
Job run at Wed Feb 10 at 15:55 on (pbsnd01:ncpus=1)
2252.pbssv user01 test1 STDIN 24078 1 1 -- -- R 00:00
Job run at Wed Feb 10 at 15:55 on (pbsnd01:ncpus=1)
[root@pbssv ~]#

 4-6.スケジューラログで動作を確認します(エディタなどでスケジューラログを開きます)

[root@pbssv ~]# . /etc/pbs.conf
[root@pbssv ~]# date
2021年 2月 10日 水曜日 15:56:00 JST

[root@pbssv ~]# view $PBS_HOME/sched_logs/20210210

 

以下、

Starting Scheduling Cycle メッセージから
Leaving Scheduling Cycle メッセージの間を見ると、

ジョブ2249,2250,2251,2252がこのスケジューリングサイクルの対象であったと読み取れます。


02/10/2021 15:55:03;0080;pbs_sched;Req;;Starting Scheduling Cycle
02/10/2021 15:55:03;0080;pbs_sched;Job;2249.pbssv;Considering job to run
02/10/2021 15:55:03;0040;pbs_sched;Job;2249.pbssv;Job run
02/10/2021 15:55:03;0080;pbs_sched;Job;2250.pbssv;Considering job to run
02/10/2021 15:55:03;0040;pbs_sched;Job;2250.pbssv;Job run
02/10/2021 15:55:03;0080;pbs_sched;Job;2251.pbssv;Considering job to run
02/10/2021 15:55:03;0040;pbs_sched;Job;2251.pbssv;Job run
02/10/2021 15:55:03;0080;pbs_sched;Job;2252.pbssv;Considering job to run
02/10/2021 15:55:03;0040;pbs_sched;Job;2252.pbssv;Job run
02/10/2021 15:55:03;0080;pbs_sched;Req;;Leaving Scheduling Cycle

 

さらに、PBSは以下のようにジョブを並び替えたことが分かります。

2249
2250
2251
2252

 

なお、それぞれのジョブは以下のキューで実行されていますので、

2249は、test1キュー
2250は、test2キュー
2251は、test2キュー
2252は、test1キュー

by_queue=false の場合、

PBSはby_queue=falseにより、ジョブのsubmit順で(キューの並びを無視して)並び替えていることが分かります。