(58)【調査した分野】(Int.Cl.,DB名)
【発明を実施するための形態】
【0022】
実施の形態1
以下、図面を参照して本発明の実施の形態1について説明する。
図1は、実施の形態1にかかる分散システム1の構成例を示すブロック図である。
【0023】
分散システム1は、同じアプリケーションを実行可能なサーバ計算機2(第1のサーバ)及びサーバ計算機3(第2のサーバ)を備える分散システムである。分散システム1は、例えばクラウド・コンピューティング等の分散処理システムである。分散システム1が備えるサーバ計算機の数は2個に限られず、3個以上であってもよい。サーバ計算機2、3は、同一のアプリケーションであるアプリケーション4、5をそれぞれ実行可能な状態で格納している。
【0024】
サーバ計算機2は、自身が実行するアプリケーション4の障害が発生した場合に、そのアプリケーション4の障害原因を特定する障害情報を生成する。ここで障害情報とは、例えばアプリケーション4において障害を生じさせたコンポーネントや、それに付随するインタフェースといったものを示す。
【0025】
サーバ計算機3は、サーバ計算機2が生成した障害情報に基づいて決定された、アプリケーション5の障害発生を防止するための障害発生防止処理を実行する。
【0026】
例えば、サーバ計算機2の障害が、サーバ計算機2のクライアントからのリクエストに基づいて発生したものであり、サーバ計算機2がその障害にかかる障害情報を生成したとする。このとき、サーバ計算機3は、その障害情報に基づき、サーバ計算機3のクライアントからのリクエストをモニタリングすることにより、障害発生防止処理を実行する。モニタリングの例として、サーバ計算機3は、サーバ計算機2に障害が発生したときにクライアントからリクエストされたアプリケーションの機能と同じ機能が、自身のクライアントからリクエストされているか否かを判定する。そして、同じ機能が自身のクライアントからリクエストされた場合には、その機能の実行を停止する等して、サーバ計算機2と同じ障害が発生することを防止する。
【0027】
以上に説明したような処理を分散システム1が実行することにより、分散システム1は、システム運用者が何らかの処理を実行することなく(システム運用者への負荷を掛けずに)、サーバにおける障害発生を防止することができる。
【0028】
<変形例1>
上述のサーバ計算機2は、サーバ計算機3の実行する処理をさらに実行してもよい。すなわち、サーバ計算機2は、アプリケーション4の障害が発生した場合に、アプリケーション4の障害原因を特定する障害情報を生成する。そしてサーバ計算機2は、サーバ計算機3がアプリケーション5の障害原因を特定する障害情報を生成した場合に、その障害情報に基づいて決定された、前記アプリケーションの障害発生を防止するための障害発生防止処理を実行する。サーバ計算機3も、同様にサーバ計算機2の実行する処理を実行してもよい。つまり、サーバ計算機は、自身に障害が発生した場合に他のサーバ計算機が障害発生防止処理を実行するために必要な障害情報を生成するだけでなく、他のサーバ計算機が障害情報を生成した場合にもその障害情報に基づいた障害発生防止処理を実行することができる。このようなサーバ計算機が分散システム1に備わることにより、分散システム1における障害発生防止をより効率的にすることができる。
【0029】
<変形例2>
上述の分散システム1は、サーバ計算機2、3の他に、分散システム1を管理する分散管理サーバ6が設けられていてもよい。
図2は、そのような分散システム1の構成例を示すブロック図である。分散管理サーバ6は、分散システム1においてサーバ計算機2、3と接続されている。サーバ計算機2、3の説明については
図1と同様である。
【0030】
分散管理サーバ6は、サーバ計算機2から、サーバ計算機2におけるアプリケーションの障害原因を特定する障害情報を受信する。分散管理サーバ6は、サーバ計算機3においてアプリケーション5の障害発生を防止するための障害発生防止処理を実行するために用いられる情報として、サーバ計算機3に障害情報を通知する。以上の処理を実行することにより、分散管理サーバ6は、サーバ計算機3における障害発生を防止することができる。
【0031】
ここで、サーバ計算機3が実行する障害発生防止処理は、サーバ計算機3が障害情報に基づいてその処理内容を決定してもよいし、分散管理サーバ6が障害情報に基づいてその処理内容を決定してもよい。
【0032】
実施の形態2
以下、図面を参照して本発明の実施の形態2について説明する。
図3は、実施の形態2にかかる分散管理システム10の構成例を示すブロック図である。
【0033】
分散管理システム10は、アプリケーションサーバ11A、11B、11C、分散管理サーバ27及びクライアントアプリケーション34A、34B、34Cを備える。なお、以下ではアプリケーションサーバ11A、11B、11Cを総称してアプリケーションサーバ11と記載し、クライアントアプリケーション34A、34B、34Cを総称してクライアントアプリケーション34と記載する。
【0034】
アプリケーションサーバ11は、分散管理システム10における業務アプリケーションの実行基盤の役割を果たす。アプリケーションサーバ11は、CPU、メモリなどのリソースを備えるサーバ計算機において実行されるソフトウェアである。アプリケーションサーバ11は、リクエスト受付部12、リクエスト解析部13、運用リクエスト受付部14、障害情報受信部15、障害情報記憶部16、記憶装置17、障害イベント発行部18及びアプリケーション実行制御部19を有する。アプリケーションサーバ11A〜11Cは分散管理システム10のネットワーク上において分散配置され、それぞれが同じ構成を有する。
【0035】
リクエスト受付部12は、クライアントアプリケーション34を介して送信されたシステム利用者からの要求(リクエスト)を受け付ける。
【0036】
リクエスト解析部13は、リクエスト受付部12が受け付けたリクエストの詳細情報を解析する。
【0037】
運用リクエスト受付部14は、分散管理サーバ27からアプリケーションサーバ11に対して要求された運用管理のためのリクエストを受け付ける。
【0038】
障害情報受信部15は、他のアプリケーションサーバ内で発生した障害情報を分散管理サーバ27から受信する。
【0039】
障害情報記憶部16は、障害情報受信部15が受信した障害情報を内部のメモリに保持する。記憶装置17は、障害情報データを非一時的に保持する記憶装置であり、障害情報記憶部16は障害情報を必要に応じて記憶装置17に格納する。
【0040】
障害イベント発行部18は、アプリケーションサーバ11が有するアプリケーションで発生した障害情報を、分散管理サーバ27を介して接続される他のアプリケーションサーバに送信する。
【0041】
アプリケーション実行制御部19は、アプリケーションサーバ11が有するアプリケーションの実行を制御する。アプリケーション実行制御部は、実行管理部20、障害監視部21、障害解析部22、障害分析部23、障害候補格納部24、障害情報検索部25及びコンポーネント(アプリケーションコンポーネント)26を有する。以下では、コンポーネント26A、26B、26Cを総称してコンポーネント26と記載する。
【0042】
実行管理部20は、アプリケーション実行制御部19で動作するコンポーネント26の実行状況を管理する。具体的には、実行管理部20は、アプリケーションが呼び出し中であることを示す情報や、現に実行されているリクエスト及びそのリクエストを実行しているスレッドの情報を管理している。
【0043】
障害監視部21は、アプリケーションサーバ11が有するアプリケーションの障害を監視する。例えば障害監視部21は、プロセスのスレッド情報の一覧(スレッドダンプ)や、メモリ使用量、CPU使用率などの各種リソース情報を採取する。
【0044】
障害解析部22は、障害監視部21によって検知された障害の内容を解析する。具体的には、障害解析部22は、障害監視部21が採取した各種リソース情報から、コンポーネントの識別名(コンポーネント名)及びそのインタフェース名を抽出する。
【0045】
障害分析部23は、障害解析部22が解析により抽出した情報を基に、発生した障害に関する詳細な分析や、障害の予測に関する演算を行う。
【0046】
障害候補格納部24は、障害分析部23で予測された障害に関する情報を格納する。この情報は障害分析部23により更新される。
【0047】
障害情報検索部25は、障害情報記憶部16を参照し、アプリケーションに対する障害情報の有無を検索する。
【0048】
コンポーネント26は、実際にアプリケーションサーバ11が有するアプリケーション(アプリケーションサーバの計算機が実行可能な状態で格納しているアプリケーション)を構成しており、業務ロジック(ビジネスロジック)が実装されている。コンポーネント26は、アプリケーション実行制御部19上で動作する。アプリケーションサーバ11A〜11Cが備えるアプリケーションは全て同じものであるため、アプリケーションサーバ11A〜11Cは同じコンポーネント26A〜26Cを備える。なお、コンポーネント26A〜26Cは同じアプリケーションを構成していなくともよい。
【0049】
分散管理サーバ27は、分散管理システム10のネットワーク構成上に分散配置された各アプリケーションサーバを統合的に管理する専用のサーバである。システム管理者は、分散管理サーバ27を用いることにより分散管理システム10を管理することができる。分散管理サーバ27は、アプリケーション格納部28、アプリケーション情報管理部29、障害イベント受信部30、運用操作発行部32及び障害情報発行部33を有する。
【0050】
アプリケーション格納部28は、アプリケーションサーバ11に備えられたアプリケーションと同一のアプリケーションを保持する。
【0051】
アプリケーション情報管理部29は、アプリケーションサーバ11に備えられたアプリケーションの詳細情報(バージョン情報など)を管理する。
【0052】
障害イベント受信部30は、各アプリケーションサーバの障害イベント発行部18によって発行された障害情報を含むイベントを受信する。障害イベント受信部30は、受信したイベントに基づいて、アプリケーションサーバ11内で発生した障害の内容を解析するイベント解析部31を有する。
【0053】
運用操作発行部32は、管理下のアプリケーションサーバ11に対して任意の運用操作要求を通知する。
【0054】
障害情報発行部33は、特定のアプリケーションサーバ11の障害解析部22によって抽出された障害情報を、管理下のアプリケーションサーバ11に通知する。
【0055】
クライアントアプリケーション34は、システム利用者(クライアント)がアプリケーションサーバに備えられたアプリケーションの業務ロジックを呼び出す、クライアント側のアプリケーションである。
【0056】
なお、様々な処理を行う機能ブロックとして
図3に記載されたアプリケーションサーバ1及び分散管理サーバ27の各要素は、ハードウェア的には、CPU、メモリ、その他の回路で構成することができ、ソフトウェア的には、メモリにロードされたプログラムなどによって実現される。したがって、これらの機能ブロックがハードウェアのみ、ソフトウェアのみ、またはそれらの組合せによっていろいろな形で実現できることは当業者には理解されるところであり、いずれかに限定されるものではない。
【0057】
以下、実施の形態2における分散管理システム10の動作の実施例について、図面を用いて詳細に説明する。
【0058】
まず、アプリケーションサーバ11における基本的な処理の流れについて示す。
【0059】
アプリケーションサーバ11は、Webブラウザなどのクライアントアプリケーション34からのリクエストを、リクエスト受付部12によって受信する。
【0060】
リクエスト解析部13は、リクエスト受付部12が受信したリクエストを解析して、リクエストによって呼び出す対象のコンポーネント26及びそのインタフェース(メソッド)情報を抽出する。リクエスト解析部13は、抽出した結果をパラメータとして、アプリケーション実行制御部19に転送する。
【0061】
アプリケーション実行制御部19は、アプリケーションが呼び出し中であることを示す情報を実行管理部20に格納後、リクエストの対象となるコンポーネント26のインタフェースを用いて業務ロジックを実行する。
【0062】
業務ロジックの実行が終了すると、アプリケーション実行制御部19は、実行管理部20に格納した情報を削除する。この一連の処理が、リクエスト単位でアプリケーションサーバ11を動作するプロセスのスレッドにより実行される。
【0063】
また、分散管理サーバ27は、予めシステム運用者の運用作業によって、分散配置されたアプリケーションサーバ11の基本情報(ホスト名など)や、各アプリケーションサーバ11に備えられたアプリケーションの構成情報(アプリケーション名、バージョン名など)を適切に管理する。分散管理サーバ27は、さらに、管理下の全てのアプリケーションサーバ11に対して、アプリケーション配備・更新や、アプリケーションサーバの設定変更などを指示することができる。
【0064】
さらに、実施の形態2におけるアプリケーションサーバ11においては、次のような障害検出に対する設定項目がある。
【0065】
1.「デッドロック」検出時のリカバリアクション(リカバリ処理)
この項目では、アプリケーションの呼び出し期間でデッドロックが検出された場合のアプリケーションサーバ11に対するリカバリ操作が指定されている。実施の形態2では、少なくとも「アプリケーションサーバの再起動」、「旧バージョンへのアプリケーションのダウングレード」がリカバリ操作の選択肢にある。
【0066】
2.「過剰なメモリ消費」と判定するためのメモリ使用率の閾値
この項目では、過剰にメモリが消費されたと判断するためのアプリケーションサーバ11に対するメモリ使用率が設定されている。実際のアプリケーションサーバ11のメモリ使用率がこの項目における設定値以上のメモリ使用率に達した場合、アプリケーションサーバ11は、過剰なメモリ消費が発生したものと判断する。
【0067】
3.「過剰なメモリ消費」検出時の原因と判断するための発生回数の閾値
この項目では、過剰にメモリが消費された原因と判断するための該当コンポーネント及びインタフェース名のエントリ回数(障害発生回数)が指定されている。指定された回数以上エントリがされた場合、アプリケーションサーバ11は、そのエントリを過剰なメモリ消費の原因と判断する。
【0068】
4.「過剰なメモリ消費」検出時のリカバリアクション
この項目は、過剰なメモリ消費が検出された際のアプリケーションサーバに対するリカバリ操作を選択するための項目である。ここでは、少なくとも「強制GC(Garbage Collection)の実行」、「旧バージョンへのアプリケーションのダウングレード」がリカバリ操作の選択肢にある。
【0069】
5.「過剰なCPU消費」と判定するためのCPU使用率の閾値
この項目は、過剰にCPUが消費されたと判断するためのアプリケーションサーバ11に対するCPU使用率が設定された項目である。実際のアプリケーションサーバ11のCPU使用率が設定値以上のCPU使用率に達した場合、アプリケーションサーバ11は、過剰なCPU消費が発生したと判断する。
【0070】
6.「過剰なCPU消費」検出時の原因と判断するための発生回数の閾値
この項目では、過剰にCPUが消費された原因と判断するための該当アプリケーションコンポーネント及びインタフェース名のエントリ回数が指定されている。指定された回数以上エントリがされた場合、アプリケーションサーバ11は、それを過剰なCPU消費の原因と判断する。
【0071】
7.「過剰なCPU消費」検出時のリカバリアクション
過剰なCPU消費が検出された際のアプリケーションサーバに対するリカバリ操作を選択する。ここでは、少なくとも「処理優先度の変更」、「旧バージョンへのアプリケーションのダウングレード」がリカバリ操作の選択肢にある。
【0072】
以上の設定項目は、予めシステム運用者またはアプリケーションサーバ11の規定により適切な値(基準)が設定されている。そして、上述したアプリケーションに対する障害をアプリケーションサーバ11は次の方法によって検知する。例えば、アプリケーションサーバ11自身が、OS(Operating System)又はプログラムの実行環境が提供するAPI(Application Programming Interface)を用いて、各種リソースの消費状況や障害の発生状況を一定間隔で監視する。あるいは、そのような障害の発生を内部イベントとして発行する実行環境において、アプリケーションサーバ11のアプリケーション実行制御部19が同イベントを受信することにより障害検知を実現する。
【0073】
図4A、
図4Bは、アプリケーションサーバ11における処理の一例を示したフローチャートである。以上の説明を前提事項として、
図4A、
図4Bを用いて、アプリケーションサーバ11内で障害が発生した場合にアプリケーションサーバ11が実行する処理について説明する。
【0074】
上述のような方法により、アプリケーションサーバ11内での障害が検知されると、アプリケーションサーバ11の障害監視部21は、プロセスのスレッド情報の一覧や、メモリ使用量、CPU使用率などの各種リソース情報を採取する(ステップS11)。
【0075】
アプリケーション実行制御部19は、障害監視部21が採取した各種リソース情報を障害解析部22によって解析することにより、発生した障害の種類(障害の原因)を特定する(ステップS12)。
【0076】
アプリケーション実行制御部19は、障害解析部22が特定した障害の種類がデッドロックか、又は処理中のリクエスト処理数が1であるか否かを判定する(ステップS13)。アプリケーション実行制御部19は、実行管理部20に格納された、現に実行されているリクエストの情報を参照することにより、処理中のリクエスト処理数が1であるか否かを判定する。
【0077】
障害解析部22が特定した障害の種類がデッドロックの場合、又は処理中のリクエスト処理数が1の場合には(ステップS13のYes)、アプリケーション実行制御部19は、業務ロジックが呼び出された対象コンポーネントの識別名(コンポーネント名)及びそのインタフェース名をスレッドのスタック情報から抽出する。そしてアプリケーション実行制御部19は抽出した情報を基に、次の情報を含めた障害イベントを、障害イベント発行部18を介して分散管理サーバに対して発行する(ステップS14)。
・コンポーネント名(識別名)
・インタフェース名(メソッド名)
・障害の種類(デッドロック、過剰なCPU消費、過剰なメモリ消費、など)
・関連コンポーネント名(識別名)
・関連インタフェース名(メソッド名)
・リカバリアクション
なお、関連コンポーネント名及び関連インタフェース名は、業務ロジックが呼び出された対象コンポーネントのコンポーネント及びそのインタフェースに関連して障害を発生させると考えられるコンポーネント及びインタフェースを記載したものである。処理中のリクエスト処理数が1の場合には、業務ロジックが呼び出された対象コンポーネントのコンポーネント及びそのインタフェースのみがコンポーネント名及びインタフェース名に記載され、関連コンポーネント名及び関連インタフェース名には何も記載されない。
【0078】
障害解析部22が特定した障害の種類がデッドロックではなく、かつ処理中のリクエスト処理数が複数の場合には(ステップS13のNo)、障害解析部22は、採取したスレッドのスタック情報を順に解析する。解析においては、障害解析部22は、スレッドのスタック情報から、コンポーネントの識別名(コンポーネント名)及びそのインタフェース名を抽出する(ステップS15)。障害分析部23は、障害解析部22が以上の解析で抽出した情報を基に、障害を分析する(ステップS16)。ここで、障害解析部22における情報抽出処理(ステップS15)と、障害分析部23における障害分析処理(ステップS16)は、処理中のリクエスト数分だけループして実行される。
【0079】
図4Bを用いて、障害分析部23における障害分析処理(ステップS16)の詳細について説明する。障害の分析において、障害分析部23は、障害候補格納部24に、障害解析部22が抽出したコンポーネント名及びインタフェース名の対のデータが、候補データとしてエントリされているか否かをチェックする(ステップS17)。
【0080】
障害候補格納部24に当該データが候補データとしてエントリ済みの場合は(ステップS17のYes)、障害分析部23は、そのデータを障害候補格納部から取得する(ステップS18)。
【0081】
障害候補格納部24に当該データが候補データとしてエントリされていない場合は(ステップS17のNo)、障害分析部23は新たな障害要因の候補として、コンポーネントの識別名及びインタフェース名をキーとしてエントリを作成する(ステップS19)。このとき、障害分析部23は検知した障害の種類に合わせて、上述した障害検出のための設定項目により指定された閾値やリカバリアクションなどのパラメータをエントリに格納する。
【0082】
障害分析部23は、ステップS18及びステップS19のいずれの場合においても、障害解析部22が抽出したコンポーネント名及びインタフェース名における障害発生の発生回数を1加算する(ステップS20)。
【0083】
図5は、障害候補格納部24に格納されるデータのイメージ図である。障害候補格納部24においては、コンポーネント名及びインタフェース名に対応して、障害の種類、発生回数、閾値及びリカバリアクションが格納されている。ここで発生回数とは、当該コンポーネントのインタフェースの呼び出しのときに、障害監視部21が何らかの障害を検知することによって、障害の要因候補としてエントリされた回数を示す。
【0084】
図5における閾値とは、上述したように、該当の障害が発生していると判断するための条件である。例えば、アプリケーションの障害の種類がメモリの過剰な消費やCPU負荷などである場合には、障害分析部23は、並行して複数動作するアプリケーションスレッドのどのスレッドが直接的な原因であるかを導くことが難しい。この場合には、障害発生となっている原因箇所を判断するために、統計的な値と条件を用いる必要がある。閾値は、原因箇所の判断材料として用いられる。
【0085】
障害分析部23は、障害候補格納部24に格納されたデータを参照して、コンポーネント名及びインタフェース名の各々において、障害発生の発生回数と、対応する閾値とを比較する。そして、障害発生の発生回数が閾値以上であるか否かを判定する(ステップS21)。
【0086】
障害発生の判断条件となる発生回数が、閾値に達した(又は閾値を超えた)場合には(ステップS21のYes)、障害分析部23は、該当コンポーネントのインタフェースの呼び出しが障害の原因と判断(特定)する。そして障害分析部23は、その情報を用いて分散管理サーバに障害イベントを発行するための処理を開始する。イベントの内容については、上述した通りである。発行される障害イベントにおけるコンポーネント名及びインタフェース名には、障害分析部23が障害原因と判断したコンポーネント(第1コンポーネント)及びインタフェース(第1インタフェース)の名前が記載される。
【0087】
このとき、障害分析部23は、障害原因として判断された(閾値を超えた)エントリ以外で、そのときに閾値を超えていないが最も発生回数が多かったエントリ(2番目に障害発生回数が多かったエントリ)にかかるコンポーネント(第2コンポーネント)及びインタフェース(第2インタフェース)を併せて障害候補として抽出する(ステップS22)。この障害候補は、スレッド処理を制御する対象となるものである。
【0088】
ここで、障害の原因として判断されたエントリ以外で、最も発生回数が多かったエントリを障害候補として抽出する理由は、障害の要因となるアプリケーションのコンポーネント間の関係性を導き出すためである。例えば、CPUの過剰消費が発生する場合、特定のコンポーネントのインタフェースの呼び出しが原因ではなく、複数のコンポーネントのインタフェースの呼び出しが重なることが原因になることがある。呼び出しにより実行される処理が複雑で、CPUを大量に消費するロジックであっても、単体の呼び出しであれば(一時的に負荷は高くなっても)業務システムが正常に稼働する許容範囲に収まるようなインタフェースが単独で呼び出された場合には、CPUの過剰消費は発生しない。しかし、そのようなインタフェースの呼び出しが複数重なる場合においては、CPUの過剰消費が発生してしまう。
【0089】
ただし、インタフェースの呼び出しが複数重なる場合であっても、アプリケーションの構成やアプリケーションサーバのマシンスペック等によって障害に至るかどうかは異なる。そこで、このような関係性を業務システムの稼働中に導き出すことにより、より精度の高い障害候補の検出とその発生防止が可能になる。これは、CPUの過剰消費だけでなく、後述するメモリの過剰消費の場合においても同様である。
【0090】
なお、単体での障害の発生回数が閾値を超えているコンポーネントが複数ある場合も考えられる。このように、特定のコンポーネントにおいて障害発生回数が閾値を超えたことを判定したときに、既に閾値越えが発生しているコンポーネントのインタフェースがある場合は、障害分析部23は、ステップS22においてそのコンポーネント(第2コンポーネント)及びインタフェース(第2インタフェース)も併せて障害候補として抽出する。このように、障害分析部23が抽出する障害候補は1つに限らず、複数であってもよい。
【0091】
さらに、特定のコンポーネント及びインタフェースにおいて、CPUの過剰消費についての障害発生回数が閾値を超えた場合に、別のコンポーネント及びインタフェースにおいてメモリの過剰消費についての障害発生回数が閾値を超えてしまうことが考えられる。このような場合には、メモリの過剰消費が発生した別のコンポーネント(第2コンポーネント)及びインタフェース(第2インタフェース)をステップS22において障害候補として抽出する。なお、メモリの過剰消費についての障害発生回数が閾値を超えた場合に、別のコンポーネント及びインタフェースにおいてCPUの過剰消費についての障害発生回数が閾値を超えてしまう場合が考えられる。その場合においても、CPUの過剰消費が発生した別のコンポーネント(第2コンポーネント)及びインタフェース(第2インタフェース)をステップS22において障害候補として抽出する。
【0092】
なお、ステップS22において、障害候補として抽出するコンポーネント(第2コンポーネント)は、障害分析部23が障害原因と判断したコンポーネント(第1コンポーネント)と同じものであってもよい。ただし、障害分析部23が障害原因と判断したインタフェース(第1インタフェース)と、障害候補として抽出するインタフェース(第2インタフェース)とは異なるインタフェースである。
【0093】
以上、ステップS22において抽出した障害候補を障害イベントにおける関連コンポーネント名、および関連インタフェース名の情報(関連情報)として含め、障害イベント発行部18は障害イベントを発行する(ステップS23)。障害イベントの発行後、障害分析部23は、障害候補格納部24から当該エントリのデータを削除する(ステップS24)。
【0094】
もし、発生回数が閾値を下回った場合には(ステップS21のNo)、当該エントリが障害の原因と判断するにはデータが不十分とみなして、障害分析部23は、障害イベントを発行するための処理を開始しない。障害分析部23は、障害候補格納部24のエントリデータを最新の情報に更新する(ステップS25)。更新された情報は、障害情報記憶部16を介して、記憶装置17に保存される。
【0095】
以上の処理により、障害候補格納部24に蓄えられたエントリ情報は、対象のコンポーネント26が更新又は削除されるまで、各アプリケーションサーバ11によって継続して保持される。そのため、アプリケーションサーバ11の起動時には、記憶装置17に非一時的に格納された障害候補のデータが読み込まれ、再び障害候補格納部24に格納される。
【0096】
図6は、分散管理サーバ27における処理の一例を示したフローチャートである。
図6を用いて、これまでの処理によりアプリケーションサーバ11から分散管理サーバ27に対して障害イベントが発行されたときに、分散管理サーバ27が実行する処理について説明する。
【0097】
まず分散管理サーバ27は、障害イベント受信部30によってアプリケーションサーバ11から障害イベントを受信後、それをイベント解析部31によって解析する(ステップS31)。イベント解析部31は、受信した障害イベントにおいて、障害に対するリカバリアクションが含まれているか否か(定義されているか否か)を判定する(ステップS32)。
【0098】
障害イベントにおいて障害に対するリカバリアクションが含まれている場合には(ステップS32のYes)、運用操作発行部32は、障害イベントに含まれているリカバリアクションの内容に基づき、障害が発生したアプリケーションサーバ11Aに対してリカバリアクションの要求を発行する(ステップS33)。アプリケーションサーバ11Aは発行されたそのリカバリアクションの要求に基づき、リカバリアクションを実行する。これにより、アプリケーションサーバ11Aは障害からリカバリすることができる。
【0099】
分散管理サーバ27は、障害に対するリカバリアクションが、旧バージョンへのアプリケーションのダウングレードであるか否かを判定する(ステップS34)。
【0100】
もし、リカバリアクションが旧バージョンへのアプリケーションのダウングレードの場合には(ステップS34のYes)、分散管理サーバ27は、続けてアプリケーション情報管理部29に格納された配備済みのアプリケーションのバージョン情報を更新する(ステップS35)。これにより、分散管理サーバ27は、自身のアプリケーションのバージョン情報を、アプリケーションサーバ11のアプリケーションのバージョン情報と一致させる。
【0101】
リカバリアクションがダウングレードではない場合には(ステップS34のNo)、分散管理サーバ27は、イベント解析部31によって抽出されたアプリケーションのコンポーネント識別名とインタフェース名を基に、それを新たな障害情報として障害情報発行部33により、全ての管理対象となるアプリケーションサーバ11に送信する(ステップS36)。送信する情報は以下の通りである。
・コンポーネント名(識別名)
・インタフェース名(メソッド名)
・障害の種類(デッドロック、過剰なメモリ消費、過剰なCPU消費、など)
・関連コンポーネント名(識別名)
・関連インタフェース名(メソッド名)
【0102】
なお、障害情報の発行処理(ステップS36)は、管理対象となるアプリケーションサーバ11の台数分だけループしてなされる。
【0103】
各アプリケーションサーバ11の障害情報受信部15は、障害情報発行部33が発行した障害情報を受信する。アプリケーションサーバ11は、受信した障害情報を、障害情報記憶部16に格納後、記憶装置17に保存させる。それと共に、アプリケーションサーバ11は、システム利用者から送信されてくるリクエストの監視を速やかに開始する。
【0104】
図7は、障害情報記憶部16に格納されるデータのイメージ図である。
図7においては、コンポーネント名及びインタフェース名に対応して、障害の種類、関連するコンポーネント名及びインタフェース名(関連情報)が格納されている。
【0105】
図8は、受信した障害情報に基づいてアプリケーションサーバ11が実行する監視処理の一例を示したフローチャートである。以下、
図8を用いて、アプリケーションサーバ11が実行する監視処理について説明する。
【0106】
監視の開始後、アプリケーションサーバ11内のアプリケーション実行制御部19は、リクエスト受付部12を介して、システム利用者からの要求に対するリクエスト(要求リクエスト)を受け付ける(ステップS41)。
【0107】
アプリケーション実行制御部19は、障害情報検索部25によって、システム利用者からリクエストされたコンポーネントのインタフェースに関する障害情報がコンポーネント名及びインタフェース名として障害情報記憶部16に格納されているか否かをチェックする(ステップS42)。
【0108】
障害情報が格納済みの場合は(ステップS42のYes)、さらにアプリケーション実行制御部19は障害情報から、リクエストされたコンポーネントのインタフェースに関連するアプリケーションのインタフェースの情報を参照する(ステップS43)。そして、アプリケーション実行制御部19は、障害情報において、関連するアプリケーション(関連アプリケーション)のインタフェースの情報が存在するか否かを判定する(ステップS44)。ここで関連アプリケーションとは、障害情報における「関連コンポーネント」が含まれるアプリケーションを意味する。
【0109】
関連アプリケーションのインタフェースの情報(すなわち、障害情報における「関連インタフェース」の情報)が存在する場合には(ステップS44のYes)、アプリケーション実行制御部19は、それに該当するリクエスト(関連リクエスト)が、要求リクエストを処理するスレッド以外の他のスレッドにより実行中であるか否かを、実行管理部20が保持する情報によって判定する(ステップS45)。
【0110】
関連リクエストが他のスレッドにより実行中であることを確認できた場合には(ステップS45のYes)、アプリケーション実行制御部19は、そのスレッドの実行が完了するまで後続のリクエスト(要求リクエスト)の実行を待機する(ステップS47)。そして、アプリケーション実行制御部19は、所定の時間が経過後、関連リクエストが他のスレッドにより実行中であるか否かを再度判定する(ステップS45)。
【0111】
関連リクエストが他のスレッドにより実行中でない場合には(ステップS45のNo)、アプリケーション実行制御部19は、後続のリクエストに対するスレッドの処理を実行する(ステップS49)。すなわち、アプリケーション実行制御部19はリクエストを実行する。それ以前のステップS47においてアプリケーション実行制御部19が後続のリクエストの実行を待機する処理を実行した場合には、アプリケーション実行制御部19は、待機状態のリクエストに対するスレッドの処理を再開したことになる。
【0112】
ステップS44において、関連コンポーネントのインタフェースの情報が存在しない場合には(ステップS44のNo)、アプリケーション実行制御部19は以下の処理を実行する。アプリケーション実行制御部19は、障害対象のコンポーネントのインタフェースに対するリクエスト(同一リクエスト)が要求リクエストを処理するスレッド以外の別のスレッドにより実行中か否かを、実行管理部20が保持する情報により判定する(ステップS46)。
【0113】
同一リクエストが別スレッドにて実行中の場合には(ステップS46のYes)、アプリケーション実行制御部19は、当該スレッドの実行が完了するまで後続のリクエストの実行を待機する(ステップS48)。そして、アプリケーション実行制御部19は、所定の時間が経過後、同一リクエストが別スレッドにより実行中であるか否かを再度判定する(ステップS46)。
【0114】
同一リクエストが別スレッドにより実行中でない場合には(ステップS46のNo)、アプリケーション実行制御部19は、同一リクエストに対するスレッドの処理を実行する(ステップS49)。すなわち、アプリケーション実行制御部19はリクエストを実行する。ステップS48においてアプリケーション実行制御部19が後続のリクエストの実行を待機する処理を実行した場合には、アプリケーション実行制御部19は、待機状態のリクエストに対するスレッドの処理を再開したことになる。
【0115】
なお、ステップS47、S48における待機処理では、アプリケーション実行制御部19は、システム運用者又はアプリケーションサーバ11により指定されたパラメータを基に、一定期間を経過後、処理がタイムアウトされたと見なして呼び出し元に適切なエラーを返すことにより
図8の処理を終了してもよい。
【0116】
アプリケーションサーバ11Aにおいて発生した障害がデッドロックである場合には、アプリケーションサーバ11Bは、ステップS46及びS48の処理を実行しなくてもよい。デッドロックの障害は、リクエストにかかるコンポーネントのインタフェースと、それとは別のコンポーネントのインタフェースとの間で同時に排他制御が実行されることにより発生する。そのため、リクエストにかかるコンポーネントのインタフェースが既に実行されても、デッドロックの障害が起きないと考えられるからである。
【0117】
上述の監視処理は、対象のアプリケーションが更新されるまで、各アプリケーションサーバ11によって継続して実施される。従って、それまでの間にアプリケーションサーバ11の再起動が行われると、障害情報記憶部16にあるメモリ上の障害情報は失われてしまう。そのため、アプリケーションサーバ11の起動時には、記憶装置17から非一時的に格納された障害情報が読み込まれる。その際に読み込まれた障害情報は、アプリケーション実行制御部19によって再び障害情報記憶部16に格納される。
【0118】
以下、上述の
図4、
図6及び
図8の処理について、具体的な状況を想定してさらに説明する。
【0119】
<デッドロックが発生した場合>
ここでは、特定のアプリケーションサーバ11Aにおいて、業務システム稼働中に、アプリケーションの欠陥を起因として、複数のリクエストを並行して処理中のスレッド間でデッドロックが発生した場合を考える。ここで、アプリケーションサーバ11において、デッドロックの対象となったアプリケーションのコンポーネントをそれぞれA、B、呼び出しインタフェースをそれぞれAm、Bmとする。またデッドロック発生時には、リカバリアクションとして当該アプリケーションサーバの再起動が予め定義されている。
【0120】
アプリケーションサーバ11A内でデッドロックが発生すると、アプリケーションサーバ11Aにおける障害監視部21は、デッドロックの発生元となったリクエストのスレッドに対するスタック情報(スレッドの呼び出しの流れが記載された情報)を取得する。取得した情報から、アプリケーションサーバ11は、障害解析部22によりデッドロックの対象(障害原因)となったアプリケーションのコンポーネント名(A)とインタフェース名(Am)、それに対応する関連コンポーネント名(B)と関連インタフェース名(Bm)について障害の種類を「デッドロック」とした情報と、デッドロックの対象となったアプリケーションのコンポーネント名(B)とインタフェース名(Bm)、それに対応する関連コンポーネント名(A)と関連インタフェース名(Am)について障害の種類を「デッドロック」とした情報とを含む障害イベントを分散管理サーバ27に発行する。ここで特定されるリカバリアクションは、「サーバ再起動」である。
【0121】
障害イベントを受け取った分散管理サーバ27は、障害イベントの内容から、イベント解析部の解析によりコンポーネントA、BにおけるインタフェースAm、Bm間でのデッドロックの発生、及びサーバ再起動をリカバリアクションとする障害情報を抽出する。分散管理サーバ27は、障害が発生したアプリケーションサーバ11Aを再起動させた後、管理下の全てのアプリケーションサーバ11に障害情報を送信する。この障害情報には、コンポーネント名としてコンポーネントA、B、インタフェース名としてインタフェースAm、Bmが含まれている。
【0122】
障害情報を受け取ったアプリケーションサーバ11Bは、それを障害情報記憶部16に格納すると共に、速やかにリクエストの監視を開始する。その後、アプリケーションサーバ11Bは、リクエスト受付部12によって、クライアントアプリケーション34から出力された、アプリケーションのコンポーネントAのインタフェースAmの呼び出しのためのリクエストを処理する。
【0123】
リクエスト受付部12は、リクエストをアプリケーション実行制御部19に転送する。このとき、アプリケーション実行制御部19の障害情報検索部25は、コンポーネントAのインタフェース情報Amが障害情報記憶部16に存在することを確認する。確認後、アプリケーション実行制御部19は、実行管理部20において既に関連コンポーネントBの関連インタフェースBmの呼び出しが、別のスレッドにより実行中として管理されているかどうかを問い合わせる。
【0124】
もし、インタフェースBmの呼び出しが別のスレッドにより実行中の場合は、アプリケーション実行制御部19は、そのスレッドによる処理が完了するまで、コンポーネントAのインタフェースAmを呼び出すための処理を待機する。そして、コンポーネントBのインタフェースBmの呼び出し処理が完了した後、アプリケーション実行制御部19は、コンポーネントAのインタフェースAmの呼び出しに対する待機を解除し、処理を再開する。
【0125】
図9Aは、以上に示したデッドロック障害発生防止のためのリクエスト処理制御のイメージ図である。アプリケーションサーバ11Bにおいて、コンポーネントAのインタフェースAmに対するリクエストが、コンポーネントBのインタフェースBmに対するリクエストの処理スレッドを実行中に、アプリケーション実行制御部19に対してなされる。
【0126】
ここで、コンポーネントAのインタフェースAmに対するリクエストの処理スレッドを実行した場合、コンポーネントCのインタフェースCm1に対するリクエストがなされる。コンポーネントBのインタフェースBmに対するリクエストの処理スレッドを実行した場合、コンポーネントCのインタフェースCm2に対するリクエストがなされる。このとき、両方のインタフェース(メソッド)から相互に2つの排他制御がなされると、処理の実行タイミングによっては、インタフェースCm1とインタフェースCm2との間でデッドロックが発生してしまう。
【0127】
上述の処理では、コンポーネントBのインタフェースBmに対するリクエストが終了するまで、コンポーネントAのインタフェースAmに対するリクエストの実行を待機する。これにより、両方のインタフェースから相互に2つの排他制御がなされず、インタフェースCm2の実行後にインタフェースCm1が実行される。換言すれば、インタフェースCm1とインタフェースCm2とは別々のタイミングで実行される。このため、デッドロックの発生を回避することができる。
【0128】
図9Bは、デッドロック障害が発生しうる場合(従来技術の場合)のリクエスト処理制御のイメージ図である。
図9Bでは、コンポーネントAのインタフェースAmに対するリクエストの実行が待機されないため、相互に2つの排他制御が伴い、インタフェースCm1とインタフェースCm2との間でデッドロックが発生してしまった場合が示されている。
【0129】
なお、アプリケーションサーバ11Bだけではなく、障害情報を受け取ったアプリケーションサーバ11Cも、同様の処理を実行する。
【0130】
上述の状況では、異なるコンポーネントA、Bのインタフェース間でデッドロックが起こることを説明したが、同一のコンポーネントにおける異なるインタフェース間でデッドロックが発生することも考えられる。例えば、コンポーネントAのインタフェースAm1に対するリクエストの処理スレッドを実行した場合に、共通コンポーネントCのインタフェースCm1に対するリクエストがなされ、コンポーネントAのインタフェースAm2に対するリクエストの処理スレッドを実行した場合に、共通コンポーネントCのインタフェースCm2に対するリクエストがなされることが考えられる。このとき、両方のインタフェースAm1、Am2から相互に2つの排他制御がなされる。ここで、処理のタイミングによっては、それらの排他制御が交差する(同時に発生する)ような処理の流れになり、
図9Bと同様の原理によりデッドロックが発生する。このように、同一のコンポーネントAの異なるインタフェースAm1、Am2を各スレッドにおいて処理する過程で、互いに共通コンポーネントCに対する異なる排他制御が存在することが考えられる。
【0131】
以上のデッドロックがアプリケーションサーバ11A内で発生した場合、障害監視部21の取得した情報から、アプリケーションサーバ11は、障害解析部22によりデッドロックの対象(障害原因)となったアプリケーションのコンポーネント名(A)とインタフェース名(Am1)、それに対応する関連コンポーネント名(A)と関連インタフェース名(Am2)について障害の種類を「デッドロック」とした情報と、デッドロックの対象となったアプリケーションのコンポーネント名(A)とインタフェース名(Am2)、それに対応する関連コンポーネント名(A)と関連インタフェース名(Am1)について障害の種類を「デッドロック」とした情報とを含む障害イベントを分散管理サーバ27に発行する。
【0132】
発行された障害イベントに基づき、分散管理サーバ27が障害情報をアプリケーションサーバ11Bに送信する。アプリケーションサーバ11Bは、
図9Aで説明したものと同様なデッドロック障害発生防止のためのリクエスト処理制御を実行する。例えば、インタフェースAm1の呼び出しのためのリクエストがクライアントアプリケーション34からあり、既にインタフェースAm2の呼び出しが別のスレッドにおいて実行されている場合に、アプリケーション実行制御部19はそのスレッドによる処理が完了するまでインタフェースAm1を呼び出すための処理を待機する。そして、インタフェースAm2の呼び出し処理が完了した後、アプリケーション実行制御部19は、インタフェースAm1の呼び出しに対する待機を解除し、処理を再開する。
【0133】
<メモリの過剰消費が発生した場合>
以下、もう一つの具体例を用いて、上述の
図4、
図6及び
図8の処理についてさらに説明する。ここでは、特定のアプリケーションサーバ11Aにおいて、システム稼働中に、アプリケーションの欠陥を起因としてメモリの過剰な消費が発生した場合を考える。なお、アプリケーションサーバ11において、メモリを過剰に消費するアプリケーションのコンポーネントをA、そのインタフェースをAmとし、それ以外の(問題を含まない)コンポーネントをB〜E、それらのインタフェースをそれぞれBm〜Emとする。さらに、障害情報記憶部16内のデータにおいて、それらが障害発生の原因と判断するための発生回数の閾値が「3」であり、設定されたリカバリアクションが「強制GC」であると設定される。
【0134】
いま、時刻t1においてアプリケーションサーバ11A内でメモリの過剰な消費が発生すると、障害監視部21は、リクエストを処理中のスレッドに対するスタック情報を取得する。アプリケーション実行制御部19は、取得した情報から、障害解析部22によって障害にかかるアプリケーションのコンポーネント名とインタフェース名を特定する。ここでは、次の情報が解析により得られたものとする。
[コンポーネント名:インタフェース名] A:Am、C:Cm、E:Em
【0135】
このとき、障害分析部23は、障害情報記憶部16にそれぞれのエントリ情報を新たに格納する。また、それぞれのエントリの発生回数を1とする。
【0136】
図10Aは、時刻t1における障害情報記憶部16内のデータが示された表である。障害情報記憶部16内のデータには、上述の通り、A:Am、C:Cm、E:Emにおいて、「過剰なCPU消費」の障害がそれぞれ1回発生したことが記憶されている。さらに、発生回数の閾値が「3」であり、リカバリアクションが「強制GC」であることも記憶されている。ここで、A:Am、C:Cm、E:Emのエントリの発生回数は、いずれも閾値は超えていない。そのため、障害イベント発行部18は、障害発生イベントを発行しない。
【0137】
その後、時刻t2において、アプリケーションサーバ11A内で再びメモリの過剰な消費が発生する。ここでは、障害解析部22によって次の情報が解析により得られたものとする。
[コンポーネント名:インタフェース名] A:Am、B:Bm、C:Cm(以下、コンポーネント及びそれに対応するインタフェースを同様に表示する。)
【0138】
このとき、障害分析部23は、上述と同様の処理を経て、障害情報記憶部16に格納されたデータに、エントリを追加・更新する。
【0139】
図10Bは、時刻t2における障害情報記憶部16内のデータが示された表である。障害情報記憶部16内のデータには、「過剰なメモリ消費」の障害がA:Amにおいて2回、B:Bmにおいて1回、C:Cmにおいて2回、E:Emにおいて1回発生したことが記憶されている。ここで、A:Am、C:Cmの障害発生回数は2となるが、まだ閾値に達していないため、障害イベント発行部18は障害イベントを発行しない。
【0140】
その後、時刻t3において、アプリケーションサーバ11A内で再びメモリの過剰な消費が発生する。ここでは、障害解析部22によって次の情報が解析により得られたものとする。
[コンポーネント名:インタフェース名] A:Am、D:Dm、E:Em
【0141】
このとき、障害分析部23は、上述と同様の処理を経て、障害情報記憶部16に格納されたデータに、エントリを追加・更新する。
【0142】
図10Cは、時刻t3における障害情報記憶部16内のデータが示された表である。障害情報記憶部16内のデータには、「過剰なメモリ消費」の障害がA:Amにおいて3回、B:Bmにおいて1回、C:Cmにおいて2回、D:Dmにおいて1回、E:Emにおいて2回発生したことが記憶されている。
【0143】
ここで、A:Amにおいての障害発生回数は3となり、閾値に達している。そのため、障害分析部23は、A:Amをメモリの過剰な消費に伴う障害の原因と判断する。そして障害分析部23は、A:Amの次に発生回数が高かった、C:Cm、E:Emを、それぞれ障害の原因となるA:Amについての関連コンポーネント、関連インタフェース(関連情報)とみなす。そして、障害イベント発行部18は、障害の原因であるコンポーネント名及びインタフェース名(A:Am)、関連コンポーネント名及び関連インタフェース名(C:Cm及びE:Em)が示された障害イベントを分散管理サーバ27に発行する。
【0144】
その後なされる処理、つまり分散管理サーバ27におけるリカバリアクションの実行及びアプリケーションサーバ11への障害情報の発行、ならびに各アプリケーションサーバ11における障害情報受信後の処理及びリクエスト処理スレッドの実行制御については、上述と同様である。
【0145】
図11Aは、以上に示した過剰なメモリ消費の障害発生防止のためのリクエスト処理制御のイメージ図である。
図11Aにおいては、アプリケーションサーバ11Bにおいて、コンポーネントAのインタフェースAmに対する複数のリクエストがアプリケーション制御部に対してなされる。
【0146】
ここで、コンポーネントAのインタフェースAmが過剰にメモリを消費するインタフェースである場合、複数のリクエストによりインタフェースAmが呼び出されると、メモリ不足が発生してしまう。
【0147】
アプリケーションサーバ11Bは、先になされたコンポーネントAのインタフェースAmに対するリクエストが終了するまで、後になされたコンポーネントAのインタフェースAmに対するリクエストの実行を待機する。これにより、アプリケーションサーバ11Bにおいては、複数のリクエストによる呼び出しが行われなくなるため、メモリ不足の発生を回避することができる。つまり、アプリケーションサーバ11Bは、コンポーネントAが持つインタフェースAmの実行を複数のスレッド間で同時に実行しないよう制御する。
【0148】
なお、障害情報として、コンポーネントAが持つインタフェースAmの次に(2番目に)発生回数が多かった障害候補としてコンポーネントCのインタフェースCmがあり、それが別スレッドで実行中である場合が考えられる。この場合、アプリケーションサーバ11Bは、その処理が完了するまでコンポーネントAのインタフェースAmの実行を待機する。このように制御することで、複数のコンポーネントのインタフェースの呼び出しが原因となる障害の発生を未然に防ぐことが期待できる。障害候補として、既に閾値越えが発生しているコンポーネントのインタフェースが記録されている場合や、CPUの過剰消費についての障害発生回数が閾値を超えたコンポーネントのインタフェースが記録されている場合でも、同様の制御が実行できる。
【0149】
なお、コンポーネントAが持つインタフェースAmの次に発生回数が多かった障害候補として、同じコンポーネントAの異なるインタフェースAm2が記載されていてもよい。この場合、インタフェースAm2が別スレッドで実行中であれば、アプリケーションサーバ11Bは、その処理が完了するまでインタフェースAmの実行を待機する。
【0150】
図11Bは、過剰なメモリ消費の障害が発生しうる場合(従来技術の場合)のリクエスト処理制御のイメージ図である。
図11Bでは、コンポーネントAのインタフェースAmに対するリクエストが複数なされることによりインタフェースが呼び出されてしまうため、メモリ不足の障害が発生してしまう。
【0151】
<CPUの過剰消費が発生した場合>
以下、さらに一つの具体例を用いて、上述の
図4、
図6及び
図8の処理についてさらに説明する。ここでは、特定のアプリケーションサーバ11Aにおいて、システム稼働中に、アプリケーションの欠陥を起因としてCPUの過剰な消費が発生した場合を考える。なお、アプリケーションサーバ11において、CPUを過剰に消費するアプリケーションのコンポーネントをA、そのインタフェースをAmとし、それ以外の(問題を含まない)コンポーネントをB〜E、それらのインタフェースをそれぞれBm〜Emとする。さらに、障害情報記憶部16内のデータにおいて、それらが障害発生の原因と判断するための発生回数の閾値が「3」であり、設定されたリカバリアクションが「強制GC」であると設定される。
【0152】
いま、時刻t4においてアプリケーションサーバ11A内でCPUの過剰な消費が発生すると、障害監視部21は、リクエストを処理中のスレッドに対するスタック情報を取得する。アプリケーション実行制御部19は、取得した情報から、障害解析部22によって障害にかかるアプリケーションのコンポーネント名とインタフェース名を特定する。ここでは、次の情報が解析により得られたものとする。
[コンポーネント名:インタフェース名] A:Am、C:Cm、E:Em
【0153】
このとき、障害分析部23は、障害情報記憶部16にそれぞれのエントリ情報を新たに格納する。また、それぞれのエントリの発生回数を1とする。
【0154】
図12Aは、時刻t4における障害情報記憶部16内のデータが示された表である。障害情報記憶部16内のデータには、上述の通り、A:Am、C:Cm、E:Emにおいて、「過剰なCPU消費」の障害がそれぞれ1回発生したことが記憶されている。さらに、発生回数の閾値が「3」であり、リカバリアクションが「強制GC」であることも記憶されている。ここで、A:Am、C:Cm、E:Emのエントリの発生回数は、いずれも閾値は超えていない。そのため、障害イベント発行部18は、障害発生イベントを発行しない。
【0155】
その後、時刻t5において、アプリケーションサーバ11A内で再びCPUの過剰な消費が発生する。ここでは、障害解析部22によって次の情報が解析により得られたものとする。
[コンポーネント名:インタフェース名] A:Am、B:Bm、C:Cm(以下、コンポーネント及びそれに対応するインタフェースを同様に表示する。)
【0156】
このとき、障害分析部23は、上述と同様の処理を経て、障害情報記憶部16に格納されたデータに、エントリを追加・更新する。
【0157】
図12Bは、時刻t5における障害情報記憶部16内のデータが示された表である。障害情報記憶部16内のデータには、「過剰なCPU消費」の障害がA:Amにおいて2回、B:Bmにおいて1回、C:Cmにおいて2回、E:Emにおいて1回発生したことが記憶されている。ここで、A:Am、C:Cmの障害発生回数は2となるが、まだ閾値に達していないため、障害イベント発行部18は障害イベントを発行しない。
【0158】
その後、時刻t6において、アプリケーションサーバ11A内で再びCPUの過剰な消費が発生する。ここでは、障害解析部22によって次の情報が解析により得られたものとする。
[コンポーネント名:インタフェース名] A:Am、D:Dm、E:Em
【0159】
このとき、障害分析部23は、上述と同様の処理を経て、障害情報記憶部16に格納されたデータに、エントリを追加・更新する。
【0160】
図12Cは、時刻t6における障害情報記憶部16内のデータが示された表である。障害情報記憶部16内のデータには、「過剰なCPU消費」の障害がA:Amにおいて3回、B:Bmにおいて1回、C:Cmにおいて2回、D:Dmにおいて1回、E:Emにおいて2回発生したことが記憶されている。
【0161】
ここで、A:Amにおいての障害発生回数は3となり、閾値に達している。そのため、障害分析部23は、A:AmをCPUの過剰な消費に伴う障害の原因と判断する。そして障害分析部23は、次に発生回数が高かった、C:Cm、E:Emを、それぞれ障害の原因となるA:Amについての関連コンポーネント、関連インタフェースとみなす。そして、障害イベント発行部18は、障害の原因であるコンポーネント名及びインタフェース名(A:Am)、関連コンポーネント名及び関連インタフェース名(C:Cm及びE:Em)が示された障害イベントを分散管理サーバ27に発行する。
【0162】
その後なされる処理、つまり分散管理サーバ27におけるリカバリアクションの実行及びアプリケーションサーバ11への障害情報の発行、ならびに各アプリケーションサーバ11における障害情報受信後の処理及びリクエスト処理スレッドの実行制御については、上述と同様である。
【0163】
図13Aは、以上に示した過剰なCPU消費の障害発生防止のためのリクエスト処理制御のイメージ図である。
図13Aにおいては、アプリケーションサーバ11Bにおいて、コンポーネントAのインタフェースAmに対する複数のリクエストがアプリケーション制御部に対してなされる。
【0164】
ここで、コンポーネントAのインタフェースAmが過剰にCPUを消費するインタフェースである場合、複数のリクエストによりインタフェースAmが呼び出されると、他のリクエストの処理遅延等が発生してしまう。
【0165】
アプリケーションサーバ11Bは、先になされたコンポーネントAのインタフェースAmに対するリクエストが終了するまで、後になされたコンポーネントAのインタフェースAmに対するリクエストの実行を待機する。これにより、アプリケーションサーバ11Bは、複数のリクエストによる呼び出しが行われなくなるため、他のリクエストの処理遅延等の発生を回避することができる。つまり、アプリケーションサーバ11Bは、コンポーネントAが持つインタフェースAmの実行を複数のスレッド間で同時に実行しないよう制御する。
【0166】
なお、障害情報として、コンポーネントAが持つインタフェースAmの次に(2番目に)発生回数が多かった障害候補としてコンポーネントCのインタフェースCmがあり、それが別スレッドで実行中である場合が考えられる。この場合、アプリケーションサーバ11Bは、その処理が完了するまでコンポーネントAのインタフェースAmの実行を待機する。このように制御することで、複数のコンポーネントのインタフェースの呼び出しが原因となる障害の発生を未然に防ぐことが期待できる。障害候補として、既に閾値越えが発生しているコンポーネントのインタフェースが記録されている場合や、メモリの過剰消費についての障害発生回数が閾値を超えたコンポーネントのインタフェースが記録されている場合でも、同様の制御が実行できる。
【0167】
なお、コンポーネントAが持つインタフェースAmの次に発生回数が多かった障害候補として、同じコンポーネントAの異なるインタフェースAm2が記載されていてもよい。この場合、インタフェースAm2が別スレッドで実行中であれば、アプリケーションサーバ11Bは、その処理が完了するまでインタフェースAmの実行を待機する。
【0168】
図13Bは、過剰なCPU消費の障害が発生しうる場合(従来技術の場合)のリクエスト処理制御のイメージ図である。
図13Bでは、コンポーネントAのインタフェースAmに対するリクエストが複数なされることによりインタフェースが呼び出されてしまうため、他のリクエストの処理遅延等の障害が発生してしまう。
【0169】
以上に記載した実施の形態2における分散管理システム10の処理をまとめる。障害が発生したアプリケーションサーバは、メモリやスレッド、CPUなどのリソース情報を分析して、アプリケーション障害の原因となる対象を、そのコンポーネントやインタフェースレベルで特定、または予測する。これにより、システム全体への影響を及ぼすアプリケーション障害を対処するにあたって、システム運用者が障害原因の特定(又は統計的な予測)をせずに済むため、システム運用者の負荷を軽減することができる。
【0170】
そして、障害が発生したアプリケーションサーバは、その分析結果を他の同じ構成からなるアプリケーションサーバに発信することにより、障害情報を他のアプリケーションサーバと共有する。さらに、発信情報を受信したアプリケーションサーバは、他のアプリケーションサーバにおいて発生した障害と同様の障害発生を防止するために、受信した障害情報を蓄積する。そして、アプリケーションサーバは、蓄積した障害情報に基づいて、アプリケーションへのリクエストに対する監視を実行するほか、リクエストの実行順序やタイミングを制御する。
【0171】
実施の形態2にかかる分散管理システム10の効果は、以下の通りである。第一に、分散配置された複数のアプリケーションサーバから構成されるシステムにおいて、アプリケーションの欠陥に伴いシステム全体に波及する恐れがある障害を、未然に防ぐことができる。その理由は、アプリケーションの欠陥による障害情報を他のアプリケーションサーバに転送することによって、障害情報が転送されたアプリケーションサーバは、同じ障害に遭遇しないようにアプリケーションの実行を制御できるようになるからである。
【0172】
アプリケーションの欠陥は、デッドロックやメモリの障害のように、その発生条件は特定の処理パターンに基づくことが多い。そのため、そのパターンを分析して、事前にその障害パターンを発生させないようにアプリケーションサーバがアプリケーションの呼び出しを制御することにより、分散管理システム全体を安定的に動作させることができる。換言すれば、アプリケーションサーバは、将来的に発生し得る他のアプリケーションサーバで発生した障害と同様の障害箇所に特化した監視及び処置を実行することができる。この監視及び処置において、アプリケーションサーバは、アプリケーションに対するリクエストの実行順序やタイミングを制御する。
【0173】
第二の効果は、システム管理者の負担を抑えられる点にある。その理由は、分散管理システム10により、システム運用者による作業を介入することなく、障害への(例えば暫定的な)対処を自動的に実施できるようになるからである。
【0174】
一般的に、アプリケーションの欠陥が原因の障害は、根本的な解決にはアプリケーションプログラムの改修が必要である。すなわち、全てのアプリケーションサーバ上で動作中のコンポーネントを更新するまで、障害が再発する可能性がある。ここで、アプリケーションプログラムが改修され、そのテストを経てアプリケーションサーバ上のコンポーネントを更新するまでには、ある程度の期間を要する。
【0175】
そのため、コンポーネント更新までの間、止むを得ずシステムを稼動し続けなければならない状況において同様の障害が発生した場合には、システム運用者によるアプリケーションサーバの再起動など、何らかの暫定的な対処作業が必要となる。また、この場合には、アプリケーションサーバの台数が増える程当該アプリケーションの欠陥に遭遇する可能性が高くなるため、システム運用者に過度な作業負荷を強いる可能性が高くなる。
【0176】
しかしながら、実施の形態2にかかる分散管理システム10は、システム運用者に代わって、アプリケーションサーバ自身が障害の再発を防ぐようにアプリケーションの実行を制御する。このため、このようなシステム運用者による対処作業は、アプリケーションサーバの数に関わらず不要となる。
【0177】
近年、クラウド・コンピューティング技術を用いたシステムモデルの構築が増加している。このようなシステムは、多数のネットワーク上に分散的に配置された大多数のサーバマシンから構成されていることが多い。また、サーバマシンを構成するアプリケーションサーバは、互いに同じ構成を有することが多い。このようなシステムは、大抵が負荷分散構成であるため、一台の(障害発生などに伴う)サーバの異常がシステム全体に影響を及ぼす(すなわちシステム全体の障害に発展する)ことにはなりにくい。
【0178】
しかし、その上で動作する業務アプリケーションそのものに欠陥が含まれる場合に、それを起因とする障害が一台で発生すると、近いうちに他のアプリケーションサーバにおいても同様の障害が立て続けに発生する可能性がある。そうなると、障害が、システム全体としてのパフォーマンスの低下や、非稼働時間に影響する可能性がある。ひいては、障害がシステムのSLA(Service Level Agreement)などへの品質問題に発展する恐れがある。この場合、欠陥のアプリケーションを従来のバージョンにダウングレードするなどの処置を取らない限り、上述のシステム運用者による暫定対応は避けられない。かつ、対象のサーバ台数が多くなると、それだけそのような障害に遭遇する確率も高くなり、ひいては暫定対応のための作業コストが増大することに繋がる。
【0179】
ただし、アプリケーションの欠陥は、上述の通り、その発生条件が特定の処理パターンに基づくことが多い。そのため、そのパターンを分析して、事前にその障害パターンを発生させないようにアプリケーションの呼び出しをアプリケーションサーバが制御することによって、システムを安定して稼動できる可能性が高い。一方で、アプリケーションの欠陥を修復するまでには、たいていの場合、類似問題を発生させないよう、十分な評価期間と作業コストを要する。
【0180】
以上より、このような状況においては、できるだけシステム運用者への負荷を掛けない状態で、欠陥を含んだ状態のアプリケーションのままで、システムを可能な限り安定して稼動できるように制御する仕組みを構築する必要があると考えられる。この場合、処理性能が多少劣化しても、システムを可能な限り安定して稼動できる方が重要であると考えられる。このようにすることによって、障害に対する根本解決までの作業コストの増大及びシステムの非稼動に伴う経済的な損失を阻止するという重要な目的が達成できるためである。
【0181】
上述の通り、特許文献1、2においては、クラウド・コンピューティングのように、アプリケーションサーバ等のサーバを複数配置した状況は考慮されていない。
【0182】
具体的には、特許文献1にかかるシステムでは、独自の判断条件に基づいて障害情報を蓄積し、それに基づいて検出した障害情報を専用の管理者端末に転送している。しかしながら、アプリケーションサーバ等が分散配置された環境については考慮していない。一方、実施の形態2にかかる分散管理システムは、分散配置された環境に障害情報を転送し、さらにその障害情報を基に障害の発生を防止する仕組みを有している。
【0183】
また、特許文献2にかかるシステムでは、独自の判断条件に基づいて障害情報を予測又は検知すると、コンポーネントを入れ替えることによってシステム全体の障害の発生を防止している。しかし、この処理は動作する代替コンポーネントが存在することが前提である。言い換えれば、そのようなコンポーネントが存在しなければ、システム全体の障害の発生を防止するという効果の恩恵は受けられない。一方、実施の形態2にかかる分散管理システム10では、コンポーネントの置換については考慮不要である。例えアプリケーションの欠陥を含んだままのコンポーネントであっても、分散管理システムはその欠陥部分に特定してアプリケーションの動作を制御した上で、コンポーネントをシステム障害が発生しないように最大限活用することができる。
【0184】
なお、実施の形態2に記載された分散管理システムは、以下の効果も奏する。アプリケーションサーバ11Aは、アプリケーションの障害が発生した場合に、アプリケーションサーバ11Aにおける障害のリカバリに必要なリカバリアクション(リカバリ処理)を特定する情報を含む障害イベント(障害情報)を生成する。分散管理サーバ27は、アプリケーションサーバ11Aが発行した障害イベントからリカバリアクションを特定する情報を抽出してアプリケーションサーバ11Aに送信する。アプリケーションサーバ11Aは、分散管理サーバ27から送信されたリカバリアクションを特定する情報に基づいて、障害のリカバリアクションを実行する。これにより、障害が発生したときにアプリケーションサーバ11Aが自身で障害のリカバリアクションを実行できないときでも、分散管理サーバ27の要求に基づいた処理を実行することにより、障害リカバリアクションを実行できる。さらに、障害が発生したときでも、各アプリケーションサーバ11においてリカバリアクションの制御をシステム管理者が判断する必要がなく、分散管理サーバ27においてリカバリアクションの制御を扱うことができる。そのため、システム管理者の負担を軽減することができる。
【0185】
アプリケーションサーバ11Aにおけるアプリケーションの障害は、自身のクライアントからのリクエストに基づいて発生したものであり、アプリケーションサーバ11Bは、アプリケーションサーバ11Aが生成した障害イベントに基づいて、自身のクライアントからのリクエストをモニタリングする。これにより、分散管理システム10は、クライアントからのリクエストによって生ずる障害の発生を防止することができる。
【0186】
アプリケーションサーバ11Aにおいて、あるコンポーネントのインタフェース(第1のインタフェース)において閾値以上の障害が発生した場合に、アプリケーションサーバ11Aは、その第1のインタフェースを前記障害の原因として特定する。さらにアプリケーションサーバ11Aは、第1のインタフェースの次に多く障害が発生した別のコンポーネントのインタフェース(第2のインタフェース)を、障害の関連情報として含む障害イベントを出力する。アプリケーションサーバ11Bは、障害イベントに基づき、第1のインタフェースがクライアントからリクエストされた場合に第2のインタフェースがスレッドにおいて実行中であるか否かを判定し、実行中である場合に前記リクエストの処理を実行させないようにする。これにより、障害原因に関連すると推測される処理を実行しないようにするため、分散管理システム10の障害発生をより精度よく防止することができる。
【0187】
アプリケーションサーバ11Aにおいて、あるコンポーネントのインタフェース(第1のインタフェース)において閾値以上の障害が発生した場合に、アプリケーションサーバ11Aは、その第1のインタフェースを前記障害の原因として特定する。さらにアプリケーションサーバ11Aは、その他に閾値以上の障害が発生した別のコンポーネントのインタフェース(第3のインタフェース)を、障害の関連情報として含む障害イベントを出力する。アプリケーションサーバ11Bは、障害イベントに基づき、第1のインタフェースがクライアントからリクエストされた場合に第3のインタフェースがスレッドにおいて実行中であるか否かを判定し、実行中である場合にリクエストの処理を実行させないようにする。これにより、障害原因に関連すると推測される処理を実行しないようにするため、分散管理システム10の障害発生をより精度よく防止することができる。
【0188】
アプリケーションサーバ11Aにおいて、あるコンポーネントのインタフェース(第1のインタフェース)において閾値以上の障害が発生した場合に、アプリケーションサーバ11Aは、その第1のインタフェースを前記障害の原因として特定する。さらにアプリケーションサーバ11Aは、その他に障害が発生した別のコンポーネントのインタフェース(第2のインタフェース)を、障害の関連情報として含む障害イベントを出力する。アプリケーションサーバ11Bは、障害イベントに基づき、第1のインタフェースがクライアントからリクエストされた場合に、第2のインタフェースがスレッドにおいて実行中であるか否かを判定し、実行中である場合にリクエストの処理を実行させないようにする。これにより、障害原因に関連すると推測される処理を実行しないようにするため、分散管理システム10の障害発生をより精度よく防止することができる。
【0189】
なお、上述の場合において、アプリケーションサーバ11Bは、障害イベントに基づき、第1のインタフェースがクライアントからリクエストされた場合に、第1のインタフェースがスレッドにおいて実行中であるか否かをさらに判定する。第1のインタフェースが実行中である場合に、アプリケーションサーバ11Bは、リクエストの処理を実行させないようにする。これにより、障害原因と特定された処理を一度に実行するスレッドの数をより少なくできるため、分散管理システム10の障害発生をより精度よく防止することができる。
【0190】
上述の第1のインタフェースにおける障害、第2のインタフェースにおける障害は、それぞれメモリの使用率が基準を超えること又はCPUの使用率が基準を超えることのいずれかである。これにより、分散管理システム10におけるアプリケーション起因の障害において頻発する障害を的確に防止することができる。さらに、第1のインタフェースにおける障害をメモリの使用率が基準を超えることとし、第2のインタフェースにおける障害をCPUの使用率が基準を超えることとしてもよい。このように、アプリケーションサーバは、異なる種類であっても、処理に時間がかかってしまうという共通した性質を有する障害同士について、その原因となったコンポーネント及びインタフェースの情報を、障害を特定する情報及び障害関連情報として障害イベントに含み、発行する。これにより、類似の性質を有する障害の原因となる処理を一度に実行するスレッドの数をより少なくできるため、分散管理システム10の障害発生をより精度よく防止することができる。
【0191】
アプリケーションサーバ11Aにおいて、あるコンポーネントのインタフェース(第1のインタフェース)と別のコンポーネントのインタフェース(第2のインタフェース)間におけるデッドロックが障害として発生した場合に、アプリケーションサーバ11Aは、第1のインタフェースと第2のインタフェースとを障害の原因として特定する障害イベントを出力する。アプリケーションサーバ11Bは、障害イベントに基づき、第1のインタフェースがクライアントからリクエストされた場合に第2のインタフェースがスレッドにおいて実行中であるか否かを判定し、実行中である場合にリクエストの処理を実行させないようにする。これにより、分散管理システム10のアプリケーションサーバ11において、デッドロックを確実に防止することができる。
【0192】
実施の形態2に記載された分散管理システムは、例えばWebアプリケーションサーバやコンピュータ管理アプリケーションなどのミドルウェアにおいて適用することができる。これにより、アプリケーションの欠陥に伴うシステム停止(またはその期間)を抑えることができ、また、障害発生への対処に伴うシステム運用者への負荷を軽減することが期待できる。
【0193】
なお、本発明は上記実施の形態に限られたものではなく、趣旨を逸脱しない範囲で適宜変更することが可能である。
【0194】
例えば、実施の形態2に記載した分散管理システム10におけるアプリケーションコンポーネントを、Webアプリケーションサーバなどを構成するモジュールやシステムコンポーネントに置き換えた上で、分散管理システムの構成及び処理を
図1から
図11と同様の構成としてもよい。このようにしても、分散配置されたアプリケーションサーバの運用操作におけるデッドロックやメモリ不足などの障害を未然に防ぐことができる。
【0195】
実施の形態2では、デッドロック、CPU又はメモリの過剰消費を例示したが、障害の種類はこれにとどまらない。
【0196】
以下、本発明の各種形態を付記する。
(付記1)
同じアプリケーションを実行可能な第1のサーバ及び第2のサーバを備える分散システムであって、
前記第1のサーバにおいて前記アプリケーションの障害が発生した場合に、前記第1のサーバは、前記アプリケーションの障害原因を特定する障害情報を生成し、
前記第2のサーバは、前記障害情報に基づいて決定された、前記アプリケーションの障害発生を防止するための障害発生防止処理を実行する、
分散システム。
(付記2)
前記分散システムは、前記第1のサーバ及び前記第2のサーバを管理する分散管理サーバをさらに備え、
前記アプリケーションの障害が発生した場合に、前記第1のサーバは、前記第1のサーバにおける障害のリカバリに必要なリカバリ処理を特定する情報を含む前記障害情報を生成し、
前記分散管理サーバは、前記障害情報から前記リカバリ処理を特定する情報を抽出して前記第1のサーバに送信し、
前記第1のサーバは、前記分散管理サーバから送信された前記リカバリ処理を特定する情報に基づいて、前記障害のリカバリ処理を実行する、
付記1に記載の分散システム。
(付記3)
前記第1のサーバにおける前記アプリケーションの障害は、前記第1のサーバのクライアントからのリクエストに基づいて発生したものであり、
前記第2のサーバは、前記障害情報に基づき、前記第2のサーバのクライアントからのリクエストをモニタリングする、
付記1又は2に記載の分散システム。
(付記4)
前記第1のサーバ及び前記第2のサーバは、前記アプリケーションにかかる複数のコンポーネントを有し、
前記第1のサーバにおいて、第1のコンポーネントの第1のインタフェースにおいて閾値以上の障害が発生した場合に、前記第1のサーバは、前記第1のインタフェースを前記障害の原因として特定し、かつ、前記複数のコンポーネントのインタフェースにおいて前記第1のインタフェースの次に多く障害が発生した第2のコンポーネントの第2のインタフェースを前記障害の関連情報として含む前記障害情報を出力し、
前記第2のサーバは、前記障害情報に基づき、前記第1のインタフェースが前記第2のサーバのクライアントからリクエストされた場合に、前記第2のインタフェースがスレッドにおいて実行中であるか否かを判定し、実行中である場合に前記リクエストの処理を実行させないようにする、
付記3に記載の分散システム。
(付記5)
前記第1のサーバ及び前記第2のサーバは、前記アプリケーションにかかる複数のコンポーネントを有し、
前記第1のサーバにおいて、第1のコンポーネントの第1のインタフェースにおいて閾値以上の障害が発生するとともに、前記第1のインタフェースの他に閾値以上の障害が発生した第2のコンポーネントの第2のインタフェースがある場合には、前記第1のサーバは、前記第1のインタフェースを前記障害の原因として特定し、かつ、前記第2のインタフェースを前記障害の関連情報として含む前記障害情報を出力し、
前記第2のサーバは、前記障害情報に基づき、前記第1のインタフェースが前記第2のサーバのクライアントからリクエストされた場合に、前記第2のインタフェースがスレッドにおいて実行中であるか否かを判定し、実行中である場合に前記リクエストの処理を実行させないようにする、
付記3又は4に記載の分散システム。
(付記6)
前記第2のサーバは、前記障害情報に基づき、前記第1のインタフェースが前記第2のサーバのクライアントからリクエストされた場合に、前記第1のインタフェースが既にスレッドにおいて実行中であるか否かをさらに判定し、実行中である場合に前記リクエストの処理を実行させないようにする、
付記4又は5に記載の分散システム。
(付記7)
前記第1のサーバ及び前記第2のサーバは、前記アプリケーションにかかる複数のコンポーネントを有し、
前記第1のサーバにおいて、第1のコンポーネントの第1のインタフェースと第2のコンポーネントの第2のインタフェース間におけるデッドロックが前記障害として発生した場合に、前記第1のサーバは、前記第1のインタフェースと前記第2のインタフェースとを前記障害の原因として特定する前記障害情報を出力し、
前記第2のサーバは、前記障害情報に基づき、前記第1のインタフェースが前記第2のサーバのクライアントからリクエストされた場合に、前記第2のインタフェースがスレッドにおいて実行中であるか否かを判定し、実行中である場合に前記リクエストの処理を実行させないようにする、
付記3ないし5のいずれか一項に記載の分散システム。
(付記8)
分散システムに設けられ、同じアプリケーションを実行可能な他のサーバ計算機と接続されたサーバ計算機であって、
前記アプリケーションの障害が発生した場合に、前記アプリケーションの障害原因を特定する障害情報を生成し、
前記他のサーバが前記アプリケーションの障害原因を特定する障害情報を生成した場合に、前記障害情報に基づいて決定された、前記アプリケーションの障害発生を防止するための障害発生防止処理を実行する、
サーバ計算機。
(付記9)
同一のアプリケーションを実行可能な第1のサーバ及び第2のサーバを備えた分散システムに設けられた分散管理サーバであって、
前記第1のサーバから、前記第1のサーバにおけるアプリケーションの障害原因を特定する障害情報を受信した場合に、前記第2のサーバにおいて前記アプリケーションの障害発生を防止するための障害発生防止処理を実行するために用いられる情報として、前記第2のサーバに前記障害情報を通知する分散管理サーバ。
(付記10)
同じアプリケーションを実行可能な第1のサーバ及び第2のサーバを備える分散システムにおいてアプリケーションの障害発生を防止する障害発生防止方法であって、
前記第1のサーバにおいて前記アプリケーションの障害が発生した場合に、前記第1のサーバは、前記アプリケーションの障害原因を特定する障害情報を生成するステップと、
前記第2のサーバは、前記障害情報に基づいて決定された、前記アプリケーションの障害発生を防止するための障害発生防止処理を実行するステップと、を備える
障害発生防止方法。
(付記11)
前記第1のインタフェースにおける障害、前記第2のインタフェースにおける障害は、それぞれメモリの使用率が基準を超えること又はCPUの使用率が基準を超えることのいずれかである、
付記4ないし6のいずれか一項に記載の分散システム。
(付記12)
前記第1のインタフェースにおける障害は、メモリの使用率が基準を超えること又はCPUの使用率が基準を超えることの一方であり、前記第2のインタフェースにおける障害は、メモリの使用率が基準を超えること又はCPUの使用率が基準を超えることの他方である、
付記11に記載の分散システム。