Job_sort_fromulaを使ったJobの並び替え

Shiratori Altair
Shiratori Altair
Altair Employee
edited October 2023 in Altair HPCWorks - 日本語

この文書では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

Welcome!

It looks like you're new here. Sign in or register to get started.

Welcome!

It looks like you're new here. Sign in or register to get started.