ジョブ実行

概要

ワークサーバよりバッチジョブを投入すると 、IBM社のPlatform Load Sharing Facility (以下LSF)によりスケジューリングされて計算サーバにて実行されます。 ジョブの種類に応じて、適切なバッチキューにジョブを投入する必要があります。

※バッチキューについては、こちらをご覧ください。

ジョブ投入

注意事項

実行時間が極端に短いジョブ(30秒以下)を大多数個(100個以上)実行する場合は、逐次的に実行するようにシェルスクリプトで束ねたうえで、bsubコマンドでLSFに投入してください。(sキューにジョブを投入する場合は、LSF Session Schedulerも利用してください。) 個々のジョブに対するLSFの管理時間よりも、実行時間が短すぎると中央計算機全体のパフォーマンスが低下します。
各サーバにてメモリの利用率が 90%を超えた場合は、システム保護のために原因となっている一連のプロセスを強制終了することがありますので、予めご了承下さい。
ユーザホーム領域の空き容量が100MB以下になると、ホーム領域枯渇によるジョブ失敗を防ぐ為、ジョブ投入が一時的に出来なくなります。空き容量が100MBを超えると、再度投入可能となります。
ホーム領域の確認方法についてはこちらからご確認下さい。

ジョブの投入方法

LSFへのジョブの投入は以下の様に行います。

 $> bsub [-q キュー名 -m "ホスト名" ] ジョブ名

[使用例]

 $> bsub -q s testjobs
  • 通常は、ホスト名(=ジョブを実行するホスト名)の指定は不要です。LSFシステムが適切な計算サーバを選択します。
  • 計算サーバからジョブの投入はできません。

また、本計算システムでは LSFにより OpenMPI/OpenMP を使用したジョブを投入可能となっています。 詳細はMPI ジョブ実行またはOpenMP ジョブ実行をご参照ください。

実行結果(標準出力・標準エラー)

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 "です。

[使用例2]

 $> bsub -o lsflog/result.log tetestjobs2

※ジョブの実行結果ファイルが、カレントディレクトリにあるlsflog下に作成されます。ファイル名は、"result.log"です。

同一ファイルを指定した場合

複数のジョブで-oの設定に同じファイル名を指定した場合、結果は既存のファイルへの追記となります。

メール送付

ユーザが明示的にバッチジョブの標準出力・標準エラーをメールで送信する場合は、メールアドレスを指定します。

 $> bsub -u メールアドレス ジョブ名

[使用例]

 $> bsub -u testuser01@post.kek.jp testjobs

バッチジョブの状態確認

ジョブの確認は、bjobsコマンドにて可能です。

 $> bjobs ジョブID

[使用例]

 $> bjobs 111

ジョブを投入し実行が開始されたら /usr/local/bin/chk_runjob コマンドで計算ノードにおける状態を確認して下さい。
※情報は一分間に一度更新されます

$> 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
cb001          ok   0.1   0.2   0.0   0%   6.4   0     2 9016M 2047M  43G
cb002          ok   0.2   0.0   0.0   0%  10.2   0     2 9016M 2047M  43G
cb003          ok   0.3   0.0   0.0   0%   8.6   0     2 9016M 2047M  43G
...<省略>..

また、各ホストのジョブ投入状況はbhostsにて確認できます。

 $> bhosts↓ 

[使用例]

 $> bhosts↓ 
HOST_NAME   STATUS       JL/U    MAX  NJOBS    RUN  SSUSP  USUSP    RSV
cb001       ok              -     12      0      0      0      0      0
cb002       ok              -     12      0      0      0      0      0
cb003       ok              -     12      0      0      0      0      0
cb004       ok              -     12      0      0      0      0      0
cb005       ok              -     12      0      0      0      0      0
...<省略>..

キャンセル

ジョブの取り消しは、bkillコマンドにて可能です。

 $> bkill ジョブID

ジョブIDを 0 にすると、自身が投入した全ての JOB を終了させます。

[使用例]

 $> bkill 111

ノードの障害等で bkill コマンドが正常に完了しない場合、-r オプションを使用することで強制的にジョブの取り消しを行うことが可能です。 ここで、bkill コマンドが正常に完了しない場合とは、以下のような状態の事を指します。

  • bkill 実行時に「Job <JOBID> is being terminated」等のメッセージが表示される
  • bkill を実行してもジョブが取り消されない( bjobs コマンドで表示され続ける)
 $> bkill -r ジョブID

[使用例]

 $> bkill -r 111

システムによるジョブの停止

  • 実行中のジョブが下記のシステム側の設定したしきい値に達した場合、システムにより停止される事があります。
停止の理由bacctコマンドに表示されるメッセージ*4
実行時間制限 *1Completed <exit>; TERM_RUNLIMIT: job killed after reaching LSF run time limit.
CPU時間制限 *1Completed <exit>; TERM_CPULIMIT: job killed after reaching LSF CPU usage limit.
物理メモリ制限 *1Completed <exit>; TERM_MEMLIMIT: job killed after reaching LSF memory usage limit.
仮想メモリ制限 *1Completed <exit>; TERM_SWAPLIMIT: job killed after reaching LSF memory usage limit.
プロセス数制限 *1Completed <exit>; TERM_PROCESSLIMIT: job killed after reaching LSF process limit.
標準出力サイズ制限 *2Completed <exit>; TERM_FORCE_ADMIN: job killed by root or LSF administrator without time for cleanup.
サスペンド時間制限 *3Completed <exit>; TERM_FORCE_ADMIN: job killed by root or LSF administrator without time for cleanup.

 *1 各キューによる制限値についてはバッチキュー一覧 ページにてご確認下さい
 *2 現在の制限値は200MBです
 *3 現在の制限値は3時間です
 *4 システムにより停止されたジョブのステータスを確認するには次のコマンドを実行します

 $> bacct -l ジョブID

スケジューリングポリシー

LSFでは、計算資源を公平に利用できるようフェアシェアという機能を使用しています。フェアシェアは、ユーザがジョブを投入する際に優先順位付けを行います。フェアシェアの計算方法は、次の通りとなっております。

動的優先順位 =シェア数 /
            ( CPU時間 * CPU_TIME_FACTOR +
            実行中ジョブの実行時間 * RUN_TIME_FACTOR +
            (1 + ジョブスロット数) * RUN_JOB_FACTOR  +
            (RUN_TIME - CPU_TIME)  * CPU_JOB_FACTOR )
  • シェア数 : 該当するユーザに割り当てられたシェア数。
  • CPU時間 :ユーザが消費した累積 CPU 時間(単位は「時間」)。
  • 実行中ジョブの実行時間 : 実行中のジョブの合計実行時間(単位は「時間」)。
  • ジョブスロット数 :予約中および使用中のジョブ スロット数。
  • CPU_TIME_FACTOR ........ CPU 時間の加重係数 (設定 0.0)
  • RUN_TIME_FACTOR ........ 実行時間の加重係数 (設定 0.35)
  • RUN_JOB_FACTOR ........ ジョブ スロット数の加重係数(設定 3)
  • CPU_JOB_FACTOR ........ CPU使用効率 (設定 1)

現在のフェアシェアの値がどのように設定されているかは、次のコマンドで確認できます。

 $> bqueues -l キュー名

[使用例]

 $> bqueues -l s
SHARE_INFO_FOR: s/
 USER/GROUP   SHARES  PRIORITY  STARTED  RESERVED  CPU_TIME  RUN_TIME
 user-a          1       0.333      0        0         0.0        0
 user-b          1       0.333      0        0         0.0        0
 user-c          1       0.333      0        0         0.0        0
 user-d          1       0.012      1        0       872.8   399993
 user-e          1       0.008      1        0         0.0   574239
 user-f          1       0.005      2        0      2588.0  1003056
 user-g          1       0.004     31        0     36821.6   667907
 user-h          1       0.003     98        0     94953.1   432167
 user-i          1       0.001     17        0     17307.1  3447528
 user-j          1       0.000     27        0     23340.3 12779340

最低リソース保証 (GRA, Guaranteed Resource Allocation)

最低リソース保証として、aキューには、ユーザあたり2本まで、他のキューより優先して、ジョブを流すことができます。
すぐに結果が欲しいジョブがあるけど、通常キューではジョブがすぐに流れない場合などに利用できます。
キューの設定は、lキューの設定に準じています。

MPI ジョブ実行

本計算システムでは、LSFにより OpenMPIまたはIntelMPI を使用したジョブが投入可能となっています。 コンパイル方法については「コンパイル」をご参照ください。

MPIジョブ実行の手順

MPIジョブを実行するにはジョブ投入スクリプトを作成する必要があります。
bsubのオプションは引数として指定する以外にスクリプト内に記述することも可能です。
ここではスクリプト内に記述する方法を示します。 

ジョブスクリプトの作成

プログラム実行の前に moduleコマンドで環境変数設定を行います。
OpenMPIは、コンパイラ毎に用意されていますので、コンパイル時に使用したものに応じて選択してください。
設定可能なmoduleファイルはこちらを参照してください。
その後、mpirunコマンドでプログラムを実行します。

[スクリプト例/IntelMPI]

#!/bin/bash 
##---- bsub オプション指定 
#BSUB -n 24  #使用スロット数  
#BSUB -q p   #キューの指定 
##---- 環境設定
module load intel/2016 
##---- 実行 
mpirun -np 24 ./a.out  

[スクリプト例/OpenMPI(gnu)]

#!/bin/bash 
##---- bsub オプション指定 
#BSUB -n 24 #使用スロット数 
#BSUB -q p  #キューの指定 
##---- 環境設定 
module load openmpi/1.10.2-gcc 
##---- 実行 
mpirun -np 24 ./a.out  

ジョブ投入

 $> bsub < ジョブスクリプト

[使用例]

 $> cat mpijob_intel.sh
 #!/bin/bash 
 #BSUB -n 24  
 #BSUB -q p 
 module load intel/2016 
 mpirun -np 24 ./a.out 
 $>
 $> bsub < mpijob_intel.sh

並列(MPI)ジョブの投入キューの制限

MPI ジョブは専用のキュー p または px に投入する必要があります。bsub で必ず -q p または -q px を指定してください。

キュー p および px は PROCLIMIT (ジョブあたりの使用スロット制限) が 24 に設定されています。24 並列以上のジョブは投入できません。

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ノードのスロット上限値 28 に達すると、他のノードのスロットが使用される、という設定になっています。

例) 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プロセス実行

OpenMP ジョブ実行

OpenMP プログラムのコンパイル方法については「OpenMPプログラムのコンパイル」をご参照ください。

OpenMPジョブの投入

OpenMPジョブは、bsub -n で指定した数の CPU core が使用可能になります( bsub -n のデフォルト値は 1 です)。
OpenMPジョブは 1ジョブあたり 24 core まで CPU が使用可能です。

[12 core を使用するOpenMPジョブの投入例]

 $> bsub -R "span[hosts=1]" -q p -n 12 openmp_64

OpenMPジョブの投入キューの制限

OpenMP ジョブは専用のキュー p または px に投入する必要があります。bsub で必ず -q p または -q px を指定してください。また "-R "span[hosts=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ディスク領域にステージするか、ステージ処理をさせてからジョブを実行させる を参考にしてジョブを投入してください。

Last-modified: 2019-03-07 (木) 15:55:48 (13d)