Job_sort_fromulaを使ったJobの並び替え
この文書ではPBS Professionalのスケジューリングツールであるjob_sort_formulaを使ったジョブの並び替え・動作確認を例を用いて説明します。
----------------------------------------------------
当文書では以下の3台で環境を構成している例を使用します。
pbs-head: pbs_server,pbs_sched,pbs_commの各デーモンが稼働。当例ではjobのsubmitもこのサーバで実施。
node01: pbs_momデーモンが稼働する計算ノード
node02: pbs_momデーモンが稼働する計算ノード
----------------------------------------------------
* 以下の説明中、rootで実施している作業は、rootで実行することを推奨するものではありません。
sudoなど必要なセキュリティ設定を実施することを推奨します。
1.formula (job_sort_formula)の設定と基本動作の確認
1.1.formula (job_sort_formula)とは?
ジョブの並びかえを細分化したレベルを設定するPBSのスケジューリングツールの一つです。
前提としてPBS Professionalによるジョブの並び替えは以下の順に実施されます。
Queue order (by_queue: True の場合に適用されます。インストールデフォルトはTrue。)
job_sort_formula (job_sort_formulaが設定されている場合に適用されます。インストールデフォルトでjob_sort_formulaは設定されていません。)
fairshare (fair_share: true の場合に適用されます。インストールデフォルトでは未設定。)
job sort key (job_sort_key: "cput LOW" などソートが設定されている場合に適用されます。インストールデフォルトはコメントアウトされ無効。)
job submission time(qsubを実行した順番です)
よって、Queueが複数ある環境でそれぞれにPriorityが明示指定されている場合は、Queueが最初にソートされ、formulaはその後に適用されるスケジューリングツールです。ソートするキーは各種設定が可能です。また、複数設定することも可能です。
formulaはqmgrを用いて設定、即時反映されます。
1.2.formulaを設定する
1.2.1.formula設定前(formulaが未設定のインストールデフォルト)でのジョブスケジューリング設定とその動作を確認
・serverに設定されているattributeの確認
* インストールデフォルトでは以下のようにjob_sort_formulaは未設定のため表示されません。
[root@pbs-head ~]# qmgr -c 'p s' | grep formula
[root@pbs-head ~]#
・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
・nodeのリソースを確認(node01,node02それぞれncpus 8のリソースが確認できる)
[root@pbs-head ~]# pbsnodes -aS
vnode state OS hardware host queue mem ncpus nmics ngpus comment
--------------- --------------- -------- -------- --------------- ---------- -------- ------- ------- ------- ---------
node01 free -- -- node01 -- 2gb 8 0 0 --
node02 free -- -- node02 -- 2gb 8 0 0 --
[root@pbs-head ~]#
1.2.2.デフォルト設定の動作確認(job_sort_formula未設定の状態)
・Jobの詳細情報を確認できるようにするためjob_history_enableを有効にします。
[root@pbs-head ~]# qmgr -c 's s job_history_enable = true'
[root@pbs-head ~]#
・テスト対象ジョブを全て一つのscheduling cycle(ジョブ並び替えの単位)に含めたいため、一旦schedulingを停止します。
[root@pbs-head ~]# qmgr -c 's s scheduling = false'
[root@pbs-head ~]#
・ジョブをsubmit(一般ユーザuser01で実行)します。-pオプションはジョブにpriorityを設定するオプションです。
[user01@pbs-head ~]$ echo 'sleep 100' | qsub -p 100
0.pbs-head
[user01@pbs-head ~]$ echo 'sleep 100' | qsub -p 100
1.pbs-head
[user01@pbs-head ~]$ echo 'sleep 100' | qsub -p 101
2.pbs-head
[user01@pbs-head ~]$ echo 'sleep 100' | qsub -p 102
3.pbs-head
・rootに戻ってschedulingを再開し、ジョブを実行します。
[root@pbs-head ~]# qmgr -c 's s scheduling = true'
* s s scheduling = true によって意図したタイミングでのschduling cycleの実行が可能です。
[root@pbs-head ~]# qstat -s
pbs-head:
Req'd Req'd Elap
Job ID Username Queue Jobname SessID NDS TSK Memory Time S Time
--------------- -------- -------- ---------- ------ --- --- ------ ----- - -----
0.pbs-head user01 workq STDIN -- 1 1 -- -- R --
Job run at Tue Oct 24 at 16:30 on (node01:ncpus=1)
1.pbs-head user01 workq STDIN -- 1 1 -- -- R --
Job run at Tue Oct 24 at 16:30 on (node01:ncpus=1)
2.pbs-head user01 workq STDIN -- 1 1 -- -- R --
Job run at Tue Oct 24 at 16:30 on (node01:ncpus=1)
3.pbs-head user01 workq STDIN -- 1 1 -- -- R --
Job run at Tue Oct 24 at 16:30 on (node01:ncpus=1)
[root@pbs-head ~]#
・schedulerログで優先度による並び替えを確認します。
/var/spool/pbs/sched_logs/<ジョブ実行日付> ファイルで's s scheduling = true'を実行したタイミングの
scheduling cycleを確認
(scheduling cycleは、Starting Scheduling Cycleと;Leaving Scheduling Cycleが一つの単位です)
* デフォルトではjobのpriorityをソートするスケジューリングツールが設定されていないので、
submit順に、Jobid 0->1->2->3 という優先度とPBSは評価しています。
...
...
10/24/2023 16:30:40;0080;pbs_sched;Req;;Starting Scheduling Cycle
10/24/2023 16:30:40;0080;pbs_sched;Job;0.pbs-head;Considering job to run
10/24/2023 16:30:40;0040;pbs_sched;Job;0.pbs-head;Job run
10/24/2023 16:30:40;0080;pbs_sched;Job;1.pbs-head;Considering job to run
10/24/2023 16:30:40;0040;pbs_sched;Job;1.pbs-head;Job run
10/24/2023 16:30:40;0080;pbs_sched;Job;2.pbs-head;Considering job to run
10/24/2023 16:30:40;0040;pbs_sched;Job;2.pbs-head;Job run
10/24/2023 16:30:40;0080;pbs_sched;Job;3.pbs-head;Considering job to run
10/24/2023 16:30:40;0040;pbs_sched;Job;3.pbs-head;Job run
10/24/2023 16:30:40;0080;pbs_sched;Req;;Leaving Scheduling Cycle
1.2.3.job_sort_formulaを設定してjobのpriorityを並び替える
・job_sort_formulaを設定します(以下例では引数として"job_priority"を指定)
[root@pbs-head ~]# qmgr -c 's s job_sort_formula = job_priority'
[root@pbs-head ~]# qmgr -c 'p s' | grep formula
set server job_sort_formula = job_priority
1.2.4.job_sort_formula = job_priority'設定後の動作確認
・テスト対象ジョブを全て一つのscheduling cycle(ジョブ並び替え処理の単位)に含めたいため、一旦schedulingを停止します。
[root@pbs-head ~]# qmgr -c 's s scheduling = false'
[root@pbs-head ~]#
・ジョブをsubmit(一般ユーザuser01で実行)します。-pオプションはジョブにpriorityを設定するオプションです。
[user01@pbs-head ~]$ echo 'sleep 100' | qsub -p 100
5.pbs-head
[user01@pbs-head ~]$ echo 'sleep 100' | qsub -p 100
6.pbs-head
[user01@pbs-head ~]$ echo 'sleep 100' | qsub -p 101
7.pbs-head
[user01@pbs-head ~]$ echo 'sleep 100' | qsub -p 102
8.pbs-head
[user01@pbs-head ~]$
・rootに戻ってschedulingを再開し、ジョブを実行します。
[root@pbs-head ~]# qmgr -c 's s scheduling = true'
* s s scheduling = true によって意図したタイミングでのschduling cycleの実行が可能です。
[root@pbs-head ~]# qstat -s
pbs-head:
Req'd Req'd Elap
Job ID Username Queue Jobname SessID NDS TSK Memory Time S Time
--------------- -------- -------- ---------- ------ --- --- ------ ----- - -----
5.pbs-head user01 workq STDIN 3061 1 1 -- -- R 00:00
Job run at Tue Oct 24 at 16:46 on (node01:ncpus=1)
6.pbs-head user01 workq STDIN 3062 1 1 -- -- R 00:00
Job run at Tue Oct 24 at 16:46 on (node01:ncpus=1)
7.pbs-head user01 workq STDIN 3060 1 1 -- -- R 00:00
Job run at Tue Oct 24 at 16:46 on (node01:ncpus=1)
8.pbs-head user01 workq STDIN 3059 1 1 -- -- R 00:00
Job run at Tue Oct 24 at 16:46 on (node01:ncpus=1)
[root@pbs-head ~]#
・schedulerログで優先度による並び替えを確認します。
/var/spool/pbs/sched_logs/<ジョブ実行日付> ファイルで's s scheduling = true'を実行したタイミングの
scheduling cycleを確認
(scheduling cycleは、Starting Scheduling Cycleと;Leaving Scheduling Cycleが一つの単位です)
* デフォルト設定とは異なり、set server job_sort_formula = job_priorityが設定され、ジョブのpriorityでの並び替えが有効になっています。
その結果、設定されたジョブのpriority順にジョブの並び替えが実施され、
まずpriorityの大きい順でソート、その後、同一priorityのジョブはsubmit順という優先度になりました。
Jobid 8(priority 102)->7(priority 101)->5(priority 100),6(priority 100)
...
...
10/24/2023 16:46:24;0080;pbs_sched;Req;;Starting Scheduling Cycle
10/24/2023 16:46:24;0080;pbs_sched;Job;8.pbs-head;Considering job to run
10/24/2023 16:46:24;0040;pbs_sched;Job;8.pbs-head;Job run
10/24/2023 16:46:24;0080;pbs_sched;Job;7.pbs-head;Considering job to run
10/24/2023 16:46:24;0040;pbs_sched;Job;7.pbs-head;Job run
10/24/2023 16:46:24;0080;pbs_sched;Job;5.pbs-head;Considering job to run
10/24/2023 16:46:24;0040;pbs_sched;Job;5.pbs-head;Job run
10/24/2023 16:46:24;0080;pbs_sched;Job;6.pbs-head;Considering job to run
10/24/2023 16:46:24;0040;pbs_sched;Job;6.pbs-head;Job run
10/24/2023 16:46:24;0080;pbs_sched;Req;;Leaving Scheduling Cycle
2.複数条件を設定したformulaの設定とデバック方法
2.1.複数条件をformulaに設定
・複数条件(ncpusのリクエスト*2に加えて、walltimeのリクエスト*0.05)をソートキーとします。
[root@pbs-head ~]# qmgr -c 's s job_sort_formula = 2*ncpus+0.05*walltime'
[root@pbs-head ~]# qmgr -c 'p s' | grep formula
set server job_sort_formula = 2*ncpus+0.05*walltime
[root@pbs-head ~]#
2.2.schedulerログのデバックレベルを上げる
・schedulerログのデバック情報(job_sort_formulaのソートキーとなる値)を確認するためデバックレベルを変更します。
[root@pbs-head ~]# qmgr -c 's sched log_events = 4095'
[root@pbs-head ~]#
2.3. job_sort_formula = 2*ncpus+0.05*walltime 設定後の動作確認
・テスト対象ジョブを一つのscheduling cycle(ジョブ並び替え処理の単位)に含めて実行させたいため一旦schedulingを停止します。
[root@pbs-head ~]# qmgr -c 's s scheduling = false'
[root@pbs-head ~]#
・ジョブをsubmit(一般ユーザuser01で実行)します。ncpus/walltimeを明示指定しています。
[user01@pbs-head ~]$ echo 'sleep 100' | qsub -l ncpus=4 -l walltime=1:00
14.pbs-head
[user01@pbs-head ~]$ echo 'sleep 100' | qsub -l ncpus=4 -l walltime=2:00
15.pbs-head
[user01@pbs-head ~]$ echo 'sleep 100' | qsub -l ncpus=2 -l walltime=1:00
16.pbs-head
[user01@pbs-head ~]$ echo 'sleep 100' | qsub -l ncpus=2 -l walltime=2:00
17.pbs-head
[user01@pbs-head ~]$
・rootに戻ってschedulingを再開し、ジョブを実行します。
[root@pbs-head ~]# qmgr -c 's s scheduling = true'
* s s scheduling = true によって意図したタイミングでのschduling cycleの実行が可能です。
[root@pbs-head ~]# qstat -s
pbs-head:
Req'd Req'd Elap
Job ID Username Queue Jobname SessID NDS TSK Memory Time S Time
--------------- -------- -------- ---------- ------ --- --- ------ ----- - -----
14.pbs-head user01 workq STDIN -- 1 4 -- 00:01 R --
Job run at Tue Oct 24 at 18:11 on (node01:ncpus=4)
15.pbs-head user01 workq STDIN -- 1 4 -- 00:02 R --
Job run at Tue Oct 24 at 18:11 on (node01:ncpus=4)
16.pbs-head user01 workq STDIN -- 1 2 -- 00:01 R --
Job run at Tue Oct 24 at 18:11 on (node02:ncpus=2)
17.pbs-head user01 workq STDIN -- 1 2 -- 00:02 R --
Job run at Tue Oct 24 at 18:11 on (node02:ncpus=2)
・schedulerログで優先度による並び替えを確認します。
/var/spool/pbs/sched_logs/<ジョブ実行日付> ファイルで's s scheduling = true'を実行したタイミングの
scheduling cycleを確認
(scheduling cycleは、Starting Scheduling Cycleと;Leaving Scheduling Cycleが一つの単位です)
* s s job_sort_formula = 2*ncpus+0.05*walltimeが設定されているので、各ジョブのncpus/walltimeのリクエストがジョブの並び替えに影響を与えています。
PBSが並び替えに用いた値は、shedulerログ内の"Formula Evaluation ="の値で確認できます。
Jobid14は11, 15は14, 16は7, 17は10です。
この結果、値が大きい順、つまり、jobid 15->14->17-16の順に並び替えられたことが以下のログより確認できます。
...
...
10/24/2023 18:11:43;0080;pbs_sched;Req;;Starting Scheduling Cycle
10/24/2023 18:11:43;0100;pbs_sched;Svr;;It is primetime. It will never end
10/24/2023 18:11:43;0400;pbs_sched;Sched;create_resresv_sets;Number of job equivalence classes: 4
10/24/2023 18:11:43;0400;pbs_sched;Node;create_node_buckets;Created node bucket ncpus=8:accelerator=False
10/24/2023 18:11:43;0100;pbs_sched;Job;14.pbs-head;Formula Evaluation = 11
10/24/2023 18:11:43;0100;pbs_sched;Job;15.pbs-head;Formula Evaluation = 14
10/24/2023 18:11:43;0100;pbs_sched;Job;16.pbs-head;Formula Evaluation = 7
10/24/2023 18:11:43;0100;pbs_sched;Job;17.pbs-head;Formula Evaluation = 10
10/24/2023 18:11:43;0080;pbs_sched;Job;15.pbs-head;Considering job to run
10/24/2023 18:11:43;0400;pbs_sched;Node;15.pbs-head;Evaluating subchunk: ncpus=4
10/24/2023 18:11:43;0400;pbs_sched;Node;node01;Node allocated to job
10/24/2023 18:11:43;0400;pbs_sched;Node;15.pbs-head;Allocated one subchunk: ncpus=4
10/24/2023 18:11:43;0040;pbs_sched;Job;15.pbs-head;Job run
10/24/2023 18:11:43;0080;pbs_sched;Job;14.pbs-head;Considering job to run
10/24/2023 18:11:43;0400;pbs_sched;Node;14.pbs-head;Evaluating subchunk: ncpus=4
10/24/2023 18:11:43;0400;pbs_sched;Node;node01;Node allocated to job
10/24/2023 18:11:43;0400;pbs_sched;Node;14.pbs-head;Allocated one subchunk: ncpus=4
10/24/2023 18:11:43;0040;pbs_sched;Job;14.pbs-head;Job run
10/24/2023 18:11:43;0080;pbs_sched;Job;17.pbs-head;Considering job to run
10/24/2023 18:11:43;0400;pbs_sched;Node;17.pbs-head;Evaluating subchunk: ncpus=2
10/24/2023 18:11:43;0400;pbs_sched;Node;node02;Node allocated to job
10/24/2023 18:11:43;0400;pbs_sched;Node;17.pbs-head;Allocated one subchunk: ncpus=2
10/24/2023 18:11:43;0040;pbs_sched;Job;17.pbs-head;Job run
10/24/2023 18:11:43;0080;pbs_sched;Job;16.pbs-head;Considering job to run
10/24/2023 18:11:43;0400;pbs_sched;Node;16.pbs-head;Evaluating subchunk: ncpus=2
10/24/2023 18:11:43;0400;pbs_sched;Node;node02;Node allocated to job
10/24/2023 18:11:43;0400;pbs_sched;Node;16.pbs-head;Allocated one subchunk: ncpus=2
10/24/2023 18:11:43;0040;pbs_sched;Job;16.pbs-head;Job run
10/24/2023 18:11:43;0080;pbs_sched;Req;;Leaving Scheduling Cycle
10/24/2023 18:13:00;0080;pbs_sched;Req;;Starting Scheduling Cycle
...
...
・確認が済んだので、schedulerログのデバックレベルを元に戻します。
[root@pbs-head ~]# qmgr -c 's sched log_events = 767'
[root@pbs-head ~]#
* job_sort_formulaの詳細に関しては以下マニュアルを参照お願いします。
PBS Professional <version> Administrator’s Guide
4.9.21 Using a Formula for Computing Job Execution Priority