Subsections


4.2 バッチ型データ解析サーバ群の利用方法

多波長データ解析システムではバッチ処理を行うためにバッチ型データ解析サーバ群を用意しています。バッチ処理とはジョブと呼ばれる処理目的毎にまとめられたプログラム群を、コンピュータが自動的かつ順番に処理していく処理機構です。

対話型サーバで複数のユーザが複数のプログラムを同時に実行すると、計算資源が不足して処理効率が落ちてしまうことがあります。バッチ型サーバではジョブ管理システムが各ユーザのジョブを管理して順次実行していくことで、利用可能な計算資源の中で最大効率でジョブを処理することができます。計算機に負荷のかかる処理や多数のプログラムを実行したい場合にバッチ型サーバは有効です。

バッチ型データ解析サーバ群は2台のm系バッチ型サーバ「kaibm[01-02].ana.nao.ac.jp」から構成されています。バッチ処理を行うためにバッチ型解析サーバ群にはジョブ管理システムPBS Professional(以降PBS)がインストールされており、「kaibm01」がPBS管理サーバとして、「kaibm01」と「kaibm02」の両者が計算サーバとして機能します。

ユーザが投入したジョブはPBS管理サーバによって管理され、各計算サーバに振り分けられます。計算資源に余裕がない状態では投入されたジョブがキュー待機状態となります。キュー待機状態のジョブは計算資源が空き次第各計算サーバに振り分けられます。効率的に処理を行うために計算中のジョブが中止されキュー待機状態となり、代わりに別のジョブが実行されることもあります。

図 4.1: バッチ型解析サーバ群概要図。
Image batch


4.2.1 システム構成

バッチ型データ解析サーバ群は2台のFUJITSU Server PRIMERGY RX2530 M2というサーバから構成されています。OSとしてRed Hat Enterprise Linux 7がインストールされています。
表 4.6: m系バッチ型データ解析サーバ諸元
ホスト名 kaibm[01-02].ana.nao.ac.jp
機器 FUJITSU Server PRIMERGY RX2530 M2
台数 2台
OS Red Hat Enterprise Linux 7
CPU Intel Xeon E5 2667 V4 3.2 GHz 16 core
メモリ DDR4 2400 RDIMM 192GB


4.2.2 キュー構成

PBSにはキューと呼ばれるジョブの実行順を制御する機構が備わっています。ユーザがあるキューにジョブを投入すると、PBS管理サーバはそのジョブを計算サーバで実行可能であるかどうかを判断します。ジョブが実行可能であると判断された場合は計算サーバでジョブが実行されます。一方実行できないと判断された場合は計算資源が確保されるまでジョブはキュー待機状態となります。キューによって使用する計算リソースと実行優先度が異なります。ユーザは実行するジョブの規模に応じて適切なキューにジョブを投入する必要があります。不適切なキューの使用は計算資源の無駄遣いとなりますのでご遠慮ください。
表 4.7: m系バッチ型データ解析サーバ群のキュー構成
キュー CPUコア数 使用可能メモリ量/ジョブ 制限時間/ジョブ 実行可能ジョブ数/ユーザ
q1 1 11GB 30日 ハードリミット:32、ソフトリミット:2
q4 4 44GB 30日 ハードリミット:8、ソフトリミット:1
q8 8 88GB 15日 ハードリミット:4、ソフトリミット:1
q16 16 176GB 15日 ハードリミット:2、ソフトリミット:1


4.2.3 チュートリアル

バッチ型データ解析サーバ群を利用するためにはジョブスクリプトと呼ばれるシェルスクリプトを作成し、m系或いはh系対話型解析サーバ群上から後述する「qsub」コマンドを使ってキューにジョブを投入する必要があります。本節ではジョブを投入するための基本的な手順を紹介します。
  1. ジョブスクリプトの作成方法
  2. ジョブの投入と削除方法
  3. ジョブの状態の確認方法


1. ジョブスクリプトの作成方法

ジョブスクリプトはPBSへの指示文と実行コマンドを記したシェルスクリプトです。以下はキュー「q1」でプログラム「a.out」を処理したい場合のジョブスクリプトの例です。
#!/bin/bash
#PBS -M taro.tenmon@nao.ac.jp
#PBS -m abe
#PBS -q q1

# Go to this job’s working director
cd $PBS_O_WORKDIR

# Run your executable
./a.out
ここで「#PBS」から始まる行はPBSへの指示文です。このスクリプトでは以下の指示を行っています。
#PBS -M taro.tenmon@nao.ac.jp: 電子メールの発送先をtaro.tenmon@nao.ac.jpに設定します。必ず設定してください。デフォルトの発送先である「ユーザ@ホスト.ana.nao.ac.jp」は無効なため、本指示文を設定しないとメールを届けられなかった旨のエラーメールが管理者に送信されます。
#PBS -m abe: ジョブが中止された時、ジョブの実行が開始された時、ジョブの実行が終了した時にそれぞれ電子メールを送信します。「#PBS -m a」はデフォルトで有効です。
#PBS -q q1: ジョブをキュー「q1」に投入します。
「$PBS_O_WORKDIR」はPBS内部で定義されている環境変数であり、ジョブスクリプトが投入されたディレクトリへのパスを表しています。


2. ジョブの投入方法

「qsub」コマンドを実行することでジョブをキューに投入することが出来ます。
$ qsub job_script.sh
「qdel」コマンドを実行することで投入したジョブを削除することができます。ジョブIDは後述する「qstat」コマンドで確認することが出来ます。
$ qdel ジョブID


3. ジョブの状態の確認方法

「qstat」コマンドを実行することで投入したジョブの状態を確認することが出来ます。
$ qstat
Job id            Name       User       Time Use  S  Queue
----------------  ---------  --------   -------   -  -----
1000.kaibm01      job1       user1      50:20:10  R  q1
1001.kaibm01      job2       user1      40:32:13  R  q1
1002.kaibm01      job3       user2      30:14:19  R  q1
1003.kaibm01      job4       user2      00:59:15  R  q4
1004.kaibm01      job5       user3             0  Q  q16
ここで各列はジョブID、ジョブ名、ユーザ名、使用CPU時間、ジョブの状態、キューの名前をそれぞれ表します。代表的なジョブの状態を以下に示します。
Q (Queued): ジョブはキュー待機状態。計算資源が確保され次第ジョブが実行される。
R (Running): ジョブは実行中。
S (Suspended): ジョブは中断中。優先度の高いジョブが計算資源を必要としている時に発生する。
F (Finished): ジョブは終了済み。ジョブが完了したこと、失敗したこと、削除されたことを表す。


4.2.4 PBS Professional

本節ではPBS Professionalについてかいつまんで紹介します。詳細はPBSのユーザーズガイド(https://www.pbsworks.com/pdfs/PBSUserGuide18.2.pdf)を御覧ください。本節はPBSのユーザーズガイドを参照及び引用し記述しています。
  1. PBS Professionalについて
  2. ジョブの処理過程
  3. PBSジョブスクリプト
  4. PBSコマンド
  5. PBS指示文
  6. PBS環境変数
  7. ジョブの優先度制御について


1. PBS Professionalについて

PBS Professionalは分散型計算負荷管理システムであり、複数の計算機の負荷の監視と管理を行っています。次に示すジョブのキューイング、スケジューリング、モニタリングによってバッチ処理を実現しています。
ジョブのキューイング
実行予定のジョブの管理を行います。ユーザーが投入したジョブが実行可能になるまで、ジョブをキュー待機状態で保持します。
ジョブのスケジューリング
管理者が定義したポリシーに従い、ジョブをいつどこでどのような順番で実行するのかを決定します。最大効率で計算処理を行うために、管理者はジョブの優先順位と計算リソースの割り当て方法を詳細に設定できます。
ジョブのモニタリング
システムリソースの追跡、ポリシーに則った処理の実施、処理状況の報告を行います。システムが停止してもジョブを再開できるように、ジョブの進行状況のモニタリングも行います。


2. ジョブの処理過程

PBSでジョブを処理する際の過程を以下に示します。
  1. ユーザがジョブスクリプトを作成する。
  2. ユーザがジョブをPBSに投入する。
  3. PBSがジョブを受け付け、ジョブIDをユーザに返す。
  4. PBSスケジューラがジョブを実行するために必要な計算資源と時間を確保し、ジョブを計算サーバ(群)へ送る。
  5. アプリケーションのライセンスが確保される。
  6. PBSが各計算サーバ上にジョブ毎かつ処理段階毎に分けられた作業用ディレクトリを作成する。
  7. PBSが作業用ディレクトリに対し環境変数PBS_JOBDIRと属性の設定を行う。
  8. PBSが各計算サーバ上に一時ディレクトリを作成する。
  9. PBSが一時ディレクトリに対し環境変数TMPDIRを設定する。
  10. ディレクトリ作成時あるいは環境変数設定時に何らかのエラーが発生した場合、ジョブはキュー待機状態に戻る。
  11. 入力ファイルやディレクトリが第一計算サーバにコピーされる。
  12. ジョブが実行される。
  13. 出力ファイルやディレクトリが指定された場所へコピーされる。
  14. 一時ファイルとディレクトリが削除される。
  15. アプリケーションのライセンスが解放される。


3. PBSジョブスクリプト

PBSジョブスクリプトはシェルを指定するためのシバン、PBS指示文、実行するプログラムやコマンドから構成されます。Linux環境においてはシェルスクリプト、Python、Perl等で作成できます。シェルスクリプトを使ったジョブスクリプトの作成例を以下に示します。
#!/bin/sh
# シングルコアを用いたジョブスクリプトの例

#PBS -M taro.tenmon@nao.ac.jp
#PBS -m abe
#PBS -q q1
#PBS -r y
#PBS -N job_name
#PBS -o Log.out
#PBS -e Log.err

# Go to this job’s working director
cd $PBS_O_WORKDIR

# Run your executable
./a.out

#!/bin/bash
# マルチコアを用いたジョブスクリプトの例

#PBS -M taro.tenmon@nao.ac.jp
#PBS -m abe
#PBS -q q4
#PBS -r y
#PBS -N job_name
#PBS -o Log.out
#PBS -e Log.err

# Go to this job’s working directory
cd $PBS_O_WORKDIR

# Run your executable
./a_0.out &
./a_1.out


4. PBSコマンド

PBSにはジョブの投入、監視、管理を行うために様々なコマンドが備わっています。ここではよく使われるコマンドを紹介します。

qsub

ジョブをキューに投入するためのコマンドです。引数としてユーザが作成したジョブスクリプトを指定します。
$ qsub job_script.sh

qdel

キューに投入したジョブを削除するためのコマンドです。ここでジョブIDは後述する「qstat」コマンドで確認できます。
$ qdel ジョブID

qstat

キューに投入したジョブの状態を確認するためのコマンドです。引数としてジョブIDを指定すると、指定したジョブIDの情報のみ表示できます。キュー名を指定すると、指定したキューの情報のみ表示できます。
$ qstat
Job id            Name       User       Time Use  S  Queue
----------------  ---------  --------   -------   -  -----
1000.kaibm01      job1       user1      50:20:10  R  q1
1001.kaibm01      job2       user1      40:32:13  R  q1
1002.kaibm01      job3       user2      30:14:19  R  q1
1003.kaibm01      job4       user2      00:59:15  R  q4
1004.kaibm01      job5       user3             0  Q  q16

$ qstat 1000
Job id            Name       User       Time Use  S  Queue
----------------  ---------  --------   -------   -  -----
1000.kaibm01      job1       user1      50:20:10  R  q1

$ qstat q1
Job id            Name       User       Time Use  S  Queue
----------------  ---------  --------   -------   -  -----
1000.kaibm01      job1       user1      50:20:10  R  q1
1001.kaibm01      job2       user1      40:32:13  R  q1
1002.kaibm01      job3       user2      30:14:19  R  q1
ここで各列はジョブID、ジョブ名、ユーザ名、CPU使用時間、ジョブの状態、キューの名前をそれぞれ表します。代表的なジョブの状態を以下に示します。
W (Waiting): ジョブはキュー投入待機状態。ユーザが指定した開始時刻になるとジョブがキューに投入される。
Q (Queued): ジョブはキュー待機状態。計算資源が確保され次第ジョブが実行される。
R (Running): ジョブは実行中。
S (Suspended): ジョブは中断中。優先度の高いジョブが計算資源を必要としている時に発生する。
H (Held): ジョブはホールド中。qholdコマンドでホールドできる。
F (Finished): ジョブは終了済み。ジョブが完了した時、失敗した時、削除されたことを表す。
代表的な「qstat」コマンドのオプションを次に示します。
-a: キュー待機状態と実行中のジョブを全て表示する。実際の経過時間(Elap Time)を確認できる。
-x: キュー待機状態と実行中のジョブに加え、終了済みのジョブも表示する。
-n: ジョブを実行している計算サーバをリストの末尾に表示する。-1を併用すると同一行に情報を表示できる。
-T: キュー待機状態のジョブの予想計算開始時刻を表示する。
-f: ジョブの詳細な情報を表示する。
-Q: キューの状態を表示する。
-q: キューの状態を表示する。-Qとは表示する項目が異なる。

qhold

キューに投入したジョブを保留状態にするためのコマンドです。保留状態にされたジョブは計算が中断され、割り当てられていた計算リソースが解放されます。後述する「qrls」コマンドを実行するまで計算は再開されません。本コマンドはキュー待機中や中断中のジョブを優先的に実行したい場合に活用できます。
$ qhold ジョブID

qrls

保留状態のジョブを再開するためのコマンドです。
$ qrls ジョブID


5. PBS指示文

PBS指示文とはジョブスクリプト中で使われるPBSに様々な指示を与えるための「qsub」コマンドのオプションです。オプションに接頭語「#PBS」を付けて使用します。ジョブスクリプト中でPBS指示文は実行コマンドの前に書く必要があり、後に書いた場合は無視されてしまいます。ここではよく使われるPBS指示文を紹介します。

-M

「-M」は電子メールの発送先を設定するための指示文です。必ず設定してください。デフォルトの発送先である「ユーザ@ホスト.ana.nao.ac.jp」は無効なため、この指示文を指定しないとメールを届けられなかった旨のエラーメールが管理者に送信されます。
#PBS -M your.address@example.jp

-m

「-m」は電子メールの送信設定を行うための指示文です。この指示文を指定しない場合は「#PBS -m a」が設定されたとみなされます。
#PBS -m n|(one or more of a,b,e)
n: 電子メールを発送しない。
a: ジョブが中止された際に電子メールを発送する。
b: ジョブの実行が開始された際に電子メールを発送する。
e: ジョブの実行が終了した際に電子メールを発送する。

-q

「-q」はジョブの投入先のキューを指定するための指示文です。この指示文を指定しない場合は「#PBS -q q1」が指定されたとみなされます。
#PBS -q q1|q4|q8|q16
q1: ジョブはキュー「q1」に投入されます。
q4: ジョブはキュー「q4」に投入されます。
q8: ジョブはキュー「q8」に投入されます。
q16: ジョブはキュー「q16」に投入されます。

-l

「-l」は使用する計算リソースに制限を課すための指示文です。
#PBS -l select=ncpus=X:mem=Ygb|walltime=hh:mm:ss
select=ncpus=X:mem=Ygb: 使用するCPUコア数をX個に、メモリ量をYGBに制限します。投入先のキューに割り当てられている計算資源以上のCPUコア数とメモリ量を指定することはできません。メモリ量の単位としてb、kb、mb、gbを使用できます。
walltime=hh:mm:ss: ジョブの最大実行可能時間を指定します。投入先のキューに割り当てられている制限時間以上の時間を割り当てることはできません。

-r

「-r」はシステム復旧時にジョブを自動的に再実行するか否かを指定する指示文です。この指示文を設定しない場合は「#PBS -r y」が指定されたとみなされます。
#PBS -r y|n
y: システムが停止した場合、復旧後にジョブを再実行します。
n: システムが停止した場合、復旧後にジョブをキューから削除します。

-a

「-a」はジョブの実行開始時刻を指定するための指示文です。ジョブはキュー投入待機状態となり、指定した時刻になるとキューに投入され計算が開始されます。
#PBS -a YYMMDDhhmm.SS
YYMMDDhhmm.SS: 2020年9月1日07時30分に設定する場合:「#PBS -a 2009010730.00」。

-h

「-h」は投入したジョブをホールド状態にするための指示文です。「qhold」コマンドと同じ効果を持ちます。
#PBS -h

-N

「-N」はジョブの名前を設定するための指示文です。設定した名前は「qstat」コマンドのName列に表示されます。この指示文を指定しない場合、ジョブスクリプトのファイル名がジョブの名前として使われます。
#PBS -N ジョブ名

-o

「-o」は標準出力の出力先ファイル名を設定するための指示文です。相対パスを使用する場合は「qsub」コマンドを実行したディレクトリがカレントディレクトリになります。本指示文を指定しない場合、標準出力は「qsub」コマンドを実行したディレクトリに「(ジョブスクリプト名).o(ジョブID)」というファイル名で保存されます。
#PBS -o /path/to/output.log

-e

「-e」は標準エラー出力の出力先ファイル名を指定するための指示文です。相対パスを使用する場合は「qsub」コマンドを実行したディレクトリがカレントディレクトリになります。本指示文を指定しない場合、標準エラー出力は「qsub」コマンドを実行したディレクトリに「ジョブスクリプト名.eジョブID」というファイル名で保存されます。
#PBS -e /path/to/error.log

-j

「-j」は標準出力と標準エラー出力を結合するための指示文です。
#PBS -j oe|eo
oe: 標準エラー出力が標準出力へ結合される。
eo: 標準出力が標準エラー出力へ結合される。

-R

「-R」は標準出力並びに標準エラー出力を削除するためのコマンドです。
#PBS -R o|e|oe
o: 標準出力を削除。
e: 標準エラー出力を削除。
oe: 標準出力と標準エラー出力を削除。


6. PBS環境変数

ジョブスクリプトではPBSが内部で定義しているPBS環境変数を利用することが出来ます。ここでは代表的なPBS環境変数を紹介します。
$PBS_JOBID: 投入したジョブのジョブID。
$PBS_JOBNAME: 投入したジョブの名前。
$PBS_O_HOME: ユーザの環境変数$HOMEの値。
$PBS_O_HOST: 「qsub」コマンドが実行された対話型サーバの名前。
$PBS_O_LANG: ユーザの環境変数$LANGの値。
$PBS_O_LOGNAME: ユーザの環境変数$LOGNAMEの値。
$PBS_O_PATH: ユーザの環境変数$PATHの値。
$PBS_O_QUEUE: ジョブが投入されたキューの名前。
$PBS_O_SHELL: ユーザの環境変数$SHELLの値。
$PBS_O_WORKDIR: 「qsub」コマンドが実行されたディレクトリの絶対パス。


7. ジョブの優先度制御について

各キューにはハードリミットとソフトリミットと呼ばれる各ユーザのジョブの実行可能数を制限するための値が設定されています。

ハードリミットはジョブの最大実行可能数です。ユーザがあるキューにハードリミットを超える数のジョブを投入した場合、一部のジョブはキュー待機状態となります。例えばハードリミットが8であるq4キューに10個のジョブを投入すると、8個のジョブは実行されますが2個のジョブはキュー待機状態となります。

ソフトリミットは優先的に実行されるジョブの数です。ユーザがあるキューにソフトリミットを超える数のジョブを投入した場合、一部のジョブは優先度が低い状態となります。例えばソフトリミットが1であるq4キューに4個のジョブを投入すると、1個のジョブは優先度が高い状態となりますが、残りの3個のジョブは本システムのキューの中で優先度が最も低いq16のジョブよりもさらに優先度が低い状態となります。自身や他のユーザがさらにジョブを投入したとき、優先度が低いジョブは中止されキュー待機状態となる可能性があります。

優先度制御の例

複数のユーザが本システムにジョブを投入した場合の優先度制御の例を示します。以下の例で「1(AAAA)」は1番目にシステムに投入されたユーザAのq4キューのジョブを表しています。なおジョブの実行優先度はq1 >q4 >q8 >q16 >ソフトリミットの効果で優先度が下がったジョブで、q1、q4、q8、q16のソフトリミットはそれぞれ2、1、1、1です。

1. ユーザAがq4キューのジョブを6本投入した。全てのジョブが実行される。ただし、ソフトリミットの効果で2本目以降のジョブは優先度が低い状態となる。
ジョブの状態 ジョブ 使用CPUコア数
Running(kaibm01) : 1(AAAA) 2(AAAA) 3(AAAA) 4(AAAA) 16/16
Running(kaibm02) : 5(AAAA) 6(AAAA) 8/16
Queued :  


2. ユーザBがq16キューのジョブを1本投入した。優先度が低くかつ最も直近に投入されたユーザAのq4ジョブが中止されキュー待機状態となる。
ジョブの状態 ジョブ 使用CPUコア数
Running(kaibm01) : 1(AAAA) 2(AAAA) 3(AAAA) 4(AAAA) 16/16
Running(kaibm02) : 7(BBBBBBBBBBBBBBBB) 16/16
Queued : 5(AAAA) 6(AAAA)  


3. ユーザCがq1キューのジョブを2本投入した。優先度が低くかつ最も直近に投入されたユーザAのq4ジョブが中止されキュー待機状態となる。
ジョブの状態 ジョブ 使用CPUコア数
Running(kaibm01) : 1(AAAA) 2(AAAA) 3(AAAA) 8(C) 9(C) 14/16
Running(kaibm02) : 7(BBBBBBBBBBBBBBBB) 16/16
Queued : 4(AAAA) 5(AAAA) 6(AAAA)  


4. ユーザAの1から3番目のジョブが終了した。キュー待機状態のユーザAのジョブが再実行される。
ジョブの状態 ジョブ 使用CPUコア数
Running(kaibm01) : 4(AAAA) 5(AAAA) 6(AAAA) 8(C) 9(C) 14/16
Running(kaibm02) : 7(BBBBBBBBBBBBBBBB) 16/16
Queued :  



4.2.5 メンテナンス時のジョブの取り扱い

下記の理由からメンテナンスが予定されている場合はメンテナンス前に投入済みのジョブを削除し、メンテナンス完了後にジョブを投入し直すことを推奨します。

メンテナンス時にバッチ型解析サーバの再起動が行われると、再起動前に実行中及びキュー待機中だったジョブは再起動後に自動的に再投入されます。しかしサーバ再起動時にはLDAPクライアントが停止しているため再投入に失敗します。キューの再投入が繰り返されることで、「PBS -m」を指定している場合はジョブの実行に失敗した旨のメールが大量にユーザに届きます。また21回再投入に失敗すると当該ジョブはシステムによってホールドされます。システムによってホールドされたジョブはユーザ権限ではリリースできませんが削除は可能です。

ADC
2022-06-07