RHL8.0にOpenPBSのインストール

VMWare 3.2を利用して構築したLinuxの仮想ネットワークOpenPBSをインストールして使い方を確認します。

本当は、計算ノードあたり同時実行ジョブを1つにしたかったのですが、OpenPBS のスケジューラではそれがうまくゆかなかったため、タイムシェアリングノードで、ロードアベレージの設定を調整してやってみました。PBSProを使うと、クラスターノードで簡単に設定できます。

内容

2004-07-28改訂2
2003-07-21改訂1
2003-02-28桑村 潤

バッチシステムの構成

さきに、VMWare 3.2を利用して仮想ネットワーク(VMNet)の構築をおこないます。

OpenPBSには 3つのデーモンプロセス(pbs_server, pbs_sched, pbs_mom)があり、それぞれ、バッチキューサービス、スケジューリング、そして、実行サービスを司ります。 ここで構築するバッチシステムは、バッチキューを提供しジョブのスケジューリングを行うキューサーバと、ジョブの実行を行う実行ホストとからなります。キューサーバと実行ホストとは一つのホスト上で働いても良いのですが、ここでは、それぞれ役割を分担したホストにてバッチシステムを構成します。

                   +-------QueueSERVER------+
                   | server                 |
                   |                        |
                   | ExecHOST-+  ExecHOST-+ |
                   | | linux1 |  | linux2 | |
                   | +--------+  +--------+ |
                   |       ExecHOST-+       |
                   |       | linux3 |       |
                   |       +--------+       |
                   +------------------------+
                +--------+  +--------+  +--------+
                | linux1 |  | linux2 |  | linux3 | - - - 実行ホスト
                +----+---+  +----+---+  +----+---+       (pbs_mom)
                     |           |           |
 o-------+-----------+-----------+-----------+-------o 
         |
     +---+----+
     | server | - - - バッチキューサーバ(pbs_server, pbs_sched)
     +--------+

バッチキューサーバに投入(サブミット)されたジョブは、スケジューラに調整されて負荷の少ない実行ホストにて実行されます。

OpenPBSの配備

OpenPBSをダウンロードし、バイナリを作って配備します。RHL8.0 では `configure; make;` がうまくゆかなくなってますので、別のディストリビューションのLinuxプラットホーム(今回は Plamo Linux 3.0を利用)でバイナリをメイクしインストールしたものを配備するとスムースにゆきます。 複数の実行ホストにそれぞれ配備するのは手間がかかりますので、NFSを利用して実行モジュールを共有することにし、実行環境のみそれぞれのホストに別々に作成することにします。

OpenPBSのダウンロード

www.OpenPBS.orgダウンロードサイト から入手します。ダウンロードの前に "OpenPBS Software Registration Form"から登録を行う必要があります。 この文書の執筆時点では OpenPBS_2_3_16.tar.gz を入手できます。 最新は商用版のPBS Rro 5.2 となっていて機能が充実しています。 登録ユーザは文書サイトから管理マニュアル("PBS Administration Guide")を入手可能です。

アカウントを登録が済んだら、wget コマンドを利用して、次のようにソースアーカイブと管理マニュアルを入手できます。

# wget --http-user=%USER% --http-passwd=%PASS% \
       http://www.openpbs.org/UserArea/Download/OpenPBS_2_3_16.tar.gz
# wget --http-user=%USER% --http-passwd=%PASS% \
       http://www.openpbs.org/UserArea/Download/v2.3_admin.pdf

ここで、%USER% と %PASS% は取得したアカウントのユーザIDとパスワードです。

OpenPBSのバイナリパッケージ作成

ダウンロードしたOpenPBSを展開して構成(configure)とメイク(make)をします。オプションについては次のとおりです。

# tar xvfz OpenPBS_2_3_16.tar.gz
# ./configure  --prefix=/opt/pbs \
    --enable-server \
    --set-default_server=server \
    --set-server-home=/var/spool/PBS \
    --with-scp
# make

GUIインターフェースの管理プログラム(xpbs)やモニター用プログラム(xpbsmon)はTcl/Tkで書かれています。もし、Tcl/Tkをインストールしてあるにもかかわらず、Tcl/Tkのライブラリが見つからないようであれば、次のようにシンボリックを張ります。

   pushd /usr/lib
   ln -sf libtcl8.0jp.so libtcl8.0.so
   ln -sf libtk8.0jp.so libtk8.0.so
   popd

メイクに成功したら、インストールを行います。また、配備に便利なコマンドが含まれている buildutils ディレクトリもコピーしておきます。

# make install
# (cd doc; make install)
# cp -a buildutils /opt/pbs/

ライセンスなどの文書類もコピーしておきます。

# mkdir -p /usr/doc/OpenPBS_2_3_16
# cp -p INSTALL PBS_License.* Read.Me Release_Notes config.status \
   v2.3_admin.pdf /usr/doc/OpenPBS_2_3_16
# chmod -R a+rX /usr/doc/OpenPBS_2_3_16

インストールに成功したら、バイナリアーカイブに固めてベースとなるパッケージの完成です。

 # tar cvfz OpenPBS_2_3_16-i386-linux.tgz \
    /opt/pbs /var/spool/PBS /usr/doc/OpenPBS_2_3_16

ネットワークで繋がっていれば、これを server へリモートコピーします。

 # scp OpenPBS_2_3_16-i386-linux.tgz server:

※ RPMを作ることも可能です。詳しくは、 "PBS resources at the WGR/PDL lab" をご覧ください。RPMを作るためのSPECファイルが あります。同ページにはその他のパッチもありますので、必要に応じて追加するとよいでしょう(たとえば readline など、添付ファイルopnpbs.specを参照ください)。

#ref(): File not found: "openpbs.spec" at page "OpenPBS"

OpenPBSのサーバへの配備

OpenPBSのサーバへのインストール

作成したOpenPBSのパッケージを / ファイルシステムから展開します。

# tar xvfz OpenPBS_2_3_16-i386-linux.tgz -C /
# chown -R root /var/spool/PBS

作業をし易いように $PBS_HOME 環境変数と実行プログラムのあるディレクトリへのパスを通します。使用しているシェルは bash でしょうから、ホームディレクトリの .bashrc (~/.bashrc)ファイルに次の3行を追加します。

export PBS_HOME=/var/spool/PBS
export PATH=/opt/pbs/sbin:/opt/pbs/bin:$PATH
export MANPATH=/opt/pbs/man:$MANPATH

これで、次回のログインあるいはスイッチユーザ(su)したときから有効になりますが、その場で有効にしたければ、次のコマンドを実行します。

# . ~/.bashrc

以下のような、OpenPBSが使うサービスのポートを /etc/services に追加します。

#
# services for OpenPBS
#
pbs             15001/tcp               # pbs server (pbs_server)
pbs_mom         15002/tcp               # mom to/from server
pbs_resmom      15003/tcp               # mom resource management requests
pbs_resmom      15003/udp               # mom resource management requests
pbs_sched       15004/tcp               # scheduler

サーバのデーモンプロセスがマシン起動時に自動的に起動するように、以下のような内容のスタートアップスクリプトを /etc/init.d/pbs というファイル名でつくっておきます。

#ref(): File not found: "rc.pbs" at page "OpenPBS"

#!/bin/sh
#
# pbs          This script will start and stop the PBS daemons
#
# chkconfig: 345 85 85
# description: PBS is a batch versitle batch system for SMPs and clusters
#

# Source the library functions
. /etc/rc.d/init.d/functions
PBS_HOME=/var/spool/PBS

# let see how we were called
case "$1" in
  start) 
         echo "Starting PBS daemons: "
         if [ -x /opt/pbs/sbin/pbs_mom ] ; then
             if [ -f $PBS_HOME/mom_priv/config ] ; then
                 echo -n "Starting pbs_mom: "
                 daemon /opt/pbs/sbin/pbs_mom
                 echo
             fi
         fi
         if [ -x /opt/pbs/sbin/pbs_sched ] ; then
             if [ -d $PBS_HOME/sched_priv ] ; then
                 echo -n "Starging pbs_sched: "
                 daemon /opt/pbs/sbin/pbs_sched
                 echo
             fi
         fi
         if [ -x /opt/pbs/sbin/pbs_server ] ; then
             if [ -d $PBS_HOME/server_priv ] ; then
                 echo -n "Starting pbs_server: "
                 daemon /opt/pbs/sbin/pbs_server -a true
                 echo
             fi
         fi
  ;;
  stop)
         echo "Shutting down PBS: "
         if [ -x /opt/pbs/sbin/pbs_server ] ; then
             if [ -d $PBS_HOME/server_priv ] ; then
                 echo -n "Stopping pbs_server: "
                 killproc pbs_server
                 echo
             fi
         fi
         if [ -x /opt/pbs/sbin/pbs_sched ] ; then
             if [ -d $PBS_HOME/sched_priv ] ; then
                 echo -n "Stopping pbs_sched: "
                 killproc pbs_sched
                 echo
             fi
         fi
         if [ -x /opt/pbs/sbin/pbs_mom ] ; then
             if [ -f $PBS_HOME/mom_priv/config ] ; then
                 echo -n "Stopping pbs_mom: "
                 killproc pbs_mom
                 echo
             fi
         fi
  ;;
  status)
         status pbs_server
         status pbs_mom
         status pbs_sched
  ;;
  restart)
         echo "Restarting PBS"
         $0 stop
         $0 start
         echo "done."
  ;;
  *)
         echo "Usage: pbs {start|stop|restart|status}"
         exit 1
esac

このスクリプトでは、$PBS_HOME下の所定の場所にそれぞれのデーモンプロセスが必要と するファイルまたはディレクトリが存在を確認してから各プロセスを起動するようになっています。/etc/init.d/pbs スクリプトを自動起動スクリプトとして登録します。

# chkconfig --add pbs
# chkconfig pbs on
# chkconfig --list pbs

OpenPBSのサーバの設定

ホスト server には、OpenPBSサーバで走るデーモンプロセスの pbs_server と pbs_sched の設定を行います。

pbs_server の設定

実行ホスト(ノード)の登録

OpenPBSサーバの設定は qmgr コマンドを実行してインターラクティブに行えます。qmgr コマンドは pbs_server と通信してサーバの管理を行うことができます。設定した情報はデータベースファイル($PBS_HOME/server_priv/serverdb 等)に保存されますが、まず、それらファイルを初期化する必要があります。データベースの初期化は pbs_server デーモンプログラムを -t create オプションを付けて実行するとできます。

# /opt/pbs/sbin/pbs_server -t create

この実行で pbs_server はデータベースを初期化すると同時にデーモンプロセスとして走り、qmgr からの命令で設定が可能となります。qmgr を実行すると次のように Qmgr: とういうプロンプトが表示されます。

# qmgr
Max open servers: 4
Qmgr: 

qmgrのコマンドの構文は、

   command server [names] [atrr OP value [,attr OP value,...]]
   command queue [names] [atrr OP value [,attr OP value,...]]
   command node [names] [atrr OP value [,attr OP value,...]]

です。詳しくは "PBS Administrator Guide" の "9.6 Qmgr Command" の節にあります。

ここでは、3台の実行ホストを登録し、dque というキューを作成してみます。 実行ホスト(ノード)の登録は create node コマンド(qmgr)に続けてノード名を指定します。

実行ホストを登録すると $PBS_HOME/server_priv/nodes ファイルに平文で書き出されされますので、このファイルを手で編集しても同じ結果となりです。ここでは、タイムシェアリングノードとして qmgr を使って登録する方法を示します。

# qmgr
Qmgr: create node linux1:ts
Qmgr: create node linux2:ts
Qmgr: create node linux3:ts
Qmgr: quit

nodes ファイルの中を表示すると登録されたことが確かめられます。

# cat $PBS_HOME/server_priv/nodes 
linux1:ts
linux2:ts
linux3:ts

1行に1ノードずつの定義がされています。

キューの作成と設定

キューの作成は create queue コマンド(qmgr)でこない、その設定は set queue コマンド(qmgr)で行います。また、サーバの設定は set server コマンド(qmgr)で行います。 ここでは dque という名前のキューを作ってみます。

Qmgr: create queue dque queue_type = execution
Qmgr: set queue dque enambeld = true
Qmgr: set queue dque started = true
Qmgr: set server default_queue = dque
Qmgr: set server scheduling = true

qmgr のコマンドは省略形も使えます。'create node' は 'c n', 'create queue' は 'c q', 'set queue' は 's q', 'set server' は 's s' といった具合です。

キューのタイプにはジョブを実行に回す Execution とジョブを別のキューへ回す Route とがありますが、ここでは実行に回すほうです。あとは、キューイングを可能にして、キューのサービスを開始、サーバーのスケジューラも開始してこのキューをデフォルトのキューに指定してます。これらの設定状態は、print server コマンド(qmgr)で確認できます。

Qmgr: print server
#
# Create and define queue dque
#
create queue dque
set queue dque queue_type = Execution
set queue dque enabled = True
set queue dque started = True
#
# Set server attributes.
#
set server scheduling = True
set server default_queue = dque
set server log_events = 511
set server mail_from = adm
set server scheduler_iteration = 600

この設定をファイルに保存したい場合は、qmgrコマンドを標準入力から与えてファイルにリダイレクトするとできます。そして、逆に、このファイルをリダイレクトで qmgr コマンドへ与えるとファイルからの設定ができますますので、初期化して作りなおす時には便利です。

# echo "p s" | qmgr > print_server.out
# qmgr < print_server.out

設定あるいは表示可能な属性については、"PBS Administrator Goide" の "9.7 Server Attributes" の節にあります。list コマンド(qmgr)で属性の表示ができます。

Qmgr: list queue dque
Queue dque
        queue_type = Execution
        total_jobs = 0
        state_count = Transit:0 Queued:0 Held:0 Waiting:0 Running:0 Exiting:0 
        enabled = True
        started = True

キューの状態は qstat コマンドで見ることができます。キューにジョブが無い時は 引数 -q あるいは -Q を付けると表示されます。

# qstat -q
server: server
Queue            Memory CPU Time Walltime Node Run Que Lm  State
---------------- ------ -------- -------- ---- --- --- --  -----
dque               --      --       --     --    0   0 --   E R
                                               --- ---
                                                 0   0
# qstat -Q
Queue            Max Tot Ena Str Que Run Hld Wat Trn Ext Type
---------------- --- --- --- --- --- --- --- --- --- --- ----------
dque               0   0 yes yes   0   0   0   0   0   0 Execution 

pbs_sched の設定

OpenPBSのデフォルト構成では FIFO スケジューラが利用可能となります。このスケジューラの設定は $OPEN_PBS/sched_priv/sched_config で行われます。OpenPBSではノード毎のジョブの本数制限ができませんので、ここでは、ロードバランシングでジョブの本数に制限をかけます。また、ジョブの大小によるソートはしませんので、次の構成を変更します。

load_balancing: true    ALL
sort_by: no_sort        ALL

ロードバランスを行う閾値は実行ホスト側の $PBS_HOME/mom_priv/config に設定します。具体的には $ideal_load と $max_load に値を設定します。これらの値は、/proc/ loadavg にある値と比較されます。

他の設定も必要かもしれませが、とりあえずです。

キューサーバ(pbs_server,pbs_sched)の起動

pbs_server と pbs_sched の設定が整ったら、データベースの初期化のために走らせた pbs_server を一旦停止して、サーバの起動をしてみます。

# killall pbs_server
# /etc/init.d/pbs start
Starting PBS daemons: 
Starging pbs_sched: [  OK  ]
Starting pbs_server: [  OK  ]

OpenPBSの実行ホスト(ノード)への配備

実行ホスト(ノード)で必要なのは、pbs_mom デーモンプロセスのみです。ここでは、pbs_mom を実行するのに必要な環境をつくり、pbs_mon の構成を行います。 既にサーバ(server)には OpenPBS がインストールされています。各実行ホスト(linux1, linux2, linux3)では server でインストールされた実行実行もジュールのファイルシステム(/opt/pbs)を NFSマウントして利用することにします。もう既に、server:/opt/pbs は各実行ホストに NFSマウントされた状態になっているかも知れませんが、もし未だであれば次のコマンドにてマウントできます(VMNetを参照)。

# mount -t nfs server:/opt/pbs /opt/pbs

OpenPBSの実行ホストへのインストール

今回用意したバイナリパッケージにはソースアーカイブから buildutils というディレクトリを含めています。この中に pbs_mkdirs というシェルスクリプトがあり、これを使って $PBS_HOME/以下の環境を作ることができます(サーバ側では `make install;` したときに作られた環境をそのままパッケージに含めていたため、この作業は不要でした)。実行ホストでは pbs_mom デーモンプロセスが稼働するためのディレクトリ環境が必要で、このディレクトリ環境は以下の pbs_mkdirs の実行を行うとできあがります。

# /opt/pbs/buildutils/pbs_mkdirs default
# /opt/pbs/buildutils/pbs_mkdirs mom
# /opt/pbs/buildutils/pbs_mkdirs aux

また、サーバと同様に環境を整えます。ホームディレクトリの .bashrc (~/.bashrc)ファイルに次の3行を追加します。

export PBS_HOME=/var/spool/PBS
export PATH=/opt/pbs/sbin:/opt/pbs/bin:$PATH
export MANPATH=/opt/pbs/man:$MANPATH
# . ~/.bashrc

OpenPBSが使うサービスのポートを /etc/services に追加します。

#
# services for OpenPBS
#
pbs             15001/tcp               # pbs server (pbs_server)
pbs_mom         15002/tcp               # mom to/from server
pbs_resmom      15003/tcp               # mom resource management requests
pbs_resmom      15003/udp               # mom resource management requests
pbs_sched       15004/tcp               # scheduler

pbs_mom デーモンプロセスがマシン起動時に自動的に起動するように、スタートアップスクリプトを /etc/init.d/pbs というファイル名でつくっておきます(このスクリプトはサーバと実行ホスト兼用です)。

#ref(): File not found: "rc.pbs" at page "OpenPBS"

/etc/init.d/pbs スクリプトを自動起動スクリプトとして登録します。

# chkconfig --add pbs
# chkconfig pbs on
# chkconfig --list pbs

pbs_mom の実行モジュールはサーバのファイルシステム上にあるものを NFS マウントして使います。したがって、NFSの走らない RHL OSのランレベル2 では起動がかからないようにしておきます。

# chkconfig --level 2 off pbs

pbs_mom の設定

pbs_mom の構成は $PBS_HOME/mom_priv/config で行います。

$logevent 0x1ff
$clienthost server

スケジューラでロードバランシングをする場合は、以下の $ideal_load$max_load 設定も行います。ただし、実際に使う値は調整が必要です。

$ideal_load 1.0
$max_load 2.0

これらの値は /proc/loadavg の中の値と比較されます。

$PBS_HOME/server_name にデフォルトのサーバ名(ここでは、server)があることを確認します。

# cat $PBS_HOME/server_name
server

実行サーバ(pbs_mom)の起動

pbs_mom の設定が整ったら実行サーバの起動をます。

# /etc/init.d/pbs start
Starting PBS daemons: 
Starging pbs_mom: [  OK  ]

そして、いよいよOpenPBSでのジョブの実行です。