7.3.8 ノード間通信時の毎回コネクション断機能
ノード間通信時の毎回コネクション断機能は,ノードをわたったOpenTP1プロセス間のTCP/IP通信の場合に限り,通信処理を終了した時点で毎回コネクションを切断するものです。
OpenTP1は,次の処理でノード間のTCP/IP通信をします。
-
dc_rpc_call関数の通信
-
dc_rpc_call_to関数の通信
-
UAPとシステムサーバ間の通信
-
OpenTP1のシステムサーバ間の通信
ノード間通信時の毎回コネクション断機能は,ユーザサービス定義,ユーザサービスデフォルト定義,またはシステム共通定義のrpc_close_after_sendオペランドに指定できます。
なお,次に示す機能では,ノード間のTCP/IP通信であっても,ノード間通信時の毎回コネクション断機能は適用されません。
-
OpenTP1クライアント製品とTP1/Server Base間の通信
-
リモートAPI機能を使用し,rapクライアントからTP1/Server Baseのrapリスナー,rapサーバへの通信
-
XAリソースサービスを使用したトランザクション連携機能
-
TP1/Message Queueのチャネルを使用した,他のMQシステム(メッセージキューイング機能のキューマネジャがあるシステム)とTP1/Message Queueとのチャネル通信
-
TP1/Message Queueのクライアント製品(TP1/Message Queue Access)であるMQCクライアント機能とTP1/Message QueueのMQCサーバ機能との通信
-
メッセージ制御機能(TP1/Message Control)を使用した,相手システムとの通信
(1) 機能概要
ノードAのOpenTP1のUAPから,dc_rpc_callによってノードBのOpenTP1の提供するサービスを実行したあと,次の状態になった場合,ノードAのUAPはノードBのSPPやスケジューラデーモンとの間のコネクションが切断されたことを検知できません。
-
ノードBのOpenTP1がハード障害によってダウンした
-
ノードAとノードB間に無通信監視をする通信機器によってコネクションが切断された
それは,ノードBのOSがコネクションの切断を通知できないからです。この状態でノードAのUAPがノードBのサービスを要求した場合,dc_rpc_callの送信処理は正常に完了しますが,実際に電文は送出されません。その結果,ノードAのUAPはタイムアウトによって異常を検知します。
このようにOSがコネクションの切断を通知できないような障害を即時に検知するには,電文の送受信が終了するたびにコネクションを切断し,毎回新たにコネクションを確立する操作を実行する必要があります。
ノード間通信時の毎回コネクション断機能は,通信が終了した時点で毎回コネクションを切断する機能であり,コネクションを切断するのはノードをわたったプロセス間の通信の場合だけです。
ノード間通信時の毎回コネクション断機能は,他ノード上のプロセスと通信するたびにコネクションの確立/解放処理を実行するため,このオーバヘッドによって性能が低下することが考えられます。また,ノードをわたったプロセス間通信を行うたびに,コネクションを確立するため,OSの資源であるポートを消費します。一度使用したポートは,OSによって一定時間経過後に,再利用できます。ただし,再利用できるまでの時間はOSの設定に依存します。ポートの再利用間隔時間を長く設定していると,ポート不足が発生し,OpenTP1だけでなく,他製品にも影響が出ます。ポートに関する設定などを十分に検討し,この機能を使用してください。ポートに関するOSの設定の詳細は,OSのマニュアルを参照してください。
(2) 一時クローズ処理とノード間通信時の毎回コネクション断機能との比較
一時クローズ処理は,保持するコネクション数が設定(ipc_sockctl_highwater定義オペランド)の上限になった場合,コネクションを確立したプロセス間の合意によって,コネクションを切断します。一時クローズ処理は,自ノード内通信およびノード間通信で,すべてのコネクションに対して有効です。
OpenTP1制御下のプロセスにipc_sockctl_highwater=0,0を設定すると,ノード間通信時の毎回コネクション断機能と同様に,通信ごとにコネクションを切断できます。しかし,ユーザ処理中やOpenTP1のライブラリ関数実行中でも電文受信処理を実施していない場合は,一時クローズ処理が実行できません。これは,一時クローズ要求電文が受信できないため,プロセス間の合意が取れないからです。
OpenTP1プロセスAにipc_sockctl_highwater=0,0を設定した場合の処理概要を次の図に示します。
-
プロセスAからOpenTP1プロセスBへコネクション確立要求。
-
プロセスBでコネクション確立要求受付。
-
プロセスAからプロセスBに対して,電文送信。
-
プロセスBにおいて,電文受信。
-
プロセスAにおいて,ipc_sockctl_highwater定義オペランドの条件を満たしたため,プロセスBに対して,一時クローズ要求を送信。
-
プロセスBにおいて,一時クローズ要求を受信。※1
-
プロセスBから一時クローズ要求の応答送信。
-
プロセスAにおいて,一時クローズ要求応答受信。※1
-
プロセスBにおいて,コネクションの切断。※2
-
プロセスAにおいて,コネクションの切断。※2
- 注※1
-
一時クローズ要求および一時クローズ要求応答受信は,プロセスの処理がOpenTP1のライブラリ関数を実行し,かつ,電文を受信できる状態にいる場合に受信します。ユーザ処理中やOpenTP1のライブラリ関数実行中であっても電文受信処理を実施していない場合は,受信できません。
- 注※2
-
コネクションの切断の順序は,プロセスAとプロセスB間で同期を取らずに行うため,順序が逆転するおそれがあります。
コネクションを切断時に,一時クローズ処理は,コネクションを確立したプロセス間で合意を取りますが,ノード間通信時の毎回コネクション断機能は,プロセス間の合意を取りません。そのため,一時クローズ処理と比較して,即時(電文送信直後,または電文受信直後)にコネクションの切断を実施できます。ノード間通信時の毎回コネクション断機能を実施できるのは,ノード間のコネクションだけです。
この機能の処理概要を次の図に示します。
-
プロセスAからOpenTP1プロセスBへコネクション確立要求。
-
プロセスBでコネクション確立要求受付。
-
プロセスAからプロセスBに対して,電文送信。
-
プロセスBにおいて,電文受信。
-
プロセスAにおいて,コネクションの切断。※
-
プロセスBにおいて,コネクションの切断。※
- 注※
-
コネクションの切断の順序は,プロセスAとプロセスB間で同期を取らずに行うため,順序が逆転する可能性があります。
一時クローズ処理(ipc_sockctl_highwater=0,0を設定)とノード間通信時の毎回コネクション断機能を適用した場合の機能比較を次の表に示します。
比較項目 |
一時クローズ処理 ipc_sockctl_highwater=0,0 |
ノード間通信時の毎回コネクション断オプション機能 |
---|---|---|
OpenTP1の通信性能 |
× |
○ |
コネクション切断検知の即時性 |
× |
○ |
コネクション切断の範囲 |
○ |
× |
使用するポート数 |
△ |
△ |
コネクション切断検知の即時性を重視する場合はノード間通信時の毎回コネクション断オプション機能を使用してください。
コネクション切断の範囲を重視する場合は,一時クローズ処理を使用してください。
(3) ノード間通信時の毎回コネクション断機能適用の注意事項
コネクションには,TCPのポートがくくりついています。TCPのポートの状態遷移には,TIME_WAITの状態があります。OSは,ネットワーク上で遅れていたパケットが到着する可能性があるので,切断したコネクションで使用されていたポートを一定時間,再利用しないようにします。一定時間,再利用されないポートの状態をTIME_WAIT状態といいます。詳細は,TCP/IPの文献を参照してください。
ノード間通信時の毎回コネクション断機能を使用すると,コネクションの切断が頻繁に行われ,短命ポート(Ephemeral port)が一定時間,TIME_WAIT状態で残ります。TIME_WAIT状態のポートは,再利用できないため,ポート不足が発生するおそれがあります。ポート不足が発生すると,通信障害が発生し,OpenTP1がダウンする場合があります。
OSのコマンド(netstatなど)で,ノードのポートの状態を確認し,ノード間通信時の毎回コネクション断オプション機能を使用しても,システムで使用できるポート数の上限値を超えない場合に適用してください。