OpenPBSのルーティングキューを利用してジョブの同時実行数を制限する方法を示します。
2003-03-31 | 桑村 潤 |
すでに基本となるOpenPBSによるTSS環境は既に構築されていることとします。既に、ロードバランシングのために実行ホストのロードアベレージ情報から同時実行ジョブ数の制限を行う方法は既に示した通りです。ロードアベレージの閾値を試行を繰り返して確定する必要があります。 ここでは、同時実行ジョブ数の制限を厳密にジョブの同時実行数で行うための方法を説明します。商用版の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