Subsections


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

バッチ型解析サーバ群はm系バッチ型サーバ「kaibm[01-02].ana.nao.ac.jp」2台から構成されており、ジョブ管理システムを利用したバッチ処理を行うことを目的としています。バッチ処理を行うためにバッチ型解析サーバ群にはPBS Professional(PBS: Portable Batch System)がインストールされており、「kaibm01.ana.nao.ac.jp」がPBS管理サーバとして、「kaibm[01-02].ana.nao.ac.jp」が計算サーバとして稼働します。ユーザが投入したジョブをPBS管理サーバが各計算サーバに振り分けることで、計算機に負荷のかかる処理や多数のプログラムを効率的に実行することができます。
図 4.1: バッチ型解析サーバ群概要図。
Image batch


4.2.1 システム構成

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


4.2.3 チュートリアル

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


1. PBSスクリプトの作成方法

PBSスクリプトはPBS Professionalへの指示文と実行コマンドが記述されたシェルスクリプトです。以下はキュー「q1」でプログラム「a.out」を処理したい場合のPBSスクリプトの例です。
#!/bin/bash
#PBS -q q1
#PBS -m abe
#PBS -M taro.tenmon@nao.ac.jp
# Go to this job’s working director
cd $PBS_O_WORKDIR
# Run your executable
./a.out
ここで「#PBS」から始まる行はPBS Professionalへの指示文です。このスクリプトでは以下の指示を行っています。他の指示文については第4.2.4-4節を参照して下さい。
PBS -q q1: ジョブをキュー「q1」に投入します。
PBS -m abe: ジョブが中止された時、ジョブの実行が開始された時、ジョブの実行が終了した時にそれぞれ電子メールを送信します。
PBS -M taro.tenmon@nao.ac.jp: taro.tenmon@nao.ac.jp宛に電子メールを発送します。所属機関のメールアドレスをご利用ください。
「$PBS_O_WORKDIR」はPBS Professional内部で定義されているPBS環境変数であり、PBSスクリプトが投入されたディレクトリへのパスを表しています。


2. ジョブの投入方法

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


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

「qstat」コマンドを実行することで投入されたジョブの状態を確認することが出来ます。
$ qstat
Job id            Name       User       Time Use  S  Queue
----------------  ---------  --------   -------   -  -----
9013.a000         job1       user1      50:20:10  R  q1
9019.a000         job2       user2      40:32:13  R  q1
9030.a000         job3       user3      30:14:19  R  q1
9079.a000         job4       user4      00:59:15  R  q1
9102.a000         job5       user5             0  Q  q1
ここで各列はジョブID、ジョブ名、ユーザ名、経過時間、ジョブの状態、キューの名前をそれぞれ表しています。ジョブの状態では以下の状態が存在します。
E (Exiting): ジョブは実行済みで終了中。
H (Held): ジョブは保留状態。
Q (Queued): ジョブはキュー待機状態。
R (Running): ジョブは実行中。
S (Suspended): ジョブは中断中。


4.2.4 PBS Professionalの詳細

本節ではバッチ型解析サーバ群にインストールされているPBS Professionalの詳細について説明します。
  1. PBS Professionalについて
  2. ジョブの制御方法
  3. PBSスクリプトの作成例
  4. PBS指示文
  5. PBS環境変数
  6. ジョブの状態の確認方法
  7. ジョブの優先度制御について
  8. ジョブのRound-robin形式制御について


1. PBS Professionalについて

PBS Professionalは分散型ワークロード管理システムであり、複数の計算機上の計算処理ワークロードの管理と監視を行います。次に示すとおり、本アプリケーションには主として3つの役割があります。
キューイング
ユーザがジョブをリソース管理システムに投入すると、実行準備が整うまでジョブが順番待ちの状態になります。
スケジューリング
事前に定義されたポリシーに従って、ジョブをいつどこで実行するのかを選定します。
モニタリング
システムリソースを追跡及び予約して、リソース利用ポリシーを施行します。


2. ジョブの制御方法

ジョブの投入方法

「qsub」コマンドを実行することでジョブをキューに投入することが出来ます。
$ qsub PBS_script.sh
「-v」オプションを使うことでジョブを投入する際にPBSスクリプト内の変数に値を渡すことも出来ます。以下に書式と例を示します。
$ qsub -v 変数1=値,変数2=値,変数3=値 PBS_script.sh
$ qsub -v x=10,y=20,char=abc my_pbs.sh
PBSスクリプトを使わずにジョブを投入する場合は、「qsub」コマンド内にPBS指示文、実行するプログラム(フルパス)、実行するプログラムに渡したい引数をそれぞれ記述し実行して下さい。以下に書式と例を示します。
$ qsub -PBS指示文 -- /path/to/your_program 引数1 引数2
$ qsub -q q1 -m abe -M taro.tenmon@nao.ac.jp -- /lfs01/tenmontr/my_prog.out 3.14 2.71
「qsub」コマンドに関する詳しい情報は以下のコマンドを実行し参照して下さい。
$ man qsub

ジョブの削除方法

キューへ投入したジョブを削除する場合は「qdel」コマンドを実行します。ここでジョブIDは後述する「qstat」コマンドを実行することで確認できます。
$ qdel ジョブID

ジョブの保留方法

「qhold」コマンドを実行することで、キュー待機状態のジョブを保留状態にすることが出来ます。保留状態のジョブは実行されません。
$ qhold ジョブID

ジョブの保留解除方法

「qrls」コマンドを実行することで、保留状態のジョブをキュー待機状態にすることが出来ます。
$ qrls ジョブID


3. PBSスクリプトの作成例

PBSスクリプトの作成例を紹介します。
# シングルコアを用いたPBSスクリプトの例
#!/bin/sh
#PBS -r y
#PBS -m abe
#PBS -q q1
#PBS -o Log.out
#PBS -e Log.err
#PBS -N job_name
#PBS -M taro.tenmon@nao.ac.jp
# Go to this job’s working director
cd $PBS_O_WORKDIR
# Run your executable
./a.out

# マルチコアを用いたPBSスクリプトの例
#!/bin/bash
#PBS -r y
#PBS -m abe
#PBS -q q4
#PBS -o Log.out
#PBS -e Log.err
#PBS -N job_name
#PBS -M taro.tenmon@nao.ac.jp
# Go to this job’s working directory
cd $PBS_O_WORKDIR
# Run your executable
./a_0.out &
./a_1.out &
./a_2.out &
./a_3.out


4. PBS指示文

PBSスクリプトでは多数のPBS指示文を利用することが出来ます。ここではよく使われるPBS指示文の紹介を行います。

PBS -q

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

PBS -r

「PBS -r」はシステム復旧時に投入されていたジョブを再実行するか否かを指定する指示文です。この指示文を指定しない場合は「PBS -r y」が指定されたとみなされます。

PBS -m

「PBS -m」は電子メールを発送するか否かを指定する指示文です。この指示文を指定しない場合は「PBS -m a」が指定されたとみなされます。

PBS -M

「PBS -M」はPBS Professinalから発送されるメールの送り先を指定する指示文です。「PBS -m [abe]」を指定した場合は「PBS -M 電子メールアドレス」を必ず指定して下さい。

PBS -N

「PBS -N」は投入するジョブに固有の名前をつけるための指示文です。名付けたジョブ名は「qstat」コマンドを実行した際に表示されます。なおジョブ名は15文字以内のASCII英数字文字列かつ先頭がアルファベットで始まる必要があります。この指示文を指定しない場合は当該ジョブの投入に使われたPBSスクリプトの名前がジョブ名となります。

PBS -o

「PBS -o」は標準出力をファイルに書き出すか否かを指定する指示文です。

PBS -e

「PBS -e」は標準エラー出力をファイルに書き出すか否かを指定する指示文です。

PBS -l

「PBS -l」は使用する計算リソースに制限を課すための指示文です。


5. PBS環境変数

PBSスクリプト内ではPBS Professionalが内部的に定義しているPBS環境変数を利用することが出来ます。ここではPBS環境変数を紹介します。
PBS_O_WORKDIR: PBSスクリプトが投入されたカレントディレクトリのパスです。
PBS_JOBNAME: 投入されたジョブのジョブ名です。
PBS_JOBID: 投入されたジョブのジョブIDです。
PBS_O_HOME: ジョブを投入したユーザのホームディレクトリです。
PBS_O_QUEUE: ジョブが投入されたキューの名称です。


6. 投入したジョブの状態の確認方法

投入したジョブの状態は「qstat」コマンドを実行することで確認できます。「qstat」コマンドは多数のオプションを持ちますが、ここではその幾つかを解説とともに紹介します。

qstat

オプション無しで「qstat」コマンドを実行すると以下の出力が行われます。
$ qstat
Job id            Name       User       Time Use  S  Queue
----------------  ---------  --------   -------   -  -----
9013.a000         job1       user1      50:20:10  R  q1
9019.a000         job2       user2      40:32:13  R  q1
9030.a000         job3       user3      30:14:19  R  q1
9079.a000         job4       user4      00:59:15  R  q1
9102.a000         job5       user5             0  Q  q1
ここで「S」列はジョブの状態を表しています。
E (Exiting):ジョブは実行済み。
H (Held):ジョブは保留状態。
Q (Queued):ジョブはキュー待機状態。
R (Running):ジョブは実行中。
S (Suspended):ジョブは中断中。

qstat -Q

「qstat -Q」コマンドを実行すると、バッチ型データ解析システムで利用可能な全キューの情報を参照することが出来ます。
$ qstat -Q
Queue              Max   Tot Ena Str   Que   Run   Hld   Wat   Trn   Ext Type
---------------- ----- ----- --- --- ----- ----- ----- ----- ----- ----- ----
q1                   0     0 yes yes     0     0     0     0     0     0 Exec
q4                   0     0 yes yes     0     0     0     0     0     0 Exec
q8                   0     0 yes yes     0     0     0     0     0     0 Exec
q16                  0     0 yes yes     0     0     0     0     0     0 Exec

qstat -q

「qstat -q」コマンドを実行すると、異なるフォーマットで全キューの情報を参照できます。
$ qstat -q
Queue            Memory CPU Time Walltime Node   Run   Que   Lm  State
---------------- ------ -------- -------- ---- ----- ----- ----  -----
q1                 11gb    --    720:00:0  --      0     0   --   E R
q4                 44gb    --    720:00:0  --      0     0   --   E R
q8                 88gb    --    360:00:0  --      0     0   --   E R
q16               176gb    --    360:00:0  --      0     0   --   E R
                                               ----- -----
                                                   0     0

qstat -u

「qstat -u」コマンドを実行すると、自分が投入したジョブのみを表示することが出来ます。
$ qstat -u ユーザ名

qstat -r

「qstat -r」コマンドを実行すると、現在実行中のジョブのみを表示することが出来ます。
$ qstat -r

man qstat

「qstat」コマンドの詳しい使い方を知りたい場合は以下のコマンドを実行して下さい。
$ man qstat


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

ユーザがキュー毎に定められている最大実行可能ジョブ数を超える数のジョブを投入すると、同ユーザのジョブの実行優先度が下がります。これはPBS Professionalのソフトリミットによる制限です。以下の設定は優先度制御を説明するための設定例です。
set queue q1 max_run = [u:PBS_GENERIC=8]
set queue q1 max_run_soft = [u:PBS_GENERIC=4]
優先度の低いジョブが実行されている時に他のユーザが8個以下のジョブを投入すると、優先度の低いジョブは中断状態となり他のユーザのジョブが終了するまで待たされます。中断されたジョブは「qstat」コマンドを実行した際に「S」と表示されます。
Job id            Name       User          Time Use  S  Queue
----------------  ---------  -----------   -------   -  -----
9013.a000         myjob      someuser      01:02:10  S  q1

優先度制御の例

キュー「q1」に複数の利用者がジョブを投入した場合の優先度制御の例を紹介します。ここでキュー「q1」で利用できるCPUコア数を8個、最大実行可能ジョブ数を8個、ソフトリミットを4個と仮定します。

1. ユーザAが11本のジョブを投入した時、ジョブを投入しているユーザが他にいなければ8本のジョブが実行される。

Running : A A A A A' A' A' A' 5本目から8本目のジョブA'は優先度が低い。
Queued : A” A” A” 9本目以降のジョブA”はキューイング状態となる。


2. ユーザBがジョブを4本投入すると、優先度の低いジョブA'は中断される。

Running : A A A A B B B B A'にかわりユーザBのジョブが実行される。
Queued : A” A” A”  
Suspended : A' A' A' A' ジョブA'は中断される。


3.ユーザBのジョブが終了すると、ジョブA'が再実行される。

Running : A A A A A' A' A' A' ジョブA'が再実行される。
Queued : A” A” A”  



8. ジョブのRound-robin形式制御について

キューにジョブが投入されていない状態でジョブの投入を開始すると、ジョブは各計算サーバに以下のような順序で分配されていきます。これはジョブを各計算サーバに分散して負荷を均一にしようとするRound-robin形式と呼ばれる制御です。
kaibm01 => kaibm02 => kaibm01 => kaibm02 => ...


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

解析システムで定期メンテナンスが行われる際、実行中及びキュー待機状態のジョブは破棄されます。定期メンテナンス終了後、ジョブの再投入を行ってください。

ADC
2019-07-19