#author("2021-09-13T17:52:28+09:00","","")
* OpenPBS [#k6a51ff4]
#author("2021-09-13T17:53:49+09:00","","")
* RHL8.0にOpenPBSのインストール [#r55f640c]

[[VMWare 3.2>VMWare]]を利用して構築したLinuxの[[仮想ネットワーク>VMNet]]に[[OpenPBS:http://www.OpenPBS.org/]]をインストールして使い方を確認します。

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

**内容 [#u138eb48]
#contents
|2004-07-28||改訂2|
|2003-07-21||改訂1|
|2003-02-28|RIGHT:桑村 潤||

*バッチシステムの構成 [#k277f12e]

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

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

-バッチシステムのキューサーバ
--ホスト名: server


-複数の実行ホスト(CPUサーバ)
--ホスト名: linux1, linux2, linux3


                    +-------QueueSERVER------+
                    | server                 |
                    |                        |
                    | ExecHOST-+  ExecHOST-+ |
                    | | linux1 |  | linux2 | |
                    | +--------+  +--------+ |
                    |       ExecHOST-+       |
                    |       | linux3 |       |
                    |       +--------+       |
                    +------------------------+

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

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


* OpenPBSの配備 [#pc22ed2c]

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

** OpenPBSのダウンロード [#l986527a]

[[www.OpenPBS.org:http://www.OpenPBS.org/]] の [[ダウンロードサイト:http://www.openpbs.org/download.html]] から入手します。ダウンロードの前に
"OpenPBS Software Registration Form"から登録を行う必要があります。
この文書の執筆時点では OpenPBS_2_3_16.tar.gz を入手できます。
最新は商用版の[[PBS Rro 5.2:http://www.pbspro.com/new_features.html]] となっていて機能が充実しています。
登録ユーザは[[文書サイト:http://www.openpbs.org/docs.html]]から管理マニュアル("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のバイナリパッケージ作成 [#bcfde05a]

ダウンロードしたOpenPBSを展開して構成(configure)とメイク(make)をします。オプションについては次のとおりです。
- --enable-server を指定して全てのサーバをメイクします。
- 実行モジュールのインストール先を --prefix=''/opt/pbs'' の下にします。
- 各ホスト毎のホームディレクトリ($PBS_HOME)は --set-server-home=''/var/spool/PBS'' にします。
- バッチキューサーバの名前は --set-default_server=''server'' にします。この名前は、$PBS_HOME/server_name ファイルに登録されます。

- ホスト間のファイルのリモートコピーにはSSH系の scp を使えるように ''--with-scp'' を指定します。

 # 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":http://bellatrix.pcl.ox.ac.uk/~ben/pbs/]]
をご覧ください。RPMを作るためのSPECファイルが
あります。同ページにはその他のパッチもありますので、必要に応じて追加するとよいでしょう(たとえば readline など、添付ファイルopnpbs.specを参照ください)。
#ref(openpbs.spec)

** OpenPBSのサーバへの配備 [#h70e612d]

*** OpenPBSのサーバへのインストール [#p516ac24]

作成した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(rc.pbs)
 #!/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のサーバの設定 [#gdad1b0e]

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

** pbs_server の設定 [#l97d9210]

***  実行ホスト(ノード)の登録 [#z7530776]

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)に続けてノード名を指定します。
- ノードがタイムシェアリングノードの場合はノード名につづけて '':ts'' を付加し、クラスターノードの場合はつけません。
- ノードにはその他にプロパティの指定ができます。
- クラスターの場合はさらに仮想プロセッサ数を指定できます。

実行ホストを登録すると ''$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ノードずつの定義がされています。

*** キューの作成と設定 [#o016e382]

キューの作成は ''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 の設定 [#s05b29d2]

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)の起動 [#o531dd89]

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の実行ホスト(ノード)への配備 [#dcbc850f]

実行ホスト(ノード)で必要なのは、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の実行ホストへのインストール [#befd0396]

今回用意したバイナリパッケージにはソースアーカイブから 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(rc.pbs)

/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 の設定 [#me2a05cd]

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

 $logevent 0x1ff
 $clienthost server

- ''$clienthost'' にはサーバが走っているホストの名前を指定します。
- ''$logevent'' はログに記録するイベントのレベルです。ログファイルは1日毎に $PBS_HOME/mom_logs/ の下に作られます。

スケジューラでロードバランシングをする場合は、以下の ''$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)の起動 [#j1a6e695]

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

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


*[[そして、いよいよOpenPBSでのジョブの実行です。>QSub]] [#zf897c60]