複数クライアントから同一アプリケーション(オブジェクト)に対して要求が出された場合に、すべての要求分のアプリケーションを起動してしまうと、サーバの負荷が大きくなってしまいます。
このような場合に、キュー制御で負荷を平準化させることができます。
クライアントからの要求は、該当するオブジェクトの待ち行列であるキューに接続(キューイング)され、キューイングされた要求は、アプリケーションにより順に処理されます。
以下に、キュー制御の運用イメージを示します。
CORBAアプリケーションではワークユニットの機能を利用して以下のキュー制御を行うことができます。
キュー閉塞/閉塞解除
最大キューイング機能
滞留キュー数のアラーム通知機能
優先度制御機能
滞留リクエストのキャンセル機能
また、サーバアプリケーションプロセスが2多重以上で起動されている場合、キューイングされる要求の振り分け方式を以下の2つの方式から選択することができます。
LRU方式
要求待ちのサーバアプリケーションプロセスの中で、最後に要求待ちとなったプロセスに、クライアントからの要求を振り分けます。
クライアントからの要求数が少ない場合は、特定のプロセスのみに要求メッセージが振り分けられます。
ワークユニット定義の「Request Assignment Mode」に「LIFO」を設定してください。
ラウンドロビン方式
要求待ちのサーバアプリケーションプロセスの中で、最初に要求待ちとなったプロセスに、クライアントからの要求メッセージを振り分けます。
クライアントからの要求数が少ない場合は、各プロセスに均等に要求メッセージが振り分けられます。
ただし、その時点で要求受信可能な状態であるプロセスに対してラウンドロビン方式で振り分けを行うため、完全に均等に振り分けられるわけではありません。
ワークユニット定義の「Request Assignment Mode」に「FIFO」を設定してください。
なお、LRU方式とラウンドロビン方式では以下の違いがあります。
LRU方式では、最後に動作したプロセスに対して要求メッセージを割り当て、ラウンドロビン方式では要求待ちのプロセスのなかで最初に動作したプロセスに対して要求を割り当てます。したがって、LRU方式の方が割り当てられたプロセスがメモリ上にロードされている可能性が高く、ラウンドロビン方式では割り当てたプロセスがスワップアウトされている可能性があります。そのためLRU方式の方が、疎通性能がよい場合があります。
注意
CORBAワークユニットの場合、以下のコマンドを利用してキュー制御を行うことはできません。
odsetque
odcntlque
要求の振り分け方式は、ワークユニット定義で設定します。ワークユニット定義の登録は、コマンドを使用する方法と、Interstage管理コンソールを使用する方法があります。
ワークユニット定義の「Request Assignment Mode(要求メッセージ振り分け方式)」に設定します。以下に定義登録の実行例を示します。なお、ワークユニット定義の詳細は「付録A ワークユニット定義」を参照してください。
例
ワークユニット定義
[Control Option] Request Assignment Mode:FIFO
isaddwudefコマンドでワークユニット名を指定して登録します。
isaddwudef -o ISSAMPLE1
以下の方法で連続異常終了回数を設定してください。
Interstage管理コンソールにログインします。
Interstage管理コンソールの
[Interstage管理コンソール] > [Interstage Application Server] > [システム] > [ワークユニット]の[新規作成]タブ
または、
[Interstage管理コンソール] > [Interstage Application Server] > [システム] > [ワークユニット] > [ワークユニット名]の[環境設定]タブ
で[ワークユニット設定]の「要求のディスパッチ方式」を設定してください。
Interstage管理コンソールを使用する場合は、「Intestage管理コンソールのヘルプ」も参照してください。
キューの閉塞/閉塞解除を行い、クライアントからの要求を一時的に受け付けないような状態にしたり、要求の受け付けを再開したりすることができます。キューの閉塞/閉塞解除は以下のような場合に有効です。
時間帯により使用を制限したい業務がある場合
負荷が高く、一時的に要求を受け付けない状態にしたい場合
業務停止前に要求を抑止し、全ての処理が終わったのち停止を行う場合
なお、キューの閉塞中にクライアントから要求を行った場合、クライアントには以下の例外が復帰します。
システム例外 | マイナーコード(16進表記) |
---|---|
NO_IMPLEMENT | 0x464a0080 |
また、閉塞は以下の単位で行うことができます。
インプリメンテーション単位
インプリメンテーションで実装されているインタフェース単位
インタフェース単位に閉塞を行いたい場合、インプリメンテーションリポジトリに閉塞を行いたいインタフェース情報を設定した上で、ワークユニットを起動する必要があります。インプリメンテーションリポジトリの登録は、コマンドを使用する方法と、Interstage管理コンソールを使用する方法があります。
CORBAアプリケーション情報定義ファイルにインタフェース情報を設定します。以下に定義登録の実行例を示します。なお、インプリメンテーションリポジトリの登録の詳細は「リファレンスマニュアル(コマンド編)」でOD_impl_instコマンドを参照してください。
例
CORBAアプリケーション情報定義ファイル
rep_id = IDL:test1:1.0 type = persistent : IDL:test1/intf1:1.0 = 0;
OD_impl_instコマンドで登録します。
OD_impl_inst -ax impl.def
以下の方法でインタフェース停止を設定してください。
Interstage管理コンソールにログインします。
Interstage管理コンソールの
[Interstage管理コンソール] > [Interstage Application Server] > [システム] > [ワークユニット] > [ワークユニット名]の[配備]タブ
または、
[Interstage管理コンソール] > [Interstage Application Server] > [システム] > [ワークユニット] > [ワークユニット名] > [インプリメンテーションリポジトリID名]の[環境設定]タブ
で[CORBAアプリケーション]の[インタフェース定義]を登録してください。
Interstage管理コンソールを使用する場合は、「Intestage管理コンソールのヘルプ」も参照してください。
また、キューの閉塞/閉塞解除は、コマンドを使用する方法と、Interstage管理コンソールを使用する方法があります。
閉塞はisinhibitqueで行います。
isinhibitque WU1 IDL:test1:1.0 IDL:test1/intf1:1.0
閉塞解除はispermitqueで行います。
ispermitque WU1 IDL:test1:1.0 IDL:test1/intf1:1.0
Interstage管理コンソールにログインします。
Interstage管理コンソールの
[Interstage管理コンソール] > [Interstage Application Server] > [システム] > [ワークユニット] > [ワークユニット名] > [インプリメンテーションリポジトリID]の[状態]タブで、インプリメンテーション単位またはインタフェース単位に「閉塞」「閉塞解除」ボタンを実行して操作します。
キューイングされる要求の最大数が指定できます。これにより、サーバアプリケーションに一定以上の負荷が掛かった場合に、クライアントからの要求を制限することができます。
クライアントからの要求が指定された最大キューイング数を超えた場合、クライアントへエラーが復帰します。
なお、サーバアプリケーションが現在処理中の要求は、キューイングされている数には含まれません。サーバアプリケーション上で処理中の要求を除いた、処理待ちの要求の最大数が指定できます。最大キューイング機能については、ワークユニット定義で設定します。
最大キューイング数を超過してキューイングしようとしたリクエストに対しては、クライアントに以下の例外が復帰します。
システム例外 | マイナーコード(16進表記) |
---|---|
NO_RESOURCE | 0x464a0094 |
最大キューイング数は、ワークユニット定義で設定します。ワークユニット定義の登録は、コマンドを使用する方法と、Interstage管理コンソールを使用する方法があります。
ワークユニット定義の「Maximum Queuing Message(最大キューイング数)」に設定します。以下に定義登録の実行例を示します。なお、ワークユニット定義の詳細は「付録A ワークユニット定義」を参照してください。
例
ワークユニット定義の登録例
ワークユニット定義
[Application Program] Maximum Queuing Message:10
isaddwudefコマンドでワークユニット名を指定して登録します。
isaddwudef -o ISSAMPLE1
以下の方法で連続異常終了回数を設定してください。
Interstage管理コンソールにログインします。
Interstage管理コンソールの
[Interstage管理コンソール] > [Interstage Application Server] > [システム] > [ワークユニット] > [ワークユニット名] > の[配備]タブ
または、
[Interstage管理コンソール] > [Interstage Application Server] > [システム] > [ワークユニット] > [ワークユニット名] > [インプリメンテーションリポジトリID]の[環境設定]タブ
で[CORBAアプリケーション]の「最大キューイングメッセージ数」に、キューに滞留できる最大キュー数を設定してください。
Interstage管理コンソールを使用する場合は、「Intestage管理コンソールのヘルプ」も参照してください。
処理状況に応じて、処理が終わらず滞留しているキュー数が、設定した監視キューイング数を超えるとアラーム通知を行います。また、設定した監視再開キューイング数まで滞留キュー数が減少すると、監視を再開します。
これにより、システムの負荷状態をリアルタイムに監視することができます。
滞留キュー数を監視する場合、以下の3つのポイントを監視できます。
滞留キュー数が最大キューイング数を超過した場合
滞留キュー数が監視キューイング数(任意)と同じになった場合
滞留キュー数が監視再開キューイング数(任意)と同じになった場合
キューに滞留できる最大キュー数です。この値を超過したときにメッセージが出力されます。一度この値を超過すると、滞留キュー数が監視再開キューイング数になるまで監視キューイング数超過に対するメッセージは出力されません。
アラーム通知(メッセージ出力)を行う滞留キュー数を設定します。滞留キュー数がこの値になるとメッセージが出力されます。一度この値になると、滞留キュー数が監視再開キューイング数になるまで監視キューイング数に対するメッセージは出力されません。
アラーム通知の監視を再開する滞留キュー数を設定します。滞留キュー数が監視キューイング数を超えた後、本設定値と同じになった時に、滞留キュー数の監視を再開します。また、監視再開時にメッセージが出力されます。
滞留キュー数の処理監視については、Systemwalker Centric Managerと連携することで、集中監視を行うことが可能となります。
監視対象としたキューの滞留キュー数が、上記のポイントに達した時、Systemwalker Centric Manager 運用管理クライアントの画面上に、状態の遷移が表示されます。
これにより、滞留キュー数の増減に対してリアルタイムな監視が可能となります。
Systemwalker Centric Managerとの連携については、「運用ガイド(基本編)」を参照してください。
また、Systemwalker Centric Managerとの連携を行わない場合でも、それぞれの事象になった場合、メッセージを出力します。それぞれのメッセージを監視することで、滞留キュー数の状態を把握することでできます。
以下にそれぞれの事象ごとに出力されるメッセージを示します。メッセージの詳細については、「メッセージ集」を参照してください。
事象 | 出力メッセージ |
---|---|
滞留キュー数が最大キューイング数を超過した場合 | od11108 |
滞留キュー数が監視キューイング数(任意)と同じになった場合 | od11107 |
滞留キュー数が監視再開キューイング数(任意)と同じになった場合 | od11109 |
監視キューイング数は、ワークユニット定義で設定します。ワークユニット定義の登録は、コマンドを使用する方法と、Interstage管理コンソールを使用する方法があります。
ワークユニット定義の「Queuing Message To Notify Alarm (監視キューイング数)」および「Queuing Message To Notify Resumption(監視再開キューイング数)」に設定します。また、以下に定義登録の実行例を示します。なお、ワークユニット定義の詳細は「付録A ワークユニット定義」を参照してください。
例
ワークユニット定義の登録例
ワークユニット定義
[Application Program] Maximum Queuing Message:10 Queuing Message To Notify Alarm:7 Queuing Message To Notify Resumption:5
isaddwudefコマンドでワークユニット名を指定して登録します。
isaddwudef -o ISSAMPLE1
以下の方法で連続異常終了回数を設定してください。
Interstage管理コンソールにログインします。
Interstage管理コンソールの
[Interstage管理コンソール] > [Interstage Application Server] > [システム] > [ワークユニット] > [ワークユニット名] > の[配備]タブ
または、
[Interstage管理コンソール] > [Interstage Application Server] > [システム] > [ワークユニット] > [ワークユニット名] > [インプリメンテーションリポジトリID]の[環境設定]タブ
で[CORBAアプリケーション]の「監視キューイングメッセージ数」および「監視再開キューイングメッセージ数」に、アラーム通知を行う滞留キュー数を設定してください。
Interstage管理コンソールを使用する場合は、「Intestage管理コンソールのヘルプ」も参照してください。
業務を構成するオブジェクト間において、優先度をつけることができます。
高負荷時により優先的に処理を行う業務などが存在する場合に、有効となります。優先度は1~255の優先度を指定することができます。
優先度制御は、同一インプリメンテーション内のインタフェース間において優先度をつけることができ、インプリメンテーションリポジトリ定義で設定します。
以下の例ではCORBAアプリケーションの2つのインタフェース(INTF1とINTF2)への要求が共にキューイングされていた場合を示します。その場合にアプリケーションプロセス(もしくはスレッド)に空きができた場合、優先度の高いインタフェースINTF2への要求が先にディスパッチされ、処理を開始します。
定義方法には、コマンドを使用する方法と、Interstage管理コンソールを使用する方法があります。
優先度は、OD_impl_instコマンド(-axオプション)で指定するCORBAアプリケーション情報定義ファイルで、インタフェースリポジトリIDに対して指定します。指定方法は以下のとおりです。なお、インプリメンテーションリポジトリの登録の詳細は「リファレンスマニュアル(コマンド編)」でOD_impl_instコマンドを参照してください。
intfID = priority;solib[,[prefix][,inherit[,..]]] intfID :オブジェクトのインタフェースリポジトリIDを指定します。 priority:オブジェクトの優先度(0~255)を指定します。優先度制御を使用しない場合は、0を指定します。 solib :ライブラリのパス名を指定します。 prefix :IDLcの-Sオプションで関数名の先頭文字列prefixを指定した場合に指定します(C言語のみ)。 inherit :継承するインタフェースリポジトリIDを指定します。
例
CORBAアプリケーション情報定義ファイル
IDL:test1/intf1:1.0 = 10;/user/libINTF1.so IDL:test1/intf2:1.0 = 2;/user/libINTF2.so,,IDL:test1/intf1:1.0 IDL:test1/intf3:1.0 = 20;
OD_impl_instコマンドで登録します。
OD_impl_inst -ax impl.def
以下の方法でインタフェース停止を設定してください。
Interstage管理コンソールにログインします。
Interstage管理コンソールの
[Interstage管理コンソール] > [Interstage Application Server] > [システム] > [ワークユニット] > [ワークユニット名]の[配備]タブ
または、
[Interstage管理コンソール] > [Interstage Application Server] > [システム] > [ワークユニット] > [ワークユニット名] > [インプリメンテーションリポジトリID名]の[環境設定]タブ
で[CORBAアプリケーション]の[インタフェース定義]を登録し、「優先度」にオブジェクトの優先度を設定します。
Interstage管理コンソールを使用する場合は、「Intestage管理コンソールのヘルプ」も参照してください。
キューに滞留しているリクエストをキャンセルして、クライアントに例外を通知することができます。以下のような場合に有効です。
負荷が高く、キューに滞留しているリクエストがクライアントのタイムアウト時間内にリプライを返すのが不可能と判断できる場合。
負荷が高い場合に、ワークユニット内の優先度の低いアプリケーション用のキューに滞留しているリクエストをキャンセルすることにより、負荷を減らしたい場合。
滞留リクエストのキャンセルは以下の単位で行うことができます。なお、ワークユニットに属する全てのキューの滞留リクエストをキャンセルしたい場合は、ワークユニットを停止することで対応可能です。
CORBAアプリケーション
インプリメンテーション単位
滞留リクエストのキャンセルについてはiscancelqueコマンドで行います。また、Interstage管理コンソールから滞留リクエストをキャンセルすることはできません。
滞留リクエストのキャンセルはワークユニット配下で起動している場合にのみ有効です。また、Unixの場合は、ワークユニットを起動したユーザまたはスーパーユーザのみ滞留リクエストのキャンセルが可能です。