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をダウンロードし、バイナリを作って配備します。RHL8.0 では `configure; make;` がうまくゆかなくなってますので、別のディストリビューションのLinuxプラットホーム(今回は Plamo Linux 3.0を利用)でバイナリをメイクしインストールしたものを配備するとスムースにゆきます。 複数の実行ホストにそれぞれ配備するのは手間がかかりますので、NFSを利用して実行モジュールを共有することにし、実行環境のみそれぞれのホストに別々に作成することにします。
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を展開して構成(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のパッケージを / ファイルシステムから展開します。
# 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
ホスト server には、OpenPBSサーバで走るデーモンプロセスの pbs_server と pbs_sched の設定を行います。
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
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 を一旦停止して、サーバの起動をしてみます。
# killall pbs_server # /etc/init.d/pbs start Starting PBS daemons: Starging pbs_sched: [ OK ] Starting pbs_server: [ OK ]
実行ホスト(ノード)で必要なのは、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
今回用意したバイナリパッケージにはソースアーカイブから 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_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 の設定が整ったら実行サーバの起動をます。
# /etc/init.d/pbs start Starting PBS daemons: Starging pbs_mom: [ OK ]