OpenPBSでのジョブ数制限

OpenPBSのルーティングキューを利用してジョブの同時実行数を制限する方法を示します。

内容

2003-03-31桑村 潤

OpenPBSのルーティングキュー

すでに基本となる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