*OpenPBSでのジョブ数制限
 
 [[OpenPBS:http://www.OpenPBS.org/]]のルーティングキューを利用してジョブの同時実行数を制限する方法を示します。
 
 **内容
 #contents
 |2003-03-31|RIGHT:桑村 潤|
 
 *OpenPBSのルーティングキュー
 
 すでに基本となる[[OpenPBSによるTSS環境>OpenPBS]]は既に構築されていることとします。既に、ロードバランシングのために実行ホストのロードアベレージ情報から同時実行ジョブ数の制限を行う方法は既に示した通りです。ロードアベレージの閾値を試行を繰り返して確定する必要があります。
 ここでは、同時実行ジョブ数の制限を厳密にジョブの同時実行数で行うための方法を説明します。商用版のPBSProにはこの機能があるようですが、OpenPBSにはありません。このため、OpenPBSのキューのルーティング機能を利用してこの制限を設けます。ルーティングキューはジョブを別のキューへ振り分け転送することが可能です。このキューの特性を活用して、ルーティングキューでジョブを待機させ、実行ホストに作る実行キューにてジョブの数を制限します。ここでは、同時実行ジョブ数を1とするための設定を行います。
 
 
                   +--------+
                   | linux4 | - - - 実行キューおよび実行ホスト
                   +---+----+
                       |
   o-------+-----------+--------o
           |
       +---+----+
       | server | - - - ルーティングキュー
       +--------+
 
 
 **実行キューのインストール
 
 OpenPBSのインストレーションを利用するために、既にインストールされたキューサーバーよりエキスポートされたファイルシステム(server:/opt/pbs)をマウントします。そして、以下のコマンドを実行して、新しい実行ホスト上に実行キューを含むOpenPBSの環境を新たに作ります。
 
  # cd /opt/pbs/buildutils
  # sh pbs_mkdirs all
  # cat /opt/pbs/etc/pbs_services.add >> /etc/services
 
 PBSのデーモンが稼働するようにします。
 
  # cp /opt/pbs/etc/rc.pbs /etc/init.d/pbs
  # chkconfig --add pbs
  # chkconfig --list pbs
 
 時刻をキューサーバーに合わせます。
 
  # rdate -s server
 
 時刻は定期的にサーバに合わせるよう設定します。
 
  # echo "rdate -s server" > /etc/cront.daily/time
 
 
 OpenPBSの実行アカウントの、 ~/.bashrc に以下を追加し、
 
  export PBS_HOME=/var/spool/PBS
  export PATH=/opt/pbs/bin:/opt/pbs/sbin:$PATH
 
 設定を有効にします。
 
  $ . ~/.bashrc
 
 
 実行キューのためにデータベースを初期化し、実行キュー(ここでは que4 という名前)を作成します。
 
  # pbs_server -t create
  # qmgr
  Qmgr: c n linux4:ts                            # create node ...
  Qmgr: c q que4 queue_type=e                    # create queue ... Execution
  Qmgr: s q que4 enabled=true                    # set queue ...
  Qmgr: s q que4 started=true
  Qmgr: s s scheduling=true                      # set server ...
  Qmgr: s s default_node=linux4
  Qmgr: s q que4 max_running=1
  Qmgr: s q que4 max_queuable=3
 
 キューに対して同時実行ジョブ数を max_running に指定(=1)して、キューイング可能なジョブ数を max_queuable に指定(=3)する。
 
 
 /etc/hosts.equiv にホスト名を登録して、ルーティングキューサーバからのアクセスを許可します。
 
  # echo "server" >> /etc/hosts.equiv
 
 
 **ルーティングキューのインストール
 
 キューサーバ側では以下のようにルーティングキュー(ここでは route4 という名前)をの設定を行います。
 
  # qmgr
  Qmgr: c q route4 queue_type=r                  # create queue ... Route
  Qmgr: s q route4 route_destinations=que4@linux4.vmnet.rccm.jp
  Qmgr: s q route4 enabled=true
  Qmgr: s q route4 started=true
 
 ルーティングキューにてキューイング可能なジョブ数を複数指定しても、投入されたジョブは、実行キューの方へ送られるため、実行キューに十分な数だけキューイング可能なジョブを指定していない場合は、ジョブはキューイングされない。
 
 
 *ルーティングキューへのサブミット
 
 サーバ側でルーティングキューへジョブを続けてサブミット。
 
  [@server]$ qsub -q route4 findtest.sh
  [@server]$ qsub -q route4 findtest.sh
 
 サーバ側のキューを見ると、なにもない状態。
 
  [@server]$ qstat -Q
  Queue            Max Tot Ena Str Que Run Hld Wat Trn Ext Type
  ---------------- --- --- --- --- --- --- --- --- --- --- ----------
  route4             0   0 yes yes   0   0   0   0   0   0 Route
  dque               0   0 yes yes   0   0   0   0   0   0 Execution
 
 
 実行ホスト側を見ると、1つのジョブが実行中で、1つはキューで待機している。
 
  [@linux4]$ qstat -Q
  Queue            Max Tot Ena Str Que Run Hld Wat Trn Ext Type
  ---------------- --- --- --- --- --- --- --- --- --- --- ----------
  que4               1   2 yes yes   1   1   0   0   0   0 Execution