CORBAサービスは、アプリケーションのハングアップなどを防ぐため、アプリケーションの稼働状況を監視するためのタイマ監視機能を備えています。クライアント/サーバアプリケーションの動作中に、設定されたタイムアウト時間に応じてタイムアウトを発生させ、アプリケーションに通知します。
CORBAサービスでは、以下のタイムアウト時間を設定することができます。
定義項目名 | 設定内容 |
---|---|
クライアントにおける、リクエスト送信(サーバメソッド発行)から返信までの待機時間。 | |
サーバ(Persistentタイプ以外)における、サーバメソッド起動からCORBA_ORB_initメソッド(ORB初期化メソッド:C言語インタフェースのメソッド名)発行までの監視時間。 | |
サーバにおける、無通信状態(クライアントからのリクエスト送信なし)の監視時間(リクエスト返信完了後のコネクション維持時間)。 | |
クライアントにおける、無通信状態(サーバへのリクエスト送信なし)の監視時間(リクエストの復帰完了後のコネクション維持時間)。 |
CORBAサービスのタイムアウト時間は、CORBAサービスの動作環境ファイル(config)で設定します。各パラメタの初期値などの詳細につきましては“チューニングガイド”の“config”を参照してください。
リクエスト送信(サーバメソッドの実行要求)から復帰までの処理の流れと、関連するタイムアウト時間について、以下に示します。
クライアントアプリケーションからリクエストの発行
リクエストの送信(コネクションの確立)
サーバメソッドの起動(Persistentタイプ以外)
CORBA_ORB_initメソッドの発行
サーバメソッドの復帰
コネクションの切断
タイムアウト時間の設定の目安
CORBAアプリケーション連携を行う場合は、以下に考慮してタイムアウト時間を設定する必要があります。
クライアントアプリケーション側でのリクエストの送信から返信までの待機時間として、クライアント・サーバ間の通信速度やサーバメソッドの処理時間を考慮して、period_receive_timeoutには、T1時間以上の値を設定する必要があります。
通常、サーバアプリケーション側のperiod_server_timeout以上の値を設定します。
サーバアプリケーションのサーバメソッドの起動からCORBA_ORB_initメソッドが発行されるまでの処理時間を考慮して、period_server_timeoutには、T2時間以上の値を設定する必要があります。
サーバアプリケーション側のCORBAサービスは、全リクエストの返信完了からperiod_idle_con_timeout(T3)時間が経過すると、クライアントとのコネクションを切断します。
CORBAサービスでは、リクエスト処理のためのメモリ資源をクライアントごとに確保するため、コネクションが切断されるまでその資源は保持されます。
period_idle_con_timeout(サーバアプリケーション側)には、CORBAサービスが使用できるメモリ容量、クライアント数などを考慮して設定する必要があります。
クライアントアプリケーション側のCORBAサービスは、全リクエストの復帰完了からperiod_client_idle_con_timeout(T4)時間が経過すると、スレッドモードのアプリケーションではサーバとのコネクションを切断し、次回リクエスト送信時にコネクションを再接続します。プロセスモードのアプリケーションでは、時間経過のタイミングではサーバとのコネクションの切断を行いませんが、次回リクエスト送信時にコネクションを一旦切断し、再接続して、リクエストを送信します。
これは、サーバ側でのタイムアウト(period_idle_con_timeout(T3)時間経過など)によりサーバとのコネクションが切断された場合、クライアント側でコネクション切断を検出しないままリクエストを送信したことによる送信エラーを防ぐためのものです。
period_client_idle_con_timeout(T4)には、サーバアプリケーション側のperiod_idle_con_timeout(T3)以下の値を設定します。
period_client_idle_con_timeout(T4)とperiod_idle_con_timeout(T3)は、ファイヤウォールのコネクション維持時間を考慮して設定する必要があります。
詳細は“ファイヤウォールとの連携”を参照してください。
タイムアウト時間(period_receive_timeout)の動的変更
period_receive_timeout(リクエスト送信から返信までの待機時間)は、クライアントアプリケーションで以下のメソッドを発行することにより動的に変更することができます。
CORBA_ORB_set_client_timerメソッド(C言語インタフェースのメソッド名)
このメソッドで変更した時間は、クライアントアプリケーションのプロセス全体で有効になります。
CORBA_ORB_set_client_request_timerメソッド(C言語インタフェースのメソッド名)
このメソッドで変更した時間は、クライアントアプリケーションのスレッド内で有効になります。
各開発言語のタイムアウト時間変更メソッドを以下に示します。詳細は“リファレンスマニュアル(API編)”を参照してください。
[開発言語] | [メソッド名] |
C言語 | CORBA_ORB_set_client_timer、CORBA_ORB_set_client_request_timer |
C++言語 | CORBA::ORB::set_client_timer、CORBA::ORB::set_client_request_timer |
Java | com.fujitsu.ObjectDirector.CORBA.ORB.set_client_timer、 |
COBOL | CORBA-ORB-SET-CLIENT-TIMER、CORBA-ORB-SET-CLIENT-REQUEST-TIMER |
OOCOBOL | CORBA-ORB-SET_CLIENT_TIMER、CORBA-ORB-SET_CLIENT_REQUEST_TIMER |
サーバアプリケーションの最大処理時間(タイムアウト時間)を指定し、ワークユニット配下で動作するサーバアプリケーションの呼び出しから復帰までの、応答時間の監視を行うことができます。アプリケーション障害によるハングアップ、ループなどが原因となる処理遅延によるクライアントへのレスポンス遅延を防止する場合に使用します。アプリケーションの最大処理時間に関しては、ワークユニット定義の“Maximum Processing Time(アプリケーション最大処理時間)”で設定します。
アプリケーション最大処理時間には、0~86400の整数値を設定することができます。省略値は0が設定されており、0が指定されているワークユニットは、タイマ監視を実施しません。
なお、タイマ機能はサーバアプリケーションの障害などにより、アプリケーションの復帰が遅延する場合の対処として使用してください。一般的な運用で頻繁にタイムアウトが発生するような使用は避けてください。
タイムアウト時の振る舞い
タイムアウト時の振る舞いとして以下の形態を選ぶことができます。
タイムアウト時間超過メッセージを出力し、タイムアウトとなった処理が属するサーバアプリケーションプロセスを強制的に停止します。プロセス強制停止後、クライアントに例外が復帰します。
本形態では同時に動作している他スレッドのアプリケーションが処理中であっても、強制的に停止されますので、注意が必要です。
プロセスモードのサーバアプリケーションおよびタイムアウト時にプロセスごと停止を行ってもよい場合に有効です。
タイムアウト時間超過メッセージのみ出力し、サーバアプリケーションプロセスは終了しません。マルチスレッドモードのサーバアプリケーションの場合、他のスレッドで動作していたアプリケーションが原因で他のスレッドで問題なく動作しているアプリケーションも同時に終了することに問題がある場合に有効です。
なお、本形態は、メッセージ出力後、正常にアプリケーションが復帰することがありますので、使用時には注意が必要となります。
また、本機能については、クライアントのタイムアウト機能(period_receive_timeout)と併用し、クライアントタイムアウト発生時に、サーバアプリケーションの遅延が原因であるかの切り分けに使用してください。
サーバアプリケーションの最大処理時間とタイムアウト時の振る舞いは、ワークユニット定義で設定します。ワークユニット定義の登録は、コマンドを使用する方法と、Interstage管理コンソールを使用する方法があります。
■コマンドを使用した定義方法
ワークユニット定義の“Maximum Processing Time(アプリケーション最大処理時間)”に設定します。以下に定義登録の実行例を示します。なお、ワークユニット定義の詳細は“付録A ワークユニット定義”を参照してください。
ワークユニット定義
[Application Program] |
isaddwudefコマンドでワークユニット名を指定して登録します。
isaddwudef -o ISSAMPLE1 |
■Interstage管理コンソールを使用した定義方法
Interstage管理コンソールにログインします。
Interstage管理コンソールの
[Interstage管理コンソール] > [Interstage Application Server] > [システム] > [ワークユニット] > [ワークユニット名] > の[配備]タブ
または、
[Interstage管理コンソール] > [Interstage Application Server] > [システム] > [ワークユニット] > [ワークユニット名] > [インプリメンテーションリポジトリID]の[環境設定]タブ
で[CORBAアプリケーション]の“アプリケーション最大処理時間”に監視時間を設定し、“アプリケーション最大処理時間超過時の制御”を選択してください。
Interstage管理コンソールを使用する場合は、“Intestage管理コンソールのヘルプ”も参照してください。
タイムアウト時の振る舞いは、コマンドでワークユニット定義を登録する場合とInterstage管理コンソールを使用する場合で、デフォルトの設定が異なります。
コマンドで定義登録する場合、ワークユニット定義の“Terminate Process for Time out(最大処理時間超過時強制停止の有無)”を省略した場合は、“YES”が設定されたものとみなし、タイムアウトが発生したときは、プロセスが強制停止されます。
Interstage管理コンソールで定義登録した場合、デフォルトでは“警告メッセージを出力する”が選択されているため、タイムアウトが発生したときは、警告メッセージのみ出力し、アプリケーションプロセスは終了しません。
タイムアウト時間の設定の目安
CORBAクライアントアプリケーションとワークユニットで連携する場合、クライアントアプリケーション側で不当なタイムアウトを発生させないために、period_receive_timeout(リクエスト返信までの待機時間)を以下の式が成立するように設定する必要があります。
なお。サーバアプリケーションタイマ機能とクライアントタイマ機能との役割として、以下のように使い分けます。
サーバアプリケーションタイマ機能は、主にサーバアプリケーションループなどのサーバアプリケーション処理遅延を主に監視します。
クライアントのタイマ機能は、レスポンスの保証に使用します。
period_receive_timeout(T1) > キューイング時間+ Maximum Processing Time(T2) |
サーバアプリケーション間通信を実施する場合、クライアント側ワークユニットの最大処理時間は、サーバ側ワークユニットの最大処理時間に7秒以上加算した時間を設定してください。
サーバ側ワークユニットでアプリケーションの処理が最大処理時間を超過した場合、Interstageが実際にサーバの最大処理時間の超過を検出し、クライアントに異常を通知するまでに、最大で7秒かかる場合があります。
また、要求がサーバ側ワークユニットの待ちキューに滞留している時間およびクライアント側ワークユニットのアプリケーション処理時間も考慮して、クライアント側ワークユニットの最大処理時間を算出してください。
IDLコンパイラ(IDLcコマンド、またはtdcコマンド)およびインタフェース情報移入(odimportirコマンド)では、インタフェースリポジトリへのインタフェース情報の登録・削除に要する処理時間の監視を行っています。
インタフェースリポジトリのタイマ監視とタイムアウト時間について説明します。
インタフェースリポジトリの参照アクセスでは、CORBAサービス運用でのタイムアウト時間(configファイルで設定)が有効となります。
インタフェースリポジトリのタイムアウト時間
インタフェースリポジトリのタイムアウト時間は、インタフェースリポジトリの動作環境ファイル(irconfig)のir_timeoutに設定します。変更したパラメタ値は、インタフェースリポジトリを再起動することにより有効になります。
IDLコンパイラおよびodimportirコマンドにおける、インタフェースリポジトリへのリクエストの復帰までの待機時間を指定します。(デフォルトは1800秒。0を指定すると、監視は行わない)
この時間を経過してもリクエストが復帰しない場合はタイムアウトが通知されます。
タイムアウト発生時の対処
巨大なIDLファイルをコンパイルした場合など、インタフェースリポジトリへのインタフェース情報の登録・削除に時間を要する場合、IDLコンパイラがタイムアウトにより終了することがあります。
このとき、ir_timeoutの値を増やし、インタフェースリポジトリを再起動することにより、タイムアウト発生を解消できる可能性があります。
特に、大規模システム向けなど、多数のインタフェース(数百~数千)の登録・削除中にタイムアウトが発生した場合は、タイムアウト時間を変更する必要があります。
Webサーバとの連携
Webサーバから起動されたServletアプリケーション(またはCGIアプリケーション)がCORBAクライアントとしてバックエンドの業務サーバ/DBサーバと連携する場合には、バックエンドの業務アプリケーションのタイムアウト時間のほかに、Webサーバのタイムアウト時間(timeout:アプリケーション送受信タイムアウト時間)を考慮する必要があります。
CORBAクライアント(Webサーバ上)で不当なタイムアウトを発生させないためには、period_receive_timeout(リクエスト返信までの待機時間)を以下の式が成立するように設定する必要があります。
Webサーバのtimeout(T1) > period_receive_timeout(T2) > キューイング時間(T3) + トランザクションタイムアウト値(T4) |
ファイヤウォールとの連携
クライアント・サーバ間にファイヤウォールが介在する以下のようなシステムでは、それぞれのシステムのタイマ設定に注意が必要です。
ファイヤウォールの無通信監視機能により、コネクション切断が行われる。
ファイヤウォールによるコネクション切断が、クライアントに通知されない。
ファイヤウォールによるコネクション切断を、クライアント側で検出できないままリクエストを再送信すると、異常を検出できずに送信エラーが発生します。
また、サーバ側では、コネクション切断されたにもかかわらず、コネクション情報が不当に残ってしまうことがあります。
このような、ファイヤウォールからのコネクション切断後の、リクエスト再送信時のハングアップやコネクション情報の未回収を防ぐために、クライアント側のperiod_receive_timeout(リクエスト返信までの待機時間:T1)とperiod_client_idle_con_timeout(無通信状態でのコネクション維持時間:T2)、サーバ側のperiod_idle_con_timeout(無通信状態のコネクション維持時間:T4)に対して、以下の式が成立するように設定する必要があります。
period_receive_timeout(T1) < ファイヤウォールのコネクション維持時間(T3) |
グローバルトランザクション連携を行うトランザクションアプリケーション(グローバルトランザクションアプリケーション)では、以下のタイマ監視ができます。
トランザクションのタイムアウト
アプリケーションのタイムアウト
2フェーズコミットのタイムアウト
以下の図に、各タイムアウトの範囲を示します。
以下に、各タイマ監視について説明します。
トランザクションのタイムアウト
指定された時間内にトランザクションが終了しない場合、トランザクションはrollbackされます。
トランザクションのタイムアウトは、クライアントアプリケーションの作成時に設定します。詳細は、“アプリケーション作成ガイド(データベース連携サービス編)”を参照してください。なお、“0”が指定されている場合は、タイマ監視は無効となります。
トランザクションのタイムアウトは、beginからcommitするまでの間に動作するすべてのアプリケーション処理時間を含んだ値よりも大きな値を設定する必要があります。たとえば、beginを呼び出した後に、アプリケーションを2回呼び出し場合には、2回呼び出す処理時間よりも大きな値に設定する必要があります。また、トランザクションアプリケーションの場合には、クライアントでbeginやcommitを呼ばない場合には、トランザクションアプリケーションが呼び出される際に自動的にトランザクションが開始され、呼び出しが完了した時点でcommit(またはrollback)が呼び出されます。この場合には、トランザクションアプリケーションの1メソッド処理内から呼ばれる処理(別アプリ呼び出しも含む)をすべて加算した値をトランザクションのタイムアウト時間として設定しておく必要があります。
以下を目安にトランザクションのタイムアウト時間の設定を行ってください。
CORBA Timeout > Tran Timeout > TD Timeout
注) Tran Timeout : トランザクションのタイムアウト時間
TD Timeout : トランザクションアプリケーションの処理時間
CORBA Timeout: COBRAアプリケーションの処理時間
アプリケーションのタイムアウト
指定された時間内にオペレーション呼び出しが完了しない場合、呼び出し側に制御が戻されます。
アプリケーションのタイムアウトは、CORBAサービスのconfigファイルに設定します。
2フェーズコミットのタイムアウト
2フェーズコミットのタイムアウトに指定された時間内にトランザクションが完了しない場合、トランザクションはrollbackされます。
2フェーズコミットのタイムアウトは、データベース連携サービスのシステム環境定義ファイルに設定します。