分散トランザクション処理機能 OpenTP1 解説

[目次][用語][索引][前へ][次へ]

3.4.3 プロセスの制御

OpenTP1のシステムサービス,またはユーザサーバ(UAP)を実行するときには,OSの作業領域を使います。この作業領域の処理をプロセスといいます。ユーザサーバの実行によって生成されるプロセスを特にユーザサーバプロセスUAPプロセス,または単にプロセスといいます。

OpenTP1では,システムサービスとユーザサーバのプロセスが必要以上に増えたり減ったりしないように,プロセスサービス定義の指定に従って,使うプロセスの総数を制御しています。

ユーザサーバプロセスを制御するには,ユーザサーバを事前に開始していることが前提です。OpenTP1と一緒に開始させておくか,dcsvstart -uコマンドで開始させておきます。

<この項の構成>
(1) マルチサーバ
(2) 常駐プロセスと非常駐プロセス
(3) マルチサーバ負荷バランス機能
(4) スケジュールの優先度
(5) 非常駐UAPプロセスのリフレッシュ機能
(6) ノード間負荷バランス機能
(7) ノード間負荷バランス機能使用時の定義
(8) ノード間負荷バランス拡張機能
(9) マルチスケジューラ機能

(1) マルチサーバ

実行中のユーザサーバに対して,さらにサービス要求が来た場合でも,ユーザサーバの処理を新しい別のプロセスで実行できます。このように,一つのユーザサーバの処理を,別のプロセスで並行して実行する機能をマルチサーバといいます。

マルチサーバを使えるのは,スケジュールキューを使うSPP(キュー受信型サーバ),およびMHPです。ソケット受信型サーバの場合はマルチサーバを使えません。ソケット受信型サーバには,使うプロセスは一つだけと,ユーザサービス定義で指定してください。

(2) 常駐プロセスと非常駐プロセス

ユーザサービス定義でマルチサーバを指定したUAPのプロセスを,OpenTP1の稼働中にいつも確保しておくことも,動的に確保することもできます。いつも確保されているプロセスを常駐プロセスといいます。また,稼働中には確保されていなくて,必要に応じて起動されるプロセスを非常駐プロセスといいます。

マルチサーバを使う場合,使うプロセスの最大値をユーザサービス定義で設定しておきます。常駐プロセスを複数個指定していれば,指定した数だけ並行してプロセスが起動されます。また,非常駐プロセスを複数個指定していれば,指定した数だけ動的にプロセスが起動されます。

プロセスを非常駐プロセスと設定しておくと,OpenTP1システム内のメモリ領域を効率良く使えます。また,プロセスを常駐プロセスと設定しておくと,そのユーザサーバの処理は非常駐プロセスに比べて速くなります。

システムのメモリに空きがない場合,非常駐プロセスは稼働中の非常駐プロセスが終了してから実行されます。

プロセスを常駐とするか非常駐とするかは,ユーザサービス定義でユーザサーバの起動プロセス数を事前に指定しておきます。

(3) マルチサーバ負荷バランス機能

スケジュールキューにあるサービスの要求数に応じて,非常駐プロセスの数を増やしたり減らしたりする機能をマルチサーバ負荷バランス機能といいます。

非常駐プロセスをいつ起動するかは,ユーザサービス定義のbalance_countオペランドに指定する値で決まります。(balance_countオペランドに指定した値 × 起動中のプロセス)の数を超えてサービス要求が滞留したときに,OpenTP1は非常駐プロセスを起動します。スケジュールキューに滞留しているサービス要求の数が(balance_countオペランドに指定した値 × 起動中のプロセス)の数以下になると,OpenTP1は非常駐プロセスを終了させます。

常駐/非常駐プロセスによるマルチサーバの概要を次の図に示します。

図3-51 常駐/非常駐プロセスによるマルチサーバの概要

[図データ]

(4) スケジュールの優先度

一つ一つのユーザサーバには,ユーザサービス定義でスケジュールの優先度(スケジュールプライオリティ)を付けることができます。優先度が高いユーザサーバの非常駐プロセスは,ほかの非常駐プロセスに比べて優先的にスケジュールされます。

スケジュールの優先度の概要を次の図に示します。

図3-52 スケジュールの優先度の概要

[図データ]

(5) 非常駐UAPプロセスのリフレッシュ機能

非常駐プロセスを使用する場合,一つのサービス要求ごとに実行プロセスを起動し直すことができます。この機能を,非常駐UAPプロセスのリフレッシュ機能といいます。この機能を使用することで,リエントラント構造ではないUAPの実行もできるようになります。この機能は,非常駐プロセスだけで構成されるUAPの場合に使用できます。

この機能を使用するためには,ユーザサービス定義またはユーザサービスデフォルト定義に,scd_refresh_processオペランドを指定します。また,この機能は1プロセスが処理するサービス要求数(ユーザサービス定義のbalance_countオペランドの指定値)が0の場合にだけ使用できます。

非常駐UAPプロセスのリフレッシュ機能の詳細については,マニュアル「OpenTP1 プログラム作成の手引」を参照してください。

(6) ノード間負荷バランス機能

SPPに要求されたサービスの処理に多くのプロセスが必要な場合,他ノードにある同じサービスグループ名のSPPに処理を分担できます。この機能をノード間負荷バランス機能といいます。ノード間負荷バランス機能を使用するためには,負荷分散の前提として次の条件を満たしている必要があります。

サービス要求は,任意に選ばれたノードのユーザサーバに渡されます。さらに,OpenTP1では,スケジュールするノードのサーバ情報を参照して,スケジュール性能が低くなっているノードは選ばれにくいように制御しています。そのため,自ノードにユーザサーバがあり,スケジュールできる状態でも,自ノードのユーザサーバに渡されるとは限りません。自ノードのユーザサーバを優先するには,スケジュールサービス定義のscd_this_node_firstオペランドにYを指定します。これによって,自ノードのユーザサーバのスケジュール性能が低いときだけ,ほかのノードのユーザサーバにスケジュールできます。

ノード間負荷バランス機能は,ノード間でユーザサーバの動作条件が同じであることを前提としています。選択されるノードによって次に示す条件が大きく異なる場合は,ノード間負荷バランス機能に不適当な環境ですので,同じ名前のサービスグループを複数のノードに配置しないでください。

ユーザサーバにスケジュールするときに参照するサーバ情報は,各ノードから通知されます。同じサービスグループ名のSPPが複数のノードにないシステムでは,サーバ情報を通知する必要がなく,むだな通信となります。特に,公衆回線を使用する場合,不要な回線料金が課金されます。したがって,同じサービスグループ名が複数のノードにないシステムでは,すべてのノードのスケジュールサービス定義のscd_announce_server_statusオペランドにNを指定して,サーバ情報の通知を抑止してください。

ノード間で負荷分散するSPPは,キュー受信型サーバでもソケット受信型サーバでもかまいません。ただし,ソケット受信型サーバの場合は,OpenTP1のスケジュール性能を参照する制御はしていません。

ノード間負荷バランス機能で負荷を分散できるノードの数は,最大128です。

ノード間負荷バランス機能の概要を次の図に示します。

図3-53 ノード間負荷バランス機能の概要

[図データ]

サービス要求は各ノードの負荷レベルに応じて,スケジュールされます。次に示す負荷レベルがあります。

各ノードの負荷レベルは,負荷監視インタバルごとに監視されます。その際,今回の負荷レベルは,前回の負荷レベル,キューイング数,サービス要求滞留数,およびサーバ処理率によって決定されます。

負荷レベルの決定条件について次の表に示します。

表3-11 負荷レベルの決定条件

前回の負荷レベル キューイング数:Q サービス要求滞留数:q サーバ処理率:X 今回の負荷レベル
LEVEL0 Q ≧ 1 X < 50 LEVEL1
LEVEL1
Q ≧ 1

75 ≦ X LEVEL0
50 ≦ X < 75 LEVEL1
X < 50 LEVEL2
LEVEL2 q = 0 LEVEL0
q ≧ 1 LEVEL2
(凡例)
−:無視します。
キューイング数
負荷監視インタバル間にスケジュールキューにキューイングされたサービス要求数です。
サービス要求滞留数
負荷監視時にスケジュールキューに滞留しているサービス要求数です。
サーバ処理率
次に示す計算式から算出される処理率です。
サーバ処理率=(サービス処理数/(キューイング数+サービス要求滞留数))×100
サービス処理数は,負荷監視インタバル間で処理したサービス要求数です。

負荷レベルに変更があった場合は,各ノードのネームサービスにサーバ情報が通知され,サーバ情報が更新されます。また,ユーザサービス定義のloadlevel_messageオペランドを使用すると,負荷レベルの変更を通知するメッセージを出力できます。

(7) ノード間負荷バランス機能使用時の定義

ノード間負荷バランス機能を使用する場合のTP1/Server Base側,TP1/Client側の関連する定義と処理,およびRPCの処理を説明します。

(a) サーバ側の判断で負荷分散を行う場合

TP1/Server Baseのスケジュールサービスが,ノードのスケジュール状態に応じて,より効率的に処理できるノードへ負荷を分散させます。

サーバ(TP1/Server Base)側の定義
TP1/Server Baseの定義では,次のどちらかの設定をする必要があります。
  • スケジュールサービス定義のオペランドに次の設定をする。
    set scd_this_node_first = N (デフォルト)
    set scd_announce_server_status = Y (デフォルト)
  • スケジュールサービス定義を省略する。
クライアント(TP1/Client)側の定義
クライアント環境定義に「dcscddirect=Y(TP1/Client/Pの場合)」を定義します。
これによって,TP1/Clientは,TP1/Server Baseのスケジュールサービスに負荷分散を依頼するため,TP1/Clientの定義でどのOpenTP1ノードのスケジュールサービスに判断を依頼するかを指定します。
この場合,スケジュールを依頼するOpenTP1ノードは,dchostオペランドに指定された順番にスケジュールを依頼します。dchostオペランドに書かれた順番ではなく,スケジュールを依頼するOpenTP1ノードをランダムに指定したい場合は,さらに「dchostselect=Y(TP1/Client/Pの場合)」を追加して定義する必要があります。
(b) サーバからの負荷情報からクライアント側で判断する場合
●クライアントがTP1/Clientのとき
サーバ(TP1/Server Base)側の定義
TP1/Server Baseの定義では,次のどちらかの設定をする必要があります。
  • スケジュールサービス定義のオペランドに次の設定をする。
    set scd_this_node_first = N (デフォルト)
    set scd_announce_server_status = Y (デフォルト)
  • スケジュールサービス定義を省略する。
クライアント(TP1/Client)側の定義
クライアント環境定義で「dccltloadbalance = Y(TP1/Client/Pの場合)」を定義します。
これによって,TP1/Server Baseから得たサーバの負荷レベルを基に,TP1/Clientでサービス要求を行うOpenTP1ノードを決めてからRPCを行います。
この場合,dccltcachetimで指定された時間(秒)だけ,サーバの負荷レベルを含む情報を一時的にdccacheオペランドで指定された大きさの領域に保持します。つまり,dccltcachetimオペランドで指定した値を短くすることで,より新しいサーバの負荷レベルに基づいてRPCの要求先が決まるということになります。
その反面,負荷レベルの取得のために,頻繁にTP1/Server Baseのネームサービスとの通信が発生することを考慮する必要があります。
●サーバ,クライアントともTP1/Server Baseのとき

サーバ側,およびクライアント側の両方に,次のどちらかの設定をする必要があります。

この形態では,TP1/Server Baseはこれから要求を出そうとしているサーバの負荷レベルをすでに知っているので,最初から負荷レベルが低いノードに対してRPCを行います。この要求を受け取った時点で,スケジュールサービスは,負荷レベルの評価による転送はしないで,自ノードで要求を処理できる状態であれば,自ノードで処理します。サーバが閉塞している場合,または自ノードのサーバの負荷レベルがLEVEL2で,他ノードに自ノードより負荷レベルの低いサーバがある場合だけ,ほかのノードに対して処理要求を転送します。

(c) ノード間負荷バランス機能と別の機能を組み合わせた場合の動作

ノード間負荷バランス機能と別の機能を組み合わせた場合の動作を,次の表に示します。

表3-12 ノード間負荷バランス機能と別機能を組み合わせた場合の動作

組み合わせる機能 動作
TP1/Clientで常設コネクションを使用した場合 TP1/Server BaseのCUP実行プロセスが,常設コネクションを張ったノードでRPCを行う。
(b)の「サーバ,クライアントともTP1/Server Baseのとき」と同じ動作になる。
TP1/Clientでトランザクション制御APIを使用した場合 TP1/Server BaseのトランザクショナルRPC実行プロセスがRPCを行う。
(b)の「サーバ,クライアントともTP1/Server Baseのとき」と同じ動作になる。
リモートAPI機能を使用した場合 TP1/Server BaseのrapサーバがRPCを行う。
(b)の「サーバ,クライアントともTP1/Server Baseのとき」と同じ動作になる。

(8) ノード間負荷バランス拡張機能

ユーザは次に示す指定ができます。

(9) マルチスケジューラ機能

従来のスケジューラデーモン(これ以降マスタスケジューラデーモンといいます)とは別に,サービス要求受信専用デーモン(これ以降マルチスケジューラデーモンといいます)を複数プロセス起動し,サービス要求メッセージ受信処理を並行動作させることによって,受信処理の競合によるスケジューリング遅延を回避できます。この機能をマルチスケジューラ機能といいます。

マルチスケジューラ機能を使用するには,次の定義を指定する必要があります。

RPC受信側
スケジュールサービス定義 scdmulti
ユーザサービス定義 scdmulti
RPC送信側
ユーザサービス定義 multi_schedule

また,幾つかのマルチスケジューラデーモンをキュー受信型サーバごとにグループ化できます。これによって,異なるサーバ間でサービス要求メッセージの受信処理が競合するのを回避できます。マルチスケジューラデーモンをグループ化している場合,サーバ側でユーザサービス定義scdmultiを指定する必要があります。

なお,この機能は,TP1/Extension 1をインストールしていることが前提です。TP1/Extension 1をインストールしていない場合の動作は保証できませんので,ご了承ください。

マルチスケジューラ機能の概要を次の図に示します。

図3-55 マルチスケジューラ機能の概要

[図データ]