ジョブ実行
ジョブ実行
概要
ワークサーバよりバッチジョブを投入すると、IBM社のPlatform Load Sharing Facility (以下LSF)によりスケジューリングされて計算サーバにて実行されます。ジョブの種類に応じて、適切なバッチキューにジョブを投入する必要があります。
※バッチキューについては、こちらをご覧ください。
ジョブ投入
注意事項
Info
実行時間が極端に短いジョブ(30秒以下)を大多数個(100個以上)実行する場合は、逐次的に実行するようにシェルスクリプトで束ねたうえで、bsubコマンドでLSFに投入してください。(sキューにジョブを投入する場合は、LSF Session Schedulerも利用してください。) 個々のジョブに対するLSFの管理時間よりも、実行時間が短すぎると中央計算機全体のパフォーマンスが低下します。
Info
各サーバにてメモリの利用率が 90%を超えた場合は、システム保護のために原因となっている一連のプロセスを強制終了することがありますので、予めご了承ください。
Info
ユーザホーム領域の空き容量が100MB以下になると、ホーム領域枯渇によるジョブ失敗を防ぐ為、ジョブ投入が一時的にできなくなります。空き容量が100MBを超えると、再度投入可能となります。
ホーム領域の確認方法についてはこちらからご確認ください。
ジョブの投入方法
LSFへのジョブの投入は以下の様に行います。
$> bsub [-q キュー名 -m "ホスト名" ] ジョブ名↓
[使用例]
$> bsub -q s testjobs↓
- 通常は、ホスト名(=ジョブを実行するホスト名)の指定は不要です。LSFシステムが適切な計算サーバを選択します。
- 計算サーバからジョブの投入はできません。
また、本計算システムでは LSFにより MPI を使用したジョブを投入可能となっています。
詳細はMPI ジョブ実行を参照してください。
完了通知メールの送付
Info
大量の完了メール送信が確認された場合、システム側でメールを削除することがあります。
バッチジョブの完了をメールで通知する場合は、以下のオプションを指定します。
この時、ジョブの実行結果は必ずファイルに出力してください。
詳細は実行結果(標準出力・標準エラー)を参照してください。
$> bsub -q s -u メールアドレス -o ファイル名もしくはディレクトリ名 -N ジョブ名↓
[使用例]
$> bsub -q s -u testuser01@post.kek.jp -o lsflog/result.log -N testjobs↓
実行結果(標準出力・標準エラー)
HSM 上へのジョブ出力は不適なため、以下条件に抵触した場合:
- 標準出力・標準エラー出力先が HSM 領域
- HSM 領域上で bsub を実行している
以下メッセージが出力されbsub が失敗します。
---------------------------------------------------------
HSM area is not suitable to output logfiles from jobs.
It may cause a system crash.
Would you check your jobs and job-submission environment?
See: http://kekcc.kek.jp/service/kekcc/html/Eng/JobExecution.html#sa89ac76
Thank you for your understanding and cooperation.
---------------------------------------------------------
デフォルト設定
ジョブ出力はデフォルトで、ホームディレクトリの「.lsfディレクトリ以下」に、"ジョブID.out"というファイル名で出力されます。
例: CEグループのtestuser1のジョブID111の場合
/home/ce/testuser1/.lsf/111.out
ファイル指定
明示的にファイルとして出力するには、ジョブ投入時に -o でディレクトリ または/および ファイル名を指定します。 ディレクトリを指定した場合は、指定したディレクトリ配下に、ファイル名 "ジョブID.out "で結果が出力されます。
$> bsub -o "ファイル名もしくはディレクトリ名" ジョブ名↓
[使用例]
$> bsub -o lsflog/ tetestjobs↓
※ジョブの実行結果ファイルが、カレントディレクトリにあるlsflog下に作成されます。ファイル名は、"ジョブID.out "です。
[使用例]
$> bsub -o lsflog/result.log tetestjobs2↓
※ジョブの実行結果ファイルが、カレントディレクトリにあるlsflog下に作成されます。ファイル名は、"result.log"です。
同一ファイルを指定した場合
複数のジョブで-oの設定に同じファイル名を指定した場合、結果は既存のファイルへの追記となります。
出力の制限
デフォルト設定やファイル指定でのジョブ出力は、システムにより 200MB に制限されます。
この制限を回避するためにはプログラムで出力を制御するか、シェルのリダイレクトを使用してください。
[使用例] csh系の場合
$> bsub "testjob >& lsflog/result.log"↓
[使用例] bash 系の場合
$> bsub "testjob > lsflog/result.log 2>&1"↓
バッチジョブの状態確認
ジョブの確認は、bjobsコマンドにて可能です。
$> bjobs ジョブID↓
[使用例]
$> bjobs 111↓
ジョブを投入し実行が開始されたら /usr/local/bin/chk_runjob コマンドで計算ノードにおける状態を確認してください。
※情報は一分間に一度更新されます
※ MPI ジョブには対応していません
$> chk_runjob
JOBS SLOT CPUTIME RUNTIME CPU/RUN
1500 1500 125649261 126740225 0.991
-lオプションを付与する事で各ジョブの概要を実行時間の長いものから確認する事ができます。
オプションの後に数字をつけることで表示するジョブ数を指定できます。(デフォルトは全件表示)
$> chk_runjob -l 5
JOBS SLOT CPUTIME RUNTIME CPU/RUN
1500 1500 125649261 126740225 0.991
RUN JOB SUMMARY:
JOBID QUEUE EXEC_HOST STARTTIME CPUTIME RUNTIME UTIL EXEC_JOB
30351511 l cb241 03/31-09:22:21 023:22:00 023:31:09 99.35% java
30351564 l cb241 03/31-09:22:42 023:21:36 023:30:48 99.35% java
30351774 l cb241 03/31-09:23:50 023:18:59 023:29:40 99.24% java
30351978 l cb241 03/31-09:25:03 023:19:30 023:28:27 99.36% java
30352009 l cb241 03/31-09:25:23 023:16:06 023:28:07 99.15% java
ジョブの詳細を確認したい場合は bjobs -l JOBID で確認する事が可能です。
下記のような場合は実行効率が極端に低くなりCPU/RUNの値が低くなります。
- 極端に実行時間の短いジョブ(10-30秒以下)の連続 or 大量投入
- コマンドの間違いなど、正常に実行できないコマンドの投入
- 一つのディレクトリに、大多数のジョブからのファイル出力
- 一つのファイルへ、大多数のジョブからの読み取り
- ディレクトリ $HOME/.lsf に大量のファイルがある
- $HOME領域を使い切っている --> rquotaコマンド、bquotaコマンド(Belleユーザ専用)、もしくはhquotaコマンドで確認可能
目安として、CPU/RUN < 0.6の場合は原因の調査を行い、利用効率の向上の努力をお願いします。
また、ジョブ実行中の標準出力はbpeekにて確認できます。
$> bpeek ジョブID↓
[使用例]
$> bpeek 111↓
実行後のジョブ情報はbhistにて確認できます。
- -l オプションを付与する事で詳細な情報を確認可能です。 "No matching job found" となってしまう場合は、-n 0 オプションで過去に遡って確認できます。
$> bhist -l ジョブID↓
[使用例]
$> bhist -l 111↓
上記コマンドで情報が取得できなかった場合はbacctにて確認できます。
- -l オプションを付与する事で詳細な情報を確認可能です。
$> bacct -l ジョブID↓
[使用例]
$> bacct -l 111↓
ホストの状態確認
ホストの負荷状況は、lsloadコマンドにて可能です。
$> lsload↓
[使用例]
$> lsload↓
HOST_NAME status r15s r1m r15m ut pg ls it tmp swp mem
cb042 ok 0.0 0.0 0.0 0% 0.0 0 2714 40G 23.9G 822G
cb013 ok 0.0 0.0 0.0 0% 0.0 0 2273 40G 23.9G 820G
cb019 ok 0.0 0.0 0.0 0% 0.0 0 2283 40G 23.9G 820G
...<省略>..
また、各ホストのジョブ投入状況はbhostsにて確認できます。
$> bhosts↓
[使用例]
$> bhosts↓
HOST_NAME STATUS JL/U MAX NJOBS RUN SSUSP USUSP RSV
cb001 ok - 192 0 0 0 0 0
cb002 ok - 192 0 0 0 0 0
cb003 ok - 192 0 0 0 0 0
cb004 ok - 192 100 100 0 0 0
cb005 ok - 192 0 0 0 0 0
...<省略>..
キャンセル
ジョブの取り消しは、bkillコマンドにて可能です。
$> bkill ジョブID↓
ジョブIDを 0 にすると、自身が投入した全ての JOB を終了させます。
[使用例]
$> bkill 111↓
ノードの障害等で bkill コマンドが正常に完了しない場合、-r オプションを使用することで強制的にジョブの取り消しを行うことが可能です。 ここで、bkill コマンドが正常に完了しない場合とは、以下のような状態の事を指します。
- bkill 実行時に「Job
is being terminated」等のメッセージが表示される - bkill を実行してもジョブが取り消されない( bjobs コマンドで表示され続ける)
$> bkill -r ジョブID↓
[使用例]
$> bkill -r 111↓
システムによるジョブの停止
- 実行中のジョブが下記のシステム側の設定したしきい値に達した場合、システムにより停止される事があります。
停止の理由 | bacctコマンドに表示されるメッセージ4 |
---|---|
実行時間制限1 | Completed |
CPU時間制限1 | Completed |
物理メモリ制限1 | Completed |
仮想メモリ制限1 | Completed |
プロセス数制限1 | Completed |
標準出力サイズ制限2 | Completed |
サスペンド時間制限 3 | Completed |
$> bacct -l ジョブID↓
スケジューリングポリシー
LSFでは、計算資源を公平に利用できるようフェアシェアという機能を使用しています。フェアシェアは、ユーザがジョブを投入する際に優先順位付けを行います。 現在のフェアシェアの値がどのように設定されているかは、次のコマンドで確認できます。
$> bqueues -l キュー名↓
[使用例]
$> bqueues -l s↓
SHARE_INFO_FOR: s/
USER/GROUP SHARES PRIORITY STARTED RESERVED CPU_TIME RUN_TIME ADJUST GPU_RUN_TIME
user-a 1 0.333 0 0 0.0 0 0.000 0
user-b 1 0.333 0 0 0.0 0 0.000 0
user-c 1 0.333 0 0 0.0 0 0.000 0
user-d 1 0.012 1 0 872.8 399993 0.000 0
user-e 1 0.008 1 0 0.0 574239 0.000 0
user-f 1 0.005 2 0 2588.0 1003056 0.000 0
user-g 1 0.004 31 0 36821.6 667907 0.000 0
user-h 1 0.003 98 0 94953.1 432167 0.000 0
user-i 1 0.001 17 0 17307.1 3447528 0.000 0
user-j 1 0.000 27 0 23340.3 12779340 0.000 0
最低リソース保証 (GRA, Guaranteed Resource Allocation)
最低リソース保証として、aキューには、ユーザあたり4本まで、他のキューより優先して、ジョブを流すことができます。
すぐに結果が欲しいジョブがあるけど、通常キューではジョブがすぐに流れない場合などに利用できます。
キューの設定は、lキューの設定に準じています。
大メモリ使用時の利用方法
s, l, h, p, z, b_b, b2_a, cmb_p, th, p400, ph, g の場合、お使いのメモリ量に合わせて bsubのオプション -n "並列数 X"を TASKLIMITの設定値の範囲で指定してジョブを投入します。
[例/sキュー]
TASKLIMIT = 12 が設定されています。
同キューで使用可能なメモリは以下のものとなります。
1を指定 -> 1 SLOTS 確保 8GB * 1 = MEMLIMIT = 8GB
2を指定 -> 2 SLOTS 確保 8GB * 2 = MEMLIMIT = 16GB
3を指定 -> 3 SLOTS 確保 8GB * 3 = MEMLIMIT = 24GB
4を指定 -> 4 SLOTS 確保 8GB * 4 = MEMLIMIT = 32GB
5を指定 -> 5 SLOTS 確保 8GB * 5 = MEMLIMIT = 40GB
6を指定 -> 6 SLOTS 確保 8GB * 6 = MEMLIMIT = 48GB
MPI ジョブ実行
本計算システムでは、LSFにより MPI を使用したジョブが投入可能となっています。 コンパイル方法については「コンパイル」を参照してください。
MPIジョブ実行の手順
MPIジョブを実行するにはジョブ投入スクリプトを作成する必要があります。
bsubのオプションは引数として指定する以外にスクリプト内に記述することも可能です。
ここではスクリプト内に記述する方法を示します。
ジョブスクリプトの作成
プログラム実行の前にmoduleコマンドで環境変数設定を行います。
設定可能なmoduleファイルはこちらを参照してください。
その後、mpirunコマンドでプログラムを実行します。
[スクリプト例]
#!/bin/bash
##---- bsub オプション指定
#BSUB -n 24 #使用スロット数
#BSUB -q p #キューの指定
##---- 環境設定
module load intel/2024
##---- 実行
mpirun -np 24 ./a.out
ジョブ投入
$> bsub < ジョブスクリプト↓
[使用例]
$> cat mpijob_intel.sh ↓
#!/bin/bash
#BSUB -n 24
#BSUB -q p
module load intel/2024
mpirun -np 24 ./a.out
$>
$> bsub < mpijob_intel.sh↓
並列(MPI)ジョブの投入キューの制限
MPI ジョブは専用のキュー p に投入する必要があります。bsub で必ず -q p を指定してください。
キュー p およびは TASKLIMIT (タスクあたりの使用スロット制限) が 64 に設定されています。64 並列以上のジョブは投入できません。
MPI ジョブ投入直後、以下のようなエラーにより異常終了する場合があります。これは一時的にシステムの制限に抵触した事を示すものです。以下のようなエラーが発生した場合はジョブを再投入してください。
ipath_userinit: assign_context command failed: Network is down
can't open /dev/ipath, network down (err=26)
ipath_userinit: assign_context command failed: Invalid argument
Driver initialization failure on /dev/ipath (err=23)
並列(MPI)ジョブ実行ホストの選択
KEK 環境での MPI ジョブのジョブスロット使用順序は、まず同一ノード内のスロットが使用され、1ノードのスロット上限値 192 に達すると、他のノードのスロットが使用される、という設定になっています。
例) 12並列の MPI ジョブを投入した場合:
node01 ... 12プロセス実行
node02 ... 0プロセス実行
node03 ... 0プロセス実行
node04 ... 0プロセス実行
...
node12 ... 0プロセス実行
1ノード 1スロットで 12並列の MPI ジョブを実行したい場合は、bsub のオプションに -R span[ptile=1] を指定してください。引数またはジョブスクリプト内で指定することが可能です。
- 引数で指定する場合
$> bsub -R span[ptile=1] < ジョブスクリプト↓
- スクリプト内に記述する場合
ジョブスクリプトに以下の行を記述します。
#BSUB -R span[ptile=1]
指定する事で、以下のように実行可能です。
node01 ... 1プロセス実行
node02 ... 1プロセス実行
node03 ... 1プロセス実行
node04 ... 1プロセス実行
...
node12 ... 1プロセス実行
LSF Session Schedulerの利用
LSF Session Schedulerについて
LSFクラスタにおいて、下記条件を満たすジョブを大量に実行する場合には、LSF Session Scheduler(以下、LSF SS)を利用してください。
- 実行時間が短時間(30秒以内)である。
- リソースを多く消費しない LSF SSを利用することにより、上記条件に合致したジョブのスループットを向上させることが可能です。
事前準備
LSF SSにてジョブを実行するために、タスクファイルを作成します。 タスクファイルはジョブに実行させたいコマンドの羅列となります。
例:my.task
# cat my.task
hostname
date
/home/xxx/user/script.sh
個別のタスクの実行結果を出力させたい場合には、タスクファイル中に -o(標準出力) および -e(エラー出力) オプションを記載します。 LSF SSでは、通常の出力ファイルには実行結果が表示されないため、必要な場合には指定をしてください。
例:my.task2
# cat my.task2
-o sample.out -e sample.err hostname
上記例では、標準出力がsample.outに、エラー出力がsample.errに出力されます。
また、下記のパラメータを指定することも可能です。
%J : ジョブID
%T : タスクID
ジョブIDは実行ジョブのジョブIDであり、タスクIDはタスクファイルの行数になります。 例えば、以下の例でジョブIDが10000の場合、10000.1.out、10000.1.err、10000.2.outおよび10000.2.errの4つの出力ファイルが生成されます。
例:my.task3
# cat my.task3
-o %J.%T.out -e %J.%T.err hostname
-o %J.%T.out -e %J.%T.err date
ジョブ実行
LSF SSのジョブの実行手順について示します。 LSF SSはsキューでのみ実行可能です。必ず -q オプションでsキューを指定してください。
$ bsub -app ssched <LSF option> ssched -tasks <task file>
例: $ bsub -app ssched -q s ssched -tasks my.taks3
ジョブの状況については、通常のジョブと同様に、bjobsコマンドにて確認することが可能です。
ジョブのキャンセルについても、通常のジョブと同様となります。
その他
sキュー以外のキューにてLSF SSを使用した場合、エラーとなりますのでご注意ください。
LSF is Rejecting your job submission...
ssched is available for only s queue. Job not submitted.
利用上の注意
/tmpディレクトリ
/tmpのディレクトリは、システムの基本ソフトウェアが一時的に使用するディレクトリです。 ユーザ自身が容量の大きなファイルや大量のファイルを作成することはご遠慮ください。 もし、/tmpディレクトリの使用率が高くなった場合、大きなサイズのファイルは削除されます。
ジョブ中でのステージ処理
ステージされていない(GHIディスク領域に存在しない)ファイルを読み込む(ステージする)ジョブを大量に投入すると、システムのCPU利用率低下の原因となります。
扱うファイルが決まっている場合はファイルのステージ処理を参考にして事前にファイルをGHIディスク領域にステージしてからジョブを投入してください。