分散トランザクション処理機能 OpenTP1 解説
OpenTP1のシステムサービス,またはユーザサーバ(UAP)を実行するときには,OSの作業領域を使います。この作業領域の処理をプロセスといいます。ユーザサーバの実行によって生成されるプロセスを特にユーザサーバプロセス,UAPプロセス,または単にプロセスといいます。
OpenTP1では,システムサービスとユーザサーバのプロセスが必要以上に増えたり減ったりしないように,プロセスサービス定義の指定に従って,使うプロセスの総数を制御しています。
ユーザサーバプロセスを制御するには,ユーザサーバを事前に開始していることが前提です。OpenTP1と一緒に開始させておくか,dcsvstart -uコマンドで開始させておきます。
実行中のユーザサーバに対して,さらにサービス要求が来た場合でも,ユーザサーバの処理を新しい別のプロセスで実行できます。このように,一つのユーザサーバの処理を,別のプロセスで並行して実行する機能をマルチサーバといいます。
マルチサーバを使えるのは,スケジュールキューを使うSPP(キュー受信型サーバ),およびMHPです。ソケット受信型サーバの場合はマルチサーバを使えません。ソケット受信型サーバには,使うプロセスは一つだけと,ユーザサービス定義で指定してください。
ユーザサービス定義でマルチサーバを指定したUAPのプロセスを,OpenTP1の稼働中にいつも確保しておくことも,動的に確保することもできます。いつも確保されているプロセスを常駐プロセスといいます。また,稼働中には確保されていなくて,必要に応じて起動されるプロセスを非常駐プロセスといいます。
マルチサーバを使う場合,使うプロセスの最大値をユーザサービス定義で設定しておきます。常駐プロセスを複数個指定していれば,指定した数だけ並行してプロセスが起動されます。また,非常駐プロセスを複数個指定していれば,指定した数だけ動的にプロセスが起動されます。
プロセスを非常駐プロセスと設定しておくと,OpenTP1システム内のメモリ領域を効率良く使えます。また,プロセスを常駐プロセスと設定しておくと,そのユーザサーバの処理は非常駐プロセスに比べて速くなります。
システムのメモリに空きがない場合,非常駐プロセスは稼働中の非常駐プロセスが終了してから実行されます。
プロセスを常駐とするか非常駐とするかは,ユーザサービス定義でユーザサーバの起動プロセス数を事前に指定しておきます。
スケジュールキューにあるサービスの要求数に応じて,非常駐プロセスの数を増やしたり減らしたりする機能をマルチサーバ負荷バランス機能といいます。
非常駐プロセスをいつ起動するかは,ユーザサービス定義のbalance_countオペランドに指定する値で決まります。(balance_countオペランドに指定した値 × 起動中のプロセス)の数を超えてサービス要求が滞留したときに,OpenTP1は非常駐プロセスを起動します。スケジュールキューに滞留しているサービス要求の数が(balance_countオペランドに指定した値 × 起動中のプロセス)の数以下になると,OpenTP1は非常駐プロセスを終了させます。
常駐/非常駐プロセスによるマルチサーバの概要を次の図に示します。
図3-51 常駐/非常駐プロセスによるマルチサーバの概要
一つ一つのユーザサーバには,ユーザサービス定義でスケジュールの優先度(スケジュールプライオリティ)を付けることができます。優先度が高いユーザサーバの非常駐プロセスは,ほかの非常駐プロセスに比べて優先的にスケジュールされます。
スケジュールの優先度の概要を次の図に示します。
図3-52 スケジュールの優先度の概要
非常駐プロセスを使用する場合,一つのサービス要求ごとに実行プロセスを起動し直すことができます。この機能を,非常駐UAPプロセスのリフレッシュ機能といいます。この機能を使用することで,リエントラント構造ではないUAPの実行もできるようになります。この機能は,非常駐プロセスだけで構成されるUAPの場合に使用できます。
この機能を使用するためには,ユーザサービス定義またはユーザサービスデフォルト定義に,scd_refresh_processオペランドを指定します。また,この機能は1プロセスが処理するサービス要求数(ユーザサービス定義のbalance_countオペランドの指定値)が0の場合にだけ使用できます。
非常駐UAPプロセスのリフレッシュ機能の詳細については,マニュアル「OpenTP1 プログラム作成の手引」を参照してください。
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 |
負荷レベルに変更があった場合は,各ノードのネームサービスにサーバ情報が通知され,サーバ情報が更新されます。また,ユーザサービス定義のloadlevel_messageオペランドを使用すると,負荷レベルの変更を通知するメッセージを出力できます。
ノード間負荷バランス機能を使用する場合のTP1/Server Base側,TP1/Client側の関連する定義と処理,およびRPCの処理を説明します。
TP1/Server Baseのスケジュールサービスが,ノードのスケジュール状態に応じて,より効率的に処理できるノードへ負荷を分散させます。
サーバ側,およびクライアント側の両方に,次のどちらかの設定をする必要があります。
この形態では,TP1/Server Baseはこれから要求を出そうとしているサーバの負荷レベルをすでに知っているので,最初から負荷レベルが低いノードに対してRPCを行います。この要求を受け取った時点で,スケジュールサービスは,負荷レベルの評価による転送はしないで,自ノードで要求を処理できる状態であれば,自ノードで処理します。サーバが閉塞している場合,または自ノードのサーバの負荷レベルがLEVEL2で,他ノードに自ノードより負荷レベルの低いサーバがある場合だけ,ほかのノードに対して処理要求を転送します。
ノード間負荷バランス機能と別の機能を組み合わせた場合の動作を,次の表に示します。
表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のとき」と同じ動作になる。 |
ユーザは次に示す指定ができます。
図3-54 LEVEL0のノードへのスケジュール
set levelup_queue_count = U1,U2 set leveldown_queue_count = D0,D1
表3-13 負荷レベルとサービス要求滞留数
前回の負荷レベル | サービス要求滞留数:q | 今回の負荷レベル |
---|---|---|
LEVEL0 | q < U1 | LEVEL0 |
U1 ≦ q < U2 | LEVEL1 | |
U2 ≦ q | LEVEL2 | |
LEVEL1 | q ≦ D0 | LEVEL0 |
D0 < q < U2 | LEVEL1 | |
U2 ≦ q | LEVEL2 | |
LEVEL2 | q ≦ D0 | LEVEL0 |
D0 < q ≦ D1 | LEVEL1 | |
D1 < q | LEVEL2 |
従来のスケジューラデーモン(これ以降マスタスケジューラデーモンといいます)とは別に,サービス要求受信専用デーモン(これ以降マルチスケジューラデーモンといいます)を複数プロセス起動し,サービス要求メッセージ受信処理を並行動作させることによって,受信処理の競合によるスケジューリング遅延を回避できます。この機能をマルチスケジューラ機能といいます。
マルチスケジューラ機能を使用するには,次の定義を指定する必要があります。
また,幾つかのマルチスケジューラデーモンをキュー受信型サーバごとにグループ化できます。これによって,異なるサーバ間でサービス要求メッセージの受信処理が競合するのを回避できます。マルチスケジューラデーモンをグループ化している場合,サーバ側でユーザサービス定義scdmultiを指定する必要があります。
なお,この機能は,TP1/Extension 1をインストールしていることが前提です。TP1/Extension 1をインストールしていない場合の動作は保証できませんので,ご了承ください。
マルチスケジューラ機能の概要を次の図に示します。
図3-55 マルチスケジューラ機能の概要
All Rights Reserved. Copyright (C) 2006, 2012, Hitachi, Ltd.