ジョブ実行

ジョブ実行

概要

ワークサーバよりバッチジョブを投入すると、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により OpenMPI/OpenMP を使用したジョブを投入可能となっています。
詳細はMPI ジョブ実行またはOpenMP ジョブ実行を参照してください。

完了通知メールの送付

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"↓

[使用例] bsh 系の場合

$> bsub "testjob > lsflog/result.log 2>&1"↓

バッチジョブの状態確認

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

$> bjobs ジョブID↓ 

[使用例]

$> bjobs 111↓ 

ジョブを投入し実行が開始されたら /usr/local/bin/chk_runjob コマンドで計算ノードにおける状態を確認してください。
※情報は一分間に一度更新されます
※ MPI ジョブや OpenMP ジョブなど、マルチコア/マルチスレッドジョブには対応していません

$> 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
ccb001              ok   0.0   0.2   0.2   0%   0.0   0    81 9769M  7.9G  155G
ccb002              ok   0.6   0.1   0.2   0%   0.0   0  3153   10G  7.9G  155G
ccb003              ok   0.0   0.2   0.2   1%   0.0   0  3152   10G  7.9G  163G
...<省略>..

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

$> bhosts↓ 

[使用例]

$> bhosts↓ 
HOST_NAME          STATUS       JL/U    MAX  NJOBS    RUN  SSUSP  USUSP    RSV
ccb001             ok              -     40      0      0      0      0      0
ccb002             ok              -     40      0      0      0      0      0
ccb003             ok              -     40      0      0      0      0      0
ccb004             ok              -     40      0      0      0      0      0
ccb005             ok              -     40      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 ; TERM_RUNLIMIT: job killed after reaching LSF run time limit.4
CPU時間制限1 Completed ; TERM_CPULIMIT: job killed after reaching LSF CPU usage limit.
物理メモリ制限1 Completed ; TERM_MEMLIMIT: job killed after reaching LSF memory usage limit.
仮想メモリ制限1 Completed ; TERM_SWAPLIMIT: job killed after reaching LSF memory usage limit.
プロセス数制限1 Completed ; TERM_PROCESSLIMIT: job killed after reaching LSF process limit.
標準出力サイズ制限2 Completed ; TERM_FORCE_ADMIN: job killed by root or LSF administrator without time for cleanup.
サスペンド時間制限 3 Completed ; TERM_FORCE_ADMIN: job killed by root or LSF administrator without time for cleanup.
$> 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キューの設定に準じています。


*xキューにおける大メモリ使用時の利用方法

sx, lx, hx, px, zx, cmb_pxの場合、お使いのメモリ量に合わせて bsubのオプション -n "並列数 X"を TASKLIMITの設定値の範囲で指定してジョブを投入します。

[例/sxキュー]

TASKLIMIT = 6 が設定されています。

同キューで使用可能なメモリは以下のものとなります。

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により OpenMPIまたはIntelMPI を使用したジョブが投入可能となっています。 コンパイル方法については「コンパイル」を参照してください。

MPIジョブ実行の手順

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

ジョブスクリプトの作成

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

[スクリプト例/IntelMPI]

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

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

1
2
3
4
5
6
7
8
#!/bin/bash 
##---- bsub オプション指定 
#BSUB -n 24 #使用スロット数 
#BSUB -q p  #キューの指定 
##---- 環境設定 
module load openmpi/2.1.6-gcc930
##---- 実行 
mpirun -np 24 ./a.out 

ジョブ投入

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

[使用例]

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

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

MPI ジョブは専用のキュー p または px に投入する必要があります。bsub で必ず -q p または -q px を指定してください。
キュー p および px は TASKLIMIT (タスクあたりの使用スロット制限) が 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ディレクトリの使用率が高くなった場合、大きなサイズのファイルは削除されます。 /tmpディレクトリにはユーザあたり 1GB のクォータ制限が設定されています。

ジョブ中でのステージ処理

ステージされていない(GHIディスク領域に存在しない)ファイルを読み込む(ステージする)ジョブを大量に投入すると、システムのCPU利用率低下の原因となります。
扱うファイルが決まっている場合はファイルのステージ処理を参考にして事前にファイルをGHIディスク領域にステージしてからジョブを投入してください。


  1. 各キューによる制限値についてはバッチキュー一覧ページにてご確認ください。 

  2. 現在の制限値は200MBです。 

  3. 現在の制限値は3時間です。 

  4. システムにより停止されたジョブのステータスを確認するには次のコマンドを実行します。。。。