バッチ処理

最終更新日:2019年1月17日

スーパーコンピュータシステムITOのサブシステム Aおよび Bでプログラム言語およびアプリケーションの実行を行うためには、 一連の処理を記述した手順をコマンドによってシステムに依頼する必要があります。 この手順を「バッチ処理」、依頼された処理を「バッチジョブ」と呼びます。また、処理内容を記載した手順書を「バッチ処理用スクリプト」と呼びます。 依頼されたバッチジョブは資源の空き状況に応じて適宜実行処理されます。


バッチジョブの流れ

バッチジョブによりプログラムを実行するためには一般に以下のような手続きを踏みます。
1. ジョブ処理用スクリプトの作成
2. ジョブの投入(pjsubコマンド)
3. (必要に応じて) ジョブ処理状況の確認(pjstatコマンド)
4. (必要に応じて) 実行中、もしくは、実行待ちのジョブ削除(pjdelコマンド)
5. 結果の確認

ITOのサブシステムでは資源を、物理的なノード単位ではなく、「仮想ノード」という物理的なノードよりも細かい単位でジョブに割り当てます。仮想ノードにはCPUコアとメモリの利用量が割り当てられます。 また1つの仮想ノードは複数の物理ノードにまたがって定義することはできません。


1. バッチ処理用スクリプトの作成

バッチ処理用スクリプトはサブシステムで実行したい計算の内容を記述したファイルです。 スクリプトの記述例を以下に示します。

#!/bin/bash            ← bashで実行されるスクリプトであることを指定
#PJM -L "rscunit=ito-a"            
#PJM -L "rscgrp=ito-s-dbg"
#PJM -L "vnode=2"         ← #PJM以降の空白で区切られたフィールドはpjsubコマンドの引数と同じ扱い
#PJM -L "vnode-core=36"      
# comment             ← #PJMで始まらない場合はシェルのコメントと判断
# comment

コマンド         ← 実行するコマンドをシェルスクリプトで記述
コマンド         

スクリプトには以下のオプションを指定します。

1.1 基本オプション

オプション名 説明
-o filename 標準出力をファイルfilenameに出力
-e filename 標準エラー出力をファイルfilenameに出力
-j ジョブの標準エラー出力と標準出力を同じファイルに出力する
--mail-list mailaddress メールの送信先を指定
-m パラメータ メール通知を指定
-m b バッチジョブ開始時にメール通知
-m e バッチジョブ終了時にメール通知
-m r ジョブ再実行時にメール通知
-X ジョブ投入時の環境変数をジョブ実行環境に継承

1.2 バッチジョブ資源オプション

バッチジョブ処理に必要な資源に関する主要オプションは以下の通りです。 -Lに続けて利用資源または上限値を指定します。

オプション名 説明
-L rscunit=name ジョブを投入するサブシステム名
-L rscgrp=name ジョブを投入するリソースグループ(キュー)名
-L elapse=limit ジョブの最大実行時間(経過時間)
-L vnode=limit 利用する物理ノードの最大値 (富士通 MPIを利用の場合、プロセス数)
-L vnode-core=limit 物理ノードあたりの最大使用コア数 (富士通 MPIを利用の場合、プロセスあたりの最大使用コア数

リソースグループ、コア数、ノード数の指定

  • リソースグループには、使用できるコア数、物理ノード数およびメモリ量に制限があります。
    リソースグループの制限値
  • 実行するプログラムがメモリ不足とならないように、十分なメモリ量を使用可能なリソースグループを選んでください。
  • 使用する MPIライブラリによって、vnodevnode-coreの指定方法が異なります。
    富士通 MPI: vnodeにはプロセス数を指定してください。一方、vnode-coreには vnodevnode-coreの積がリソースグループの全使用可能コア数と同じか若干少ない数となる値を指定してください。
    それ以外: vnodeには物理ノード数を指定してください。一方、vnode-coreには選んだリソースグループのノードあたり使用可能コア数を指定してください。
  • リソースグループで利用可能な総コア数に対して、vnodevnode-coreの積が小さすぎる場合、  残ったコアにはジョブが割り当てられず、無駄になるので注意してください。

ジョブの最大実行時間の指定

ITOでは、他のジョブの実行開始時刻を遅らせない範囲で、後から投入されたジョブを先に実行させる、「バックフィルスケジューリング」と呼ばれる機能が用意されています。 これにより、システムが混雑している状況でも計算ノードの隙間時間を見つけてジョブを早く実行開始するように働きかけます。 そのため、最大実行時間をできるだけ短く指定することで、より早く実行を開始できる可能性があります。 ただし、最大実行時間に到達するとジョブが強制終了させられるので、ご注意ください。

1.3 統計出力オプション

オプション名 説明
-s 投入したジョブの統計情報を出力
-S オプションと併用は不可
-S 投入したジョブのノード情報を含む統計情報を出力
-s オプションと併用は不可

使用メモリ量などの統計情報が "[スクリプトファイル名].i[ジョブID]"というファイルに出力されます。 指定したファイルに出力したい場合は --spath オプションを指定します。 ノード(プロセス)単位で情報を出力したい場合は-Sオプションを指定してください。

なお上記オプションを指定しなくても 3.2 のコマンドで、メモリ使用量超過によりジョブが中断されたかどうかを確認することができます。


2. バッチジョブの投入(pjsubコマンド)

1. で作成したバッチ処理用スクリプトファイルに記述された処理内容を pjsub コマンドを用いて依頼します。

$ pjsub go.sh
[INFO] PJM 0000 pjsub Job 1234 sunmitted.
$

この例では go.sh という名前で作成・保存されたファイルに記述された処理内容を依頼しています。例ではジョブID: 1234が割り振られています。
pjsubコマンドのオプションの詳細はマニュアル「ジョブ運用ソフトウェア エンドユーザ向けガイド」を参照してください。
 また、スクリプトファイルの絶対パスに括弧文字が含まれるとエラーとなりジョブが実行されないためご注意ください。


3. 処理状況の確認(pjstatコマンド他)

3.1 実行中・実行待ちの状況確認

pjstatコマンドを実行すると現在実行中および実行待ちのバッチジョブの状態を表示します。

表示内容およびpjstatコマンドのオプションの詳細は マニュアル「ジョブ運用ソフトウェア エンドユーザ向けガイド」を参照してください。


3.2 履歴表示

以下のオプションにより過去xx日前(実行例では7日前)から現在までの実行履歴が確認できます。

$ pjstat -H day=7 -v

  • ジョブ終了のステータスは「PC」列に表示されます(0:正常終了, 1:キャンセル 等)
  • 各コード番号については "man pjstat"で確認できます。
  • メモリ使用超過が原因の場合ジョブ履歴「PC」列に "12" と出力されます。
  • 一定期間経過した過去の履歴は消去されます。


3.3 処理の終了したバッチジョブの統計情報

以下のオプションにより任意の終了したジョブID(実行例では1234)の統計情報を確認することができます。

$ pjstat -H -S 1234

3.4 処理の終了したバッチジョブの利用実績情報

以下のコマンドにより利用実績情報(ノード時間)を確認することができます。
詳細はこちら(複数グループを使い分けるには?)を参照ください。

$ qrepuse

4. バッチジョブの削除 (pjdelコマンド)

pjdelコマンドにより実行中もしくは実行待ちのバッチジョブを取り消す(削除する)ことができます。 pjdelコマンドに続けてジョブIDを指定します(複数指定可能)。 実行中のバッチジョブの取り消しを行うと実行が中止されます。

$ pjdel 1234
[INFO] PJM 0100 pjdel Job 1234 canceled.
$

この例ではジョブID: 1234のバッチジョブの削除を依頼しジョブが正常にされたことがメッセージで示されています。


5. 結果の確認

pjsubの-oオプションで出力ファイルを指定した場合には指定されたファイルに標準出力への結果が書き出されます。 指定がない場合には "[ジョブスクリプト名].o[ジョブID]" というファイルに出力されます。 一方、標準エラー出力は、-jオプションが指定された場合は標準出力と同じファイルに書き出されます。 -jオプションが指定されなかった場合、-eオプションで出力ファイルが指定された場合には指定されたファイルに書き出されます。 -j、-oのどちらのオプションも指定されなかった場合、標準エラー出力は "[ジョブスクリプト名].e[ジョブID]"に書き出されます。


6. ジョブスクリプトの記述例

以下に並列化されていないプログラムを実行するスクリプトの例を示します。 並列化されたプログラムでは、使用するコンパイラや MPIライブラリによって記述方法が異なります。 また、各種アプリケーションを実行するには、別途記述を追加する必要がある場合があります。 該当するコンパイラ、MPIライブラリおよびアプリケーションのページを参照してください。


  • 仮想ノード数(プロセス数)
  • :1ノード(1プロセス)
  • 仮想ノードあたりのコア数(スレッド数)
  • :1コア(1スレッド)
  • 最大経過時間
  • :10分
  • 標準エラー出力と標準出力を同じファイルにする
  • :あり
  • ジョブリソースグループ(キュー)
  • :ito-single
    #!/bin/bash
    #PJM -L "rscunit=ito-a"
    #PJM -L "rscgrp=ito-single"
    #PJM -L "vnode=1"
    #PJM -L "vnode-core=9"
    #PJM -L "elapse=10:00"
    #PJM -j
    #PJM -X
    
    ./a.out
    
    
    サブシステム名(ito-a)の指定
    リソースグループ(ito-single)の指定
    仮想ノード数を指定
    仮想ノードあたりのCPUコア数を指定(ito-singleでは 9コア)
    最大経過時間の指定
    標準エラー出力を標準出力と同じに
    ジョブ投入時の環境変数をジョブ実行環境に継承
    
    プログラムの実行