Strict OrderingとBackfillingをベースにしたスケジューリングツールの理解
この文書ではPBS ProfessionalのスケジューリングツールであるStrict OrderingとBackfillingの設定・動作の確認方法を説明します。
----------------------------------------------------
当文書では以下の3台で環境を構成している例を使用します。
pbs-head: pbs_server,pbs_sched,pbs_commの各デーモンが稼働。当例ではjobのsubmitもこのサーバで実施。
node01: pbs_momデーモンが稼働する計算ノード
node02: pbs_momデーモンが稼働する計算ノード
----------------------------------------------------
1.strict ordering
1.1.strict orderingとは?
ジョブの優先度に従って並び替えられたルールに従い追い越しを許可しない設定です。
前提としてPBS Professionalによるジョブの並び替えは以下の順に実施されます。
Queue order (by_queue: True の場合に適用されます。インストールデフォルトはTrueです。)
job_sort_formula (job_sort_formulaが設定されている場合に適用されます。インストールデフォルトでjob_sort_formulaは設定されていません。)
fairshare (fair_share: true の場合に適用されます。インストールデフォルトはfairshareは設定されていません。)
job sort key (job_sort_key: "cput LOW" などソートが設定されている場合に適用されます。インストールデフォルトでコメントアウトされ無効です。)
job submission time(qsubを実行した順番です)
つまり、インストールデフォルトのスケジューリング設定では、
複数のキューが設定され、それにpriorityが設定され明示的な優先度がある環境を前提とした場合、以下の順でソートされます。
高Priorityのキューのジョブ
低Priorityのキューのジョブ
各キュー内のジョブの並び替えはjob submission time
Strict Orderingを設定すると上記の例外を無くしjob submission timeでジョブをソートし実行します。
上記を前提に実際の確認をしてみます。
1.2.strict orderingを設定する
1.2.1.設定前(インストールデフォルトの設定)でのジョブのスケジューリング設定とその動作を確認
1.2.1.1.テスト用キューの作成
[root@pbs-head ~]# qmgr -c "delete queue workq"
[root@pbs-head ~]# qmgr -c "create queue high_q queue_type=e,enabled=t,started=t,priority=100"
[root@pbs-head ~]# qmgr -c "create queue low_q queue_type=e,enabled=t,started=t,priority=50"
1.2.1.2.設定確認
・sched_configファイルの設定
* インストールデフォルトなので以下となっています。
by_queue: True <= 有効
fair_share: false <= 無効
job_sort_key <= コメントアウトなので以下には表示されない(未設定)
[root@pbs-head ~]# . /etc/pbs.conf
[root@pbs-head ~]# cat $PBS_HOME/sched_priv/sched_config | grep -v -e '^$' -e '^#'
round_robin: False all
by_queue: True prime
by_queue: True non_prime
strict_ordering: false ALL
backfill_prime: false ALL
prime_exempt_anytime_queues: false
primetime_prefix: p_
nonprimetime_prefix: np_
node_sort_key: "sort_priority HIGH" ALL
provision_policy: "aggressive_provision"
resources: "ncpus, mem, arch, host, vnode, aoe, eoe"
smp_cluster_dist: pack
fair_share: false ALL
fairshare_usage_res: cput
fairshare_entity: euser
fairshare_decay_time: 24:00:00
fairshare_decay_factor: 0.5
preemptive_sched: true ALL
dedicated_prefix: ded
・serverに設定されているattributeの確認
* インストールデフォルトなので以下となっています。
job_sort_formula <= 設定されていないので表示されない
[root@pbs-head ~]# qmgr -c 'l s' | grep job_sort_formula
[root@pbs-head ~]
・設定したqueueが作成されているかを確認
[root@pbs-head ~]# qstat -Qf
Queue: high_q
queue_type = Execution
Priority = 100
total_jobs = 0
state_count = Transit:0 Queued:0 Held:0 Waiting:0 Running:0 Exiting:0 Begun
:0
enabled = True
started = True
Queue: low_q
queue_type = Execution
Priority = 50
total_jobs = 1
state_count = Transit:0 Queued:0 Held:1 Waiting:0 Running:0 Exiting:0 Begun
:0
enabled = True
started = True
・nodeのリソースを確認(node01,node02それぞれncpus 8のリソースが確認できる)
[root@pbs-head ~]# pbsnodes -aS
vnode state OS hardware host queue mem ncpus nmics ngpus comment
--------------- --------------- -------- -------- --------------- ---------- -------- ------- ------- ------- ---------
node01 free -- -- node01 -- 794mb 8 0 0 --
node02 free -- -- node02 -- 794mb 8 0 0 --
[root@pbs-head ~]#
1.2.1.3.動作確認
・事後、Jobの詳細情報を確認するためjob_history_enableを有効にします。
[root@pbs-head user01]# qmgr -c 's s job_history_enable = true'
[root@pbs-head user01]#
・テスト対象ジョブを一つのscheduling cycle(ジョブ並び替えの単位)に含めて実行させたいため一旦schedulingを停止します。
[root@pbs-head ~]# qmgr -c 's s scheduling = false'
[root@pbs-head ~]#
・ジョブをsubmit(一般ユーザuser01で実行)
[user01@pbs-head ~]$ qstat -s
[user01@pbs-head ~]$ echo 'sleep 30' | qsub -q low_q -lncpus=6
57.pbs-head
[user01@pbs-head ~]$ echo 'sleep 30' | qsub -q high_q -lncpus=6
58.pbs-head
[user01@pbs-head ~]$ echo 'sleep 30' | qsub -q low_q -lncpus=4
59.pbs-head
[user01@pbs-head ~]$ echo 'sleep 30' | qsub -q high_q -lncpus=4
60.pbs-head
[user01@pbs-head ~]$ echo 'sleep 30' | qsub -q low_q -lncpus=2
61.pbs-head
[user01@pbs-head ~]$ echo 'sleep 30' | qsub -q high_q -lncpus=2
62.pbs-head
[user01@pbs-head ~]$
・rootに戻ってschedulingを再開し、ジョブを実行する
[root@pbs-head CS0484021]# qmgr -c 's s scheduling = true'
* s s scheduling = true によって意図したタイミングでのschduling cycleの実行が可能です。
[root@pbs-head CS0484021]# qstat -s
pbs-head:
Req'd Req'd Elap
Job ID Username Queue Jobname SessID NDS TSK Memory Time S Time
--------------- -------- -------- ---------- ------ --- --- ------ ----- - -----
57.pbs-head user01 low_q STDIN -- 1 6 -- -- Q --
Not Running: Not enough free nodes available
58.pbs-head user01 high_q STDIN 4064 1 6 -- -- R 00:00
Job run at Tue Jul 11 at 11:25 on (node01:ncpus=6)
59.pbs-head user01 low_q STDIN 3607 1 4 -- -- R 00:00
Job run at Tue Jul 11 at 11:25 on (node02:ncpus=4)
60.pbs-head user01 high_q STDIN 3606 1 4 -- -- R 00:00
Job run at Tue Jul 11 at 11:25 on (node02:ncpus=4)
61.pbs-head user01 low_q STDIN -- 1 2 -- -- Q --
Not Running: Not enough free nodes available
62.pbs-head user01 high_q STDIN 4065 1 2 -- -- R 00:00
Job run at Tue Jul 11 at 11:25 on (node01:ncpus=2)
[root@pbs-head CS0484021]#
・schedulerログで優先度による並び替えを確認
/var/spool/pbs/sched_logs/<ジョブ実行日付> ファイルで's s scheduling = true'を実行したタイミングの
scheduling cycleを確認
(scheduling cycleは、Starting Scheduling Cycleと;Leaving Scheduling Cycleが一つの単位です)
* by_queueがtrueなのでpriorityが高いhigh_qで実行されたjobid 58,60,62がそれ以外より優先されています。
* リソースが足りずに実行できない57を追い抜いて59が先に実行されています。
...
...
07/11/2023 11:25:24;0080;pbs_sched;Req;;Starting Scheduling Cycle
07/11/2023 11:25:24;0080;pbs_sched;Job;58.pbs-head;Considering job to run
07/11/2023 11:25:24;0040;pbs_sched;Job;58.pbs-head;Job run
07/11/2023 11:25:24;0080;pbs_sched;Job;60.pbs-head;Considering job to run
07/11/2023 11:25:24;0040;pbs_sched;Job;60.pbs-head;Job run
07/11/2023 11:25:24;0080;pbs_sched;Job;62.pbs-head;Considering job to run
07/11/2023 11:25:24;0040;pbs_sched;Job;62.pbs-head;Job run
07/11/2023 11:25:24;0080;pbs_sched;Job;57.pbs-head;Considering job to run
07/11/2023 11:25:24;0040;pbs_sched;Job;57.pbs-head;Insufficient amount of resource: ncpus (R: 6 A: 4 T: 16)
07/11/2023 11:25:24;0080;pbs_sched;Job;59.pbs-head;Considering job to run
07/11/2023 11:25:24;0040;pbs_sched;Job;59.pbs-head;Job run
07/11/2023 11:25:24;0080;pbs_sched;Job;61.pbs-head;Considering job to run
07/11/2023 11:25:24;0040;pbs_sched;Job;61.pbs-head;Not enough free nodes available
07/11/2023 11:25:24;0080;pbs_sched;Req;;Leaving Scheduling Cycle
...
...
1.2.2.Strict Orderingの設定
* 設定のポイント
strict_ordering: True
round_robin: False
job_sort_key: コメントアウト
fair_share: false
backfill_depth: 0
job_sort_formula: 未設定
* strict_orderingの詳細に関しては以下マニュアルを参照お願いします。
* 章番号はversionにより異なる場合がございます。
PBS Professional <version> Administrator’s Guide
4.9.48.1 Configuring Strict Ordering
1.2.2.1.sched_configファイルの設定変更
・エディタでsched_configファイルの編集
●部分を変更しました。round_robin、fair_shareはすでにfalseのなのでそのままとします。
・変更箇所の確認
[root@pbs-head ~]# . /etc/pbs.conf
[root@pbs-head ~]# cat $PBS_HOME/sched_priv/sched_config | grep -v -e '^$' -e '^#'
round_robin: False all
by_queue: True prime
by_queue: True non_prime
strict_ordering: true ALL ●
backfill_prime: false ALL
prime_exempt_anytime_queues: false
primetime_prefix: p_
nonprimetime_prefix: np_
node_sort_key: "sort_priority HIGH" ALL
provision_policy: "aggressive_provision"
resources: "ncpus, mem, arch, host, vnode, aoe, eoe"
smp_cluster_dist: pack
fair_share: false ALL
fairshare_usage_res: cput
fairshare_entity: euser
fairshare_decay_time: 24:00:00
fairshare_decay_factor: 0.5
preemptive_sched: true ALL
dedicated_prefix: ded
[root@pbs-head ~]#
・pbs_schedのPIDを確認
[root@pbs-head ~]# ps -ef | grep [p]bs_sched
root 1635 1 0 10:04 ? 00:00:00 /opt/pbs/sbin/pbs_sched
・kill -HUP <pbs_schedのpid>
[root@pbs-head ~]# kill -HUP 1635
・"Scheduler is reconfiguring"メッセージを確認
[root@pbs-head ~]# cat $PBS_HOME/sched_logs/20230711 | grep reconf
07/11/2023 14:22:35;0040;pbs_sched;Sched;reconfigure;Scheduler is reconfiguring
・backfill_depthを無効にするため各queueおよびserverにbackfill_depth = 0を設定
[root@pbs-head ~]# qmgr -c 's s backfill_depth = 0'
[root@pbs-head ~]# qmgr -c 's q low_q backfill_depth = 0'
[root@pbs-head ~]# qmgr -c 's q high_q backfill_depth = 0'
・job_sort_formulaが未設定であることを確認
[root@pbs-head ~]# qmgr -c 'l s' | grep job_sort_formula
[root@pbs-head ~]
1.2.3.設定後でのジョブのスケジューリングを確認
・テスト対象ジョブを一つのscheduling cycle(ジョブ並び替えの単位)に含めて実行させたいため一旦schedulingを停止します。
[root@pbs-head ~]# qmgr -c 's s scheduling = false'
[root@pbs-head ~]#
・ジョブをsubmit(一般ユーザuser01で実行)
[user01@pbs-head ~]$ echo 'sleep 30' | qsub -q low_q -lncpus=6
63.pbs-head
[user01@pbs-head ~]$ echo 'sleep 30' | qsub -q high_q -lncpus=6
64.pbs-head
[user01@pbs-head ~]$ echo 'sleep 30' | qsub -q low_q -lncpus=4
65.pbs-head
[user01@pbs-head ~]$ echo 'sleep 30' | qsub -q high_q -lncpus=4
66.pbs-head
[user01@pbs-head ~]$ echo 'sleep 30' | qsub -q low_q -lncpus=2
67.pbs-head
[user01@pbs-head ~]$ echo 'sleep 30' | qsub -q high_q -lncpus=2
68.pbs-head
・rootに戻ってschedulingを再開し、ジョブを実行する
[root@pbs-head CS0484021]# qmgr -c 's s scheduling = true'
[root@pbs-head ~]# qstat -s
pbs-head:
Req'd Req'd Elap
Job ID Username Queue Jobname SessID NDS TSK Memory Time S Time
--------------- -------- -------- ---------- ------ --- --- ------ ----- - -----
63.pbs-head user01 low_q STDIN -- 1 6 -- -- Q --
Not Running: Insufficient amount of resource: ncpus (R: 6 A: 4 T: 16)
64.pbs-head user01 high_q STDIN 6465 1 6 -- -- R 00:00
Job run at Tue Jul 11 at 14:34 on (node01:ncpus=6)
65.pbs-head user01 low_q STDIN -- 1 4 -- -- Q --
Not Running: Job would break strict sorted order
66.pbs-head user01 high_q STDIN 6060 1 4 -- -- R 00:00
Job run at Tue Jul 11 at 14:34 on (node02:ncpus=4)
67.pbs-head user01 low_q STDIN -- 1 2 -- -- Q --
Not Running: Job would break strict sorted order
68.pbs-head user01 high_q STDIN 6466 1 2 -- -- R 00:00
Job run at Tue Jul 11 at 14:34 on (node01:ncpus=2)
[root@pbs-head ~]#
・schedulerログで優先度による並び替えを確認
* by_queueがtrueなのでpriorityが高いhigh_qで実行されたjobid 64,66,68がそれ以外より優先されています。
* リソースが足りずに実行できない64を追い抜かずsubmission timeが遅い、65,67は64の実行を待っています。
(このタイミングいでは、ncpus (R: 6 A: 4 T: 16) なので空きが4ありますが、submission timeを厳守
するstrict orderが有効なためJobid 65,67は空きリソースがあっても待ちになります。)
...
...
07/11/2023 14:34:40;0080;pbs_sched;Req;;Starting Scheduling Cycle
07/11/2023 14:34:40;0080;pbs_sched;Job;64.pbs-head;Considering job to run
07/11/2023 14:34:40;0040;pbs_sched;Job;64.pbs-head;Job run
07/11/2023 14:34:40;0080;pbs_sched;Job;66.pbs-head;Considering job to run
07/11/2023 14:34:40;0040;pbs_sched;Job;66.pbs-head;Job run
07/11/2023 14:34:40;0080;pbs_sched;Job;68.pbs-head;Considering job to run
07/11/2023 14:34:40;0040;pbs_sched;Job;68.pbs-head;Job run
07/11/2023 14:34:40;0080;pbs_sched;Job;63.pbs-head;Considering job to run
07/11/2023 14:34:40;0040;pbs_sched;Job;63.pbs-head;Insufficient amount of resource: ncpus (R: 6 A: 4 T: 16)
07/11/2023 14:34:40;0040;pbs_sched;Job;65.pbs-head;Job would break strict sorted order
07/11/2023 14:34:40;0040;pbs_sched;Job;67.pbs-head;Job would break strict sorted order
07/11/2023 14:34:40;0080;pbs_sched;Req;;Leaving Scheduling Cycle
...
...
2.Backfilling
2.1.Backfillingとは?
strict_ordering設定やFairshare設定などで優先度がついたジョブの実行順に一定の例外を設定します。
例えば、上記のjobid 65,67はジョブが実行可能なリソースが存在するにも関わらず待ちになりましたが、このようなジョブに対して
一定の条件を満たした場合にジョブの実行(追い越し)を可能にします。
2.2.Backfillingの設定
* 設定のポイント
server, queueのいずれか、もしくは両方にbackfill_depth attributeを設定
* strict_orderingの詳細に関しては以下マニュアルを参照お願いします。
PBS Professional <version> Administrator’s Guide
4.9.3.6 Configuring Backfilling
2.2.1.backfill_depth attributeを設定
* 本例ではqueue attributeとしてlow_qキューにbackfill_depthを設定します。
queueとserverの両方にbackfill_depthが設定されている場合、キューの設定が優先されます。
明示的にbackfill_depth=0をしない限り、デフォルトの1が設定されています。
(つまりインストール後のデフォルト状態ではBackfillingが有効になっている点に注意が必要です。)
* backfill_depth=nのnはtopジョブの数を制御します。
例えば、nが2の場合は一つのscheduling cycleで2つのtopジョブが存在できます。
topジョブとは高優先だがリソース不足のため実行できないジョブにtopジョブフラグがついたものです。
[root@pbs-head user01]# qmgr -c 's q low_q backfill_depth=1'
[root@pbs-head user01]#
2.2.2.動作確認
・テスト対象ジョブを一つのscheduling cycle(ジョブ並び替えの単位)に含めて実行させたいため一旦schedulingを停止します。
[root@pbs-head ~]# qmgr -c 's s scheduling = false'
[root@pbs-head ~]#
・ジョブをsubmit(一般ユーザuser01で実行)
* Backfillingは適切なwalltimeで指定した時間を前提に動作する設定なので、原則として全てのジョブにwalltimeを設定します。
[user01@pbs-head ~]$ qstat -s
[user01@pbs-head ~]$ echo 'sleep 600' | qsub -q low_q -lncpus=6 -lwalltime=0:10:00
92.pbs-head
[user01@pbs-head ~]$ echo 'sleep 600' | qsub -q high_q -lncpus=6 -lwalltime=0:10:00
93.pbs-head
[user01@pbs-head ~]$ echo 'sleep 300' | qsub -q low_q -lncpus=4 -lwalltime=0:05:00
94.pbs-head
[user01@pbs-head ~]$ echo 'sleep 300' | qsub -q high_q -lncpus=4 -lwalltime=0:05:00
95.pbs-head
[user01@pbs-head ~]$ echo 'sleep 300' | qsub -q low_q -lncpus=2 -lwalltime=0:05:00
96.pbs-head
[user01@pbs-head ~]$ echo 'sleep 300' | qsub -q high_q -lncpus=2 -lwalltime=0:05:00
97.pbs-head
[user01@pbs-head ~]$
・rootに戻ってschedulingを再開し、ジョブを実行する
[root@pbs-head user01]# qmgr -c 's s scheduling = true'
[root@pbs-head user01]# qstat -s
pbs-head:
Req'd Req'd Elap
Job ID Username Queue Jobname SessID NDS TSK Memory Time S Time
--------------- -------- -------- ---------- ------ --- --- ------ ----- - -----
92.pbs-head user01 low_q STDIN -- 1 6 -- 00:10 Q --
Not Running: Insufficient amount of resource: ncpus (R: 6 A: 4 T: 16)
93.pbs-head user01 high_q STDIN 8597 1 6 -- 00:10 R 00:00
Job run at Tue Jul 11 at 16:56 on (node01:ncpus=6)
94.pbs-head user01 low_q STDIN 7991 1 4 -- 00:05 R 00:00
Job run at Tue Jul 11 at 16:56 on (node02:ncpus=4)
95.pbs-head user01 high_q STDIN 7990 1 4 -- 00:05 R 00:00
Job run at Tue Jul 11 at 16:56 on (node02:ncpus=4)
96.pbs-head user01 low_q STDIN -- 1 2 -- 00:05 Q --
Not Running: Not enough free nodes available
97.pbs-head user01 high_q STDIN 8598 1 2 -- 00:05 R 00:00
Job run at Tue Jul 11 at 16:56 on (node01:ncpus=2)
[root@pbs-head user01]#
* by_queueがtrueなのでpriorityが高いhigh_qで実行されたjobid 93,95,97がそれ以外より優先されています。
* リソースが足りずに実行できないjobid 92にtop job フラグが設定され実行開始予定時間が算出されています。
* top jobであるjobid 92の実行開始予定時間(at Tue Jul 11 17:01:26 2023)に
影響を及ぼさず実行可能なjobid 94がjobid 92を追い越して実行開始しています。
(jobid 94はwalltime=0:05:00を指定して実行しているので、 17:01:26 2023 までに実行終了すると見なされる。)
07/11/2023 16:56:26;0080;pbs_sched;Req;;Starting Scheduling Cycle
07/11/2023 16:56:26;0080;pbs_sched;Job;93.pbs-head;Considering job to run
07/11/2023 16:56:26;0040;pbs_sched;Job;93.pbs-head;Job run
07/11/2023 16:56:26;0080;pbs_sched;Job;95.pbs-head;Considering job to run
07/11/2023 16:56:26;0040;pbs_sched;Job;95.pbs-head;Job run
07/11/2023 16:56:26;0080;pbs_sched;Job;97.pbs-head;Considering job to run
07/11/2023 16:56:26;0040;pbs_sched;Job;97.pbs-head;Job run
07/11/2023 16:56:26;0080;pbs_sched;Job;92.pbs-head;Considering job to run
07/11/2023 16:56:26;0080;pbs_sched;Job;92.pbs-head;Job is a top job and will run at Tue Jul 11 17:01:26 2023
07/11/2023 16:56:26;0040;pbs_sched;Job;92.pbs-head;Insufficient amount of resource: ncpus (R: 6 A: 4 T: 16)
07/11/2023 16:56:26;0080;pbs_sched;Job;94.pbs-head;Considering job to run
07/11/2023 16:56:26;0040;pbs_sched;Job;94.pbs-head;Job run
07/11/2023 16:56:26;0080;pbs_sched;Job;96.pbs-head;Considering job to run
07/11/2023 16:56:26;0040;pbs_sched;Job;96.pbs-head;Not enough free nodes available
07/11/2023 16:56:26;0080;pbs_sched;Req;;Leaving Scheduling Cycle
2.2.3.qstat -f(x)によるtopジョブの実行開始予定ノードと時間の確認方法
* Queuing中、もしくは、Rnning中のジョブは
qstat -f <jobid>
すでに終了しているジョブの情報は
qstat -fx <jobid>
で確認します。
* qstat -fxは、事前に、job_history_enable が有効になっている場合に確認可能です。
[root@pbs-head user01]# qstat -fx 92 | grep estimated
estimated.exec_vnode = (node02:ncpus=6)
estimated.start_time = Tue Jul 11 17:01:27 2023
[root@pbs-head user01]#