HOME > システム > SR16000 > SR16000 利用の手引き > 第7章 プログラムの実行

第7章 プログラムの実行

7.1 概要

SR16000 ではすべてのプログラムがバッチジョブシステムを通じて実行されます。SR16000 では 日立製作所製のバッチジョブシステム (NQS互換機能、以降 NQS) が導入されており、旧システムの HA8000 と同じジョブスクリプトが使用できます (FX10 スーパーコンピュータシステムとは互換性はありませんのでご注意ください)。
ジョブを実行するにはまず実行するプログラムとは別に「ジョブスクリプト」と呼ばれるファイルを作成します。ジョブスクリプトには希望する実行時間に見合ったキューの名前、使用 CPU 数などを記述した上で、実際にプログラムを実行するためのコマンドを書きます。このファイルが完成したら qsub コマンドでこのジョブを NQS に登録し実行を待ちます。ジョブに資源が割り当てられると、ジョブスクリプトに記述したコマンドが自動的に実行されます。実行結果はファイルに残りますのでジョブ投入後はログインしている必要はありません。ジョブの状態は qstat コマンドで確認できるほか、開始と終了はログインノードにメールで通知されます。「第3章 ログインノードの使用」で説明した転送設定を行うかジョブスクリプトに送信先を設定することで、普段使用しているメールアドレスにジョブ完了通知を送信することもできます。


図7-1-1 ジョブ実行概念図
図7-1-1 ジョブ実行概念図
▲ 第7章 プログラムの実行 TOPへ

7.2 パイプキューとバッチキュー

バッチジョブシステムの待ち行列には「バッチキュー」と呼ばれるジョブの待ち行列と「パイプキュー」と呼ばれる他のキューにジョブを転送するためのキューがあります。バッチキューは要求されたプロセッサや計算時間別に準備されており、実行待ちのジョブはバッチキューに入ります。一方パイプキューはジョブの振り分けを行うキューであり、パイプキューに投入されたジョブは必要としている資源量に応じて適切なバッチキューに自動的に転送されます。
SR16000 では図7-2-1のようにパイプキューとバッチキューが準備されています(実際に利用できるキューは申込コースによって異なります)。点線で囲まれたバッチキューは必ずパイプキュー経由で使用する必要があり、直接キューを指定してジョブを投入することはできません。debug キューは直接バッチキュー名を指定してジョブを投入します。
※ 利用できるコースの詳細は、「ジョブクラス制限値」をご覧ください。


図7-2-1 SR16000のキュー (ジョブクラス)
図7-2-1 SR16000のキュー (ジョブクラス)
▲ 第7章 プログラムの実行 TOPへ

7.3 ジョブスクリプトの書き方

ジョブスクリプトは次のような構成のテキストファイルです。
ジョブスクリプトの書き方
このようにジョブスクリプトには #@$- から始まるバッチジョブのオプション指定部分とその下のシェルスクリプト部分があります。バッチジョブシステムはオプション部分を使用して投入するバッチキューを決定し、順番が回ってきた際にはスクリプト下部のシェルスクリプトを実行します。「第 9 章 使用例」(現在準備中) でも具体的なジョブスクリプトの例を紹介します。ジョブスクリプトは、大文字、小文字が区別されるのでご注意ください。

7.3.1 主要オプション

次に挙げる2項目はすべてのジョブスクリプトに必要です。


主要オプション

q および N オプションの値を用いてバッチジョブキューが決定されます。Nの値はバッチキューのノード数に一致している必要はありません。例えば 3ノードを指定した場合は 4ノード用のバッチキューに投入されます。


次の 2 項目は必須ではありませんが、指定することをお勧めします。


主要オプション

J オプションには T に続けてノードあたりのプロセス数を書きます。省略時は 1 となります。T が必要なのは SR11000 以前のシステムとの互換性のためです。SR11000 で使用している S および SS の指定も可能ですが、新たに作成するスクリプトでは使用しないでください。lT(小文字エル、大文字ティー)オプションはジョブ実行の最大時間であり、この時間を超えるとジョブは強制終了となります。lT オプションを省略すると各パイプキューの最大時間とみなされますが、効率的な資源利用のために指定をお願いします。

7.3.2 その他のオプション

必須オプションの他に以下のオプションが使用できます。


その他のオプション

7.3.3 シェルスクリプト部分

シェルスクリプト部分には先頭行で指定したシェルが解釈できるシェルスクリプトを記述します。シェルスクリプトは常にホームディレクトリをカレントディレクトリとして開始します(ジョブスクリプトのあるディレクトリではありません)。したがって通常はプログラムが存在するディレクトリへの移動が必要です。また、このスクリプトは端末から切り離された状態で実行されるのでエディタなどの対話的なプログラムの起動を含めることはできません。
▲ 第7章 プログラムの実行 TOPへ

7.4 バッチジョブシステムの使い方

7.4.1 ジョブの投入

ジョブの実行のためにはスクリプトファイルをバッチシステムに投入 (サブミット) します。コマンドは qsub を使用します。以下の例で job.sh は既存のスクリプトファイル名とします。
 [p11000@yayoi-1 p11000]% qsub job.sh	
 Request "Request ID" submitted to queue: P004.
NQS はジョブを識別するリクエストID (リクエスト番号 + ジョブ投入ホスト名) 付加し、バッチシステムにジョブを送り込みます。利用者一人が複数のジョブを投入することもできますが数に制限があります。

7.4.2 ジョブの確認

ジョブの状態(待機中や実行中)は qstat コマンドで知ることができます。
 [p11000@yayoi-1 p11000]% qstat
 2012/07/23 (Mon) 11:54:00:    REQUESTS on SR16000
 NQS schedule stop time : 2012/07/27 (Fri)  9:00:00 (Remain:  93h  6m  0s)
    REQUEST      NAME      OWNER      QUEUE     PRI NODE E-TIME   MEM    STATE
 39550.yayoi     STDIN     p11000     P004      63    2    600s   170GB  QUEUED
リクエストID、スクリプト名、ログイン名が表示されている行が先程投入したジョブの状況です。ジョブはバッチキュー P004で待機(QUEUED)していることがわかります。出力の2行目には次の計画停止までの時間も表示されています。ジョブの予想実行時間が計画停止までの時間より長い場合は、計画停止からの復旧後までスケジューリングされません。ジョブが実行を開始すると qstat の結果は実行中(RUNNING)になります。待機中、または実行中のジョブがない時は No requests. となります。
 [p11000@yayoi-1 p11000]% qstat
 2012/07/24 (Tue)  7:44:15:    REQUESTS on SR16000
 NQS schedule stop time : 2012/07/27 (Fri)  9:00:00 (Remain:  73h 15m 45s)
    REQUEST      NAME      OWNER      QUEUE     PRI NODE E-TIME   MEM    STATE
 No requests. 

7.4.3 キューの状態確認

キューごと (システム全体) の実行ジョブ数、待ちジョブ数は以下のように qstat -b で確認できます。
 [p11000@yayoi-1 p11000]%  qstat -b
 2012/07/23 (Mon) 11:54:00:    REQUESTS on SR16000
 NQS schedule stop time : 2012/07/27 (Fri)  9:00:00 (Remain:  93h  6m  0s)
 QUEUE NAME      STATUS    TOTAL   RUNNING  RUNLIMIT  QUEUED  HELD    OTHER
 P001            AVAILBL     9       2        2         7       0       0
 P004            AVAILBL    17       4        4        13       0       0
 P008            AVAILBL    23       2        2        21       0       0
 debug           AVAILBL     1       0        4         1       0       0
RUNNING は実行中のジョブ数を示しています。例では、P001 では 2 本実行されていることが確認できます。RUNLIMIT は各キューで同時に実行できるジョブの数、QUEUED が実行 (順番) 待ちのジョブの数を表示しています (RUNLIMIT はシステム全体の計算資源の空き状況などにより適宜変更しています。そのため、RUNLIMIT 数よりも RUNNING 数が多くなっている場合もあります)。

7.4.4 ジョブのキャンセルまたは強制終了

投入したジョブをキャンセルしたい時、または実行中のジョブを強制終了したい時は qdel コマンドを使用します。
 [p11000@yayoi-1 p11000]% qdel 39550.yayoi

7.4.5 ジョブ実行履歴の確認

投入したジョブの実行履歴等を確認するには、qlogf コマンドを使用します。オプションを指定せずに実行すると、当日のジョブ実行履歴が表示されます (オプションには、検索範囲指定やリクエスト ID 指定ができます)。
 [p11000@yayoi-1 p11000]% qlogf -h
 Usage: qlogf [-days] [-d date] [request-id ...]
        date must be 'dd/mm/yy' form.

 [p11000@yayoi-1 p11000] qlogf
 DATE       TIME     REQUEST        NAME     OWNER    QUEUE    EVENT
 2012/07/23 11:16:38 39550.yayoi    STDIN    p11000   P004     QUEUED(priority:0)
 2012/07/23 11:16:38 39550.yayoi    STDIN    p11000   P004     QUEUED(priority:63)
 2012/07/23 11:58:13 39550.yayoi    STDIN    p11000   P004     STARTED
 2012/07/23 11:58:19 39550.yayoi    STDIN    p11000   P004     ENDED(exit:0000)
    :
    :

7.4.6 ジョブチェイン機能

ジョブの実行終了時の状態により後続ジョブの実行または抑止を行うことができます。チェイン機能によるバッチジョブは、qstat コマンドの STATE 項目が CHAIN 表示となります。ただし、チェインジョブとして登録されたバッチジョブが実行条件を満たさなくなった場合は、STATE 項目が、NEVERRUN 表示に変更し、バッチジョブ実行は行われません。
  • 指定方法 : qsub -c[EXIT コード] リクエスト ID

チェインジョブが設定された場合の表示例

 [p11000@yayoi-1 p11000]% qstat
 2012/07/20 (Fri) 10:50:33:    REQUESTS on SR16000
 NQS schedule stop time : 2012/07/27 (Fri)  9:00:00 (Remain: 166h  9m 27s)
    REQUEST      NAME      OWNER      QUEUE     PRI NODE E-TIME   MEM    STATE
 18619.yayoi     STDIN     p11000     P001      63    1    240m   170GB  QUEUED
 18620.yayoi     STDIN     p11000     P001      62    1    240m   170GB  CHAIN

チェインジョブで実行条件が満たさなくなった場合の表示例

 [p11000@yayoi-1 p11000]% qstat
 2012/07/20 (Fri) 10:51:33:    REQUESTS on SR16000
 NQS schedule stop time : 2012/07/27 (Fri)  9:00:00 (Remain: 166h  8m 27s)
    REQUEST      NAME      OWNER      QUEUE     PRI NODE E-TIME   MEM    STATE
 18620.yayoi     STDIN     p11000     P001      62    1    240m   170GB  NEVERRUN

7.4.7 ジョブの終了通知と結果確認

ジョブが終了するとジョブスクリプトの -mu オプションで指定したメールアドレス(省略時は SR16000 のアカウント)にメールが届きます。ジョブの出力は次のファイルに保存されています。
  • 標準出力: スクリプトファイル名.oN (Nはジョブ番号)
  • 標準エラー出力: スクリプトファイル名.eN (Nはジョブ番号)

7.4.8 システム障害時の動作

システム障害でジョブが途中で異常終了した場合などには、終了したジョブの名前とジョブ番号を個別にご連絡しています。お手数ですが再度実行をお願いいたします。ファイル状態などが再実行可能な状態かどうかセンターでは判断できませんので、自動的に再実行を行うことはいたしません。
▲ 第7章 プログラムの実行 TOPへ

7.5 ジョブスケジューリングのルール

実行待ちのジョブは「フェアシェアスケジューリング」と呼ばれる方式で実行順序が決まります。この方式では過去に使った計算資源が少ない利用者が優先されます。ジョブの投入順序と実行順は基本的には一致しません。

7.5.1 フェアシェアスケジューリングの詳細

フェアシェアスケジューリングシステムは、4 月から現在までに実行済みのバッチジョブにて使用した CPU の使用量 (以下、 CPU 使用量とする) と投入したジョブに設定した実行予定時間より算出される CPU の予定使用量 (以下、CPU 予定使用量とする) から各ジョブの実行優先度を決定しています。具体的なスケジューリングルールは次のようになっています。
  • 各キュー毎に実行待ちのジョブにそれぞれ優先順位 (63 が最優先で 0まで) を付け、順位の高いジョブから順に実行します。
  • 順位付けの要素は、4 月から現在までに実行したバッチジョブの CPU 使用量を利用者毎に積算した値と、投入したバッチジョブで要求している CPU 予定使用量を合計したものであり、その値が少ないジョブから順位付けを行います。CPU 使用量とは「ジョブの実行時間×使用したノード数」です。
  • いずれかのジョブが終了する毎に当該利用者の CPU 使用量を積算し、順位の付け替えを行います。大規模計算を行う利用者が不利とならないよう一定時間毎に CPU 使用量に一定の逓減率を掛け逓減する仕組みとしています。
  • キューに並んでいる際の待ち時間は順位付けの要素に含みません。
  • ジョブの実行は 2 つまで同時に可能です。ただし同一のキューでは 1 つとなります。
  • ジョブの優先順位は qstat コマンドの "PRI" の値で確認が可能です。
    以下の例では、PRI が 50 となっているので、優先順位が 14 番目となっている (14 番目に実行 (13 本のジョブが実行待ち) される) ことがわかります。
  •  [p11000@yayoi-1 p11000]% qstat
     2012/07/24 (Tue) 15:48:42:    REQUESTS on SR16000
     NQS schedule stop time : 2012/07/27 (Fri)  9:00:00 (Remain:  65h 11m 18s)
        REQUEST      NAME      OWNER      QUEUE     PRI NODE E-TIME   MEM    STATE
     76541.yayoi     job.001   p11000     P004      50    4    180m   170GB  QUEUED
     76542.yayoi     job.002   p11000     P004      49    4    180m   170GB  QUEUED
     76543.yayoi     job.003   p11000     P004      48    4    180m   170GB  QUEUED
    

参考 : 実行開始までの目安 (概算)

ジョブ実行開始までに係る時間の概算 (計算方法) は以下の通りです。


ジョブ実行待ちの状態を確認する。以下の例の場合、PRI が 63 となっているので、ジョブ実行優先順位は最上位となっていることが確認できます。
 [p11000@yayoi-1 p11000]% qstat
 2012/07/23 (Mon) 11:54:00:    REQUESTS on SR16000
 NQS schedule stop time : 2012/07/27 (Fri)  9:00:00 (Remain:  93h  6m  0s)
    REQUEST      NAME      OWNER      QUEUE     PRI NODE E-TIME   MEM    STATE
 18619.yayoi     STDIN     p11000     P001      63    1    240m   170GB  QUEUED
キューの同時実行数を確認する。以下の例の場合、投入したジョブクラスの同時実行数 (RUNLIMIT) は 1 本となっていることが確認できます (システム資源の空き状況などにより、適宜同時実行数 (RUNLIMIT) を変更しています。そのため同時実行数 (RUNLIMIT) よりも多く実行中 (RUNNING) のジョブがある場合があります)。
 [p11000@yayoi-1 p11000]%  qstat -b
 2012/07/23 (Mon) 11:54:00:    REQUESTS on SR16000
 NQS schedule stop time : 2012/07/27 (Fri)  9:00:00 (Remain:  93h  6m  0s)
 QUEUE NAME      STATUS    TOTAL   RUNNING  RUNLIMIT  QUEUED  HELD    OTHER
 P001            AVAILBL     9       2        1         7       0       0
 P004            AVAILBL    17       4        4        13       0       0
 P008            AVAILBL    23       2        2        21       0       0
 debug           AVAILBL     1       0        4         1       0       0
このような状態で実行待ちとなっている場合には、現在実行しているジョブが終了しだいジョブ実行が開始されることになります。例では P001 キューにジョブ実行待ちとなっていますので、最大 8 時間 (P001 キューの最大経過時間制限値) の実行待ち時間が発生することになります。

▲ 第7章 プログラムの実行 TOPへ