以下、図1〜図11を用いて本発明の実施形態を説明する。以下では、本発明の実施形態である障害回避処理装置を組み込んだ監視制御装置を例にして説明する。監視制御装置は、例えば、電力プラントに設置される子局装置を監視し、制御する。子局装置は、監視制御装置の制御下、電力量などを調整する。
最初に、図1を用いて、監視制御装置の構成を説明する。図1は、本発明の実施形態である障害回避処理装置を組み込んだ監視制御装置100の概略構成図である。
監視制御装置100は、演算装置1、入力装置2、出力装置3、記憶装置4及び通信装置5、バス6を備える。演算装置1、入力装置2、出力装置3、記憶装置4及び通信装置5は、バス6に接続される。
演算装置1は、CPU(Central Processing Unit)などで構成され、種々の演算を行う。入力装置2は、キーボード、マウスなどで構成され、入力された情報を演算装置1に供給する。出力装置3は、ディスプレイなどで構成され、演算装置1の制御下、種々の情報を表示する。記憶装置4は、HDD(Hard Disk Drive)、メモリなどで構成され、種々の情報を記憶する。通信装置5は、通信インタフェースなどで構成され、演算装置1の制御下、種々の情報を送受信する。通信装置5は、通信ネットワーク300を介して電力プラント200に設置された子局装置201に接続される。
ここで、記憶装置4は、タスク動作状態テーブル40、障害兆候パターンテーブル50、障害判定しきい値テーブル60、障害回避処理インデックステーブル70及びプログラム80を備える。演算装置1は、プログラム80を実行することにより、障害兆候の有無を判定し、障害を回避する。具体的には、演算装置1は、障害の兆候を判定する障害兆候判定処理部10、タスクの動作状態を判定するタスク動作状態判定処理部11、障害を回避する障害回避処理部12、障害兆候パターンを登録する障害兆候パターン登録処理部13として機能する。障害兆候判定処理部10は、タスク動作状態判定処理部11、障害回避処理部12及び障害兆候パターン登録処理部13を含む。演算装置1の動作及び機能の詳細については、図7〜10を用いて後述する。
次に、図2〜図5を用いて、記憶装置4に記憶された各種テーブルの構成を説明する。
図2は、タスク動作状態テーブル40の構成図である。タスク動作状態テーブル40は、実行中のタスクのタスク名(タスク識別子)ごとに、タスクの動作状態を示す複数種類の状態データとして、CPU負荷率、ヒープ使用率及びタスク実行時間を格納する。ここで、CPU負荷率は、単位時間において、実行中のタスクが演算装置1(CPU)を占有している時間の割合を意味する。ヒープ使用率は、OSから割り当てられたヒープメモリに対して、実行中のタスクが使用しているヒープメモリの割合を意味する。タスク実行時間は、演算装置1がタスクの実行を開始してから修了するまでの時間を意味する。タスク動作状態テーブル40は、障害兆候判定処理部10の動作ごとに更新される。なお、図2では、演算装置1がタスクA、タスクB、・・・、タスクNを実行しているときにサンプリングされた、CPU負荷率、ヒープ使用率及びタスク実行時間を例示している。
図3は、障害兆候パターンテーブル50の構成図である。障害兆候パターンテーブル50は、障害を識別するユニークな障害ID(Identifier)ごとに、障害兆候パターン及び障害原因回避率を格納する。ここで、障害兆候パターンは、障害兆候が現れるときのタスクの動作状態を示す複数種類の状態データとして、CPU負荷率、ヒープ使用率及びタスク実行時間を含む。
一方、障害原因回避率は、障害原因が処理渋滞の場合の障害原因回避率、障害原因がヒープメモリの枯渇の場合の障害原因回避率及び障害原因が処理順序違反の場合の障害原因回避率を含む。したがって、障害兆候パターンテーブル50は、障害原因と障害原因回避率を1対1で対応付けて格納することになる。例えば、図3の障害ID=1のレコードでは、障害原因「処理渋滞」と障害原因回避率「40%」が1対1で対応付けて格納される。また、図3の障害ID=1のレコードでは、障害原因「ヒープメモリの枯渇」と障害原因回避率「40%」が1対1で対応付けて格納される。さらに、図3の障害ID=1のレコードでは、障害原因「処理順序違反」と障害原因回避率「20%」が1対1で対応付けて格納される。ここで、障害兆候パターンテーブル50は、1つの障害兆候パターンと、3つの障害原因回避率を対応付けて格納している。したがって、障害兆候パターンテーブル50は、障害兆候パターンと障害原因回避率を1対多で対応付けて記憶することになる。
障害原因回避率は、障害原因に対応する障害回避手段を実行したときに障害の発生が回避される割合を意味する。障害原因回避率は、障害回避手段を実行するたびに更新される。本実施形態では、初期状態において、障害原因回避率はすべて0%であるが、障害回避手段が複数回実行されることにより、図3に示すように、障害原因回避率が更新される。障害原因回避率の更新の詳細については、図10及び図11を用いて後述する。
図4は、障害判定しきい値テーブル60の構成図である。障害判定しきい値テーブル60は、タスク名ごとに、測定頻度変更しきい値及び障害判定しきい値を格納する。ここで、演算装置1は、測定頻度変更しきい値に基づいて、障害兆候の有無を判定する「頻度」を変更する。また、演算装置1は、障害判定しきい値に基づいて、障害兆候の有無を判定する。演算装置1が実行する処理の詳細については、後述する。なお、図4では、タスクA、タスクB、・・・、タスクNごとの測定頻度変更しきい値及び障害判定しきい値を例示している。
図5は、障害回避処理インデックステーブル70の構成図である。障害回避処理インデックステーブル70は、障害原因を識別するユニークな障害原因ID(Identifier)ごとに、障害原因及び障害回避手段を格納する。本実施形態では、障害原因として、処理渋滞、ヒープメモリの枯渇及び処理順序違反が格納される。ここで、処理渋滞はCPU負荷率が高い場合の障害原因である。ヒープメモリの枯渇は、ヒープ使用率が高い場合の障害原因である。処理順序違反は、タスク実行時間が長い場合の障害原因である。
また、本実施形態では、障害回避手段として、優先度変更処理の先頭アドレス、ヒープメモリデフラグ処理の先頭アドレス、後タスク遅延処理の先頭アドレスが格納される。演算装置1は、処理渋滞に起因する障害の兆候があるときに、優先度変更処理を実行することにより、OSが提供しているマクロを呼び出して、CPU負荷率が高いタスクの実行優先順位のレベルを下げる。演算装置1は、ヒープメモリの枯渇に起因する障害の兆候があるときに、ヒープメモリデフラグ処理を実行することにより、解放されなかったヒープメモリを解放して使用可能領域を増やす。演算装置1は、処理順序違反に起因する障害の兆候があるときに、後タスク遅延処理を実行することにより、タスク実行時間が長いタスクの後に実行されるべきタスクの実行タイミングを遅らせて、強制終了を避ける。
障害回避処理インデックステーブル70は、障害原因と障害回避手段を1対1で対応付けて格納する。例えば、図5の障害原因ID=1のレコードでは、障害原因「処理渋滞」と障害回避手段「優先度変更処理の先頭アドレス」が1対1で対応付けて格納される。ここで、図3に示す障害兆候パターンテーブル50は、障害兆候パターンと障害原因回避率を1対多で対応付けてタスク毎に複数格納(記憶)する。また、障害兆候パターンテーブル50は、障害原因と障害原因回避率を1対1で対応付けて格納する。したがって、障害兆候パターンと障害回避手段は1対多でタスク毎に複数記憶されることになる。演算装置1は、障害兆候パターンに対応する障害回避手段のいずれかを実行する。
次に、図6〜図10を用いて、本発明の実施形態である障害回避処理装置を組み込んだ監視制御装置100の動作を説明する。
最初に、図6を用いて、監視制御装置100の演算装置1が障害兆候判定処理を実行するタイミングを説明する。なお、演算装置1は、障害兆候判定処理を実行することにより、障害兆候の有無を判定し、障害を回避する。
図6は、本発明の実施形態である障害回避処理装置を組み込んだ監視制御装置100の演算装置1が障害兆候判定処理の動作タイミングを説明するための図である。なお、図6(A)〜(D)の横軸は時間tを示し、右側に向かって時間が進行する。
図6(A)は、タスクAの動作タイミングを示すタイムチャートである。図6(A)の縦軸は、タスクAの動作のON/OFFを示す。図6(A)の例では、時間t2でタスクAの動作がON(開始)となり、時間t3でタスクAの動作がOFF(終了)となる。
図6(B)は、タスクBの動作タイミングを示すタイムチャートである。図6(B)の縦軸は、タスクBの動作のON/OFFを示す。図6(B)の例では、時間t4でタスクBの動作がON(開始)となり、時間t5でタスクBの動作がOFF(終了)となる。
図6(C)は、障害兆候判定処理の動作タイミングを示すタイムチャートである。図6(C)の縦軸は、障害兆候判定処理の動作のON/OFFを示す。図6(C)の例では、時間t3で障害兆候判定処理の動作がON(開始)となり、時間t31で障害兆候判定処理の動作がOFF(終了)となる。また、時間t5で障害兆候判定処理の動作がON(開始)となり、時間t51で障害兆候判定処理の動作がOFF(終了)となる。
ここで、図6(A)〜図6(C)に示すように、初期状態では、障害兆候判定処理は各タスクの動作が終了するタイミングで実行される。
図6(D)は、障害兆候判定処理を実行する頻度が上昇した場合における、障害兆候判定処理の動作タイミングを示すタイムチャートである。図6(D)の縦軸は、障害兆候判定処理の動作のON/OFFを示す。図6(D)の例では、時間t21で障害兆候判定処理の動作がON(開始)となり、時間t22で障害兆候判定処理の実行がOFF(終了)となる。また、時間t3で障害兆候判定処理の動作がON(開始)となり、時間t31で障害兆候判定処理の動作がOFF(終了)となる。続いて、時間t41で障害兆候判定処理の動作がON(開始)となり、時間t42で障害兆候判定処理の動作がOFF(終了)となる。また、時間t5で障害兆候判定処理の動作がON(開始)となり、時間t51で障害兆候判定処理の動作がOFF(終了)となる。
ここで、演算装置1は、一定の条件を満たした場合、障害兆候判定処理の実行頻度(測定頻度)を上昇させるようになっている。図6(D)の例では、実行頻度が上昇した結果、図6(C)の場合に加え、タスクの実行中において障害兆候判定処理が実行される。ただし、この場合、タスク実行時間は確定していないため、タスク動作状態テーブル40のタスク実行時間は更新されない。なお、図6(D)の例では、タスクAとタスクBにおいて、障害兆候判定処理の実行頻度がともに上昇した場合を示しているが、演算装置1は、タスク毎に障害兆候判定処理の実行頻度を上昇してもよい。
次に、図7を用いて、監視制御装置100の演算装置1(障害兆候判定処理部10)が実行する障害兆候判定処理を説明する。以下、説明を簡単にするため、あるタスクAについて障害兆候判定処理を実行する場合を例にして説明する。
図7は、本発明の実施形態である障害回避処理装置を組み込んだ監視制御装置100の演算装置1が実行する障害兆候判定処理のフローチャートである。障害兆候判定処理は、サブルーチンとして、タスクの動作状態を判定するタスク動作状態判定処理(ステップS1)、障害を回避する障害回処理(ステップS3)、障害兆候パターンを登録する障害兆候パターン登録処理(ステップS4)を含む。
最初に、演算装置1は、タスク動作状態判定処理を呼び出して実行する(ステップS1)。タスク動作状態判定処理では、演算装置1は、タスク動作状態テーブル40と障害兆候パターンテーブル50を比較して、障害判定しきい値テーブル60のしきい値(測定頻度変更しきい値、障害判定しきい値)に基づいて、タスクの動作状態を判定する。タスク動作状態判定処理の詳細については、図8を用いて後述する。
演算装置1は、障害の兆候の有無を判定する(ステップS2)。障害の兆候がないと判定した場合(ステップS2;NO)、演算装置1は、障害兆候判定処理を終了する。
一方、障害の兆候があると判定した場合(ステップS2;YES)、演算装置1は、障害回避処理を呼び出して実行する(ステップS3)。障害回避処理では、演算装置1は、過去の障害回避処理の統計情報に基づいて、障害回避処理インデックステーブル70を使用して障害原因に対応する障害回避手段を実行する。障害回避処理の詳細については、図9を用いて後述する。
続いて、演算装置1は、障害兆候パターン登録処理を呼び出して実行する(ステップS4)。障害兆候パターン登録処理では、演算装置1は、障害回避処理の実行結果から障害兆候パターンテーブル50を更新し、自己学習を行う。障害兆候パターン登録処理の詳細については、図10を用いて後述する。
次に、図8を用いて、監視制御装置100の演算装置1(タスク動作状態判定処理部11)が実行するタスク動作状態判定処理を説明する。図8は、本発明の実施形態である障害回避処理装置を組み込んだ監視制御装置100の演算装置1が実行するタスク動作状態判定処理のフローチャートである。
最初に、演算装置1は、タスク動作状態の測定値(状態データ)をタスク動作状態テーブル40から取得する(ステップS11)。演算装置1は、障害兆候パターンを障害兆候パターンテーブル50から取得する(ステップS12)。演算装置1は、ステップS11で取得したタスク動作状態の測定値とステップS12で取得した障害兆候パターンとを比較する(ステップS13)。
演算装置1は、比較結果から次の式(1)を用いて障害兆候パターンの一致率(P)を算出する(ステップS14)。ここで、タスク動作状態テーブル40のCPU負荷率、ヒープ使用率、タスク実行時間をそれぞれ、a1、b1、c1とし、障害兆候パターンテーブル50のCPU負荷率、ヒープ使用率、タスク実行時間をそれぞれ、a2、b2、c2とする。
ここで、ステップS11〜ステップS14までの動作を、図2に示すタスク動作状態テーブル40及び図3に示す障害兆候パターンテーブル50を用いて具体的に説明する。以下では、説明を簡単にするため、演算装置1が、タスクAについてタスク動作状態判定処理を実行する場合を例にして説明する。
演算装置1は、タスク動作状態テーブル40のタスク名=タスクAのレコードを参照し、タスク動作状態の測定値として、CPU負荷率=30%、ヒープ使用率=20%及びタスク実行時間20msを取得する(ステップS11)。
演算装置1は、障害兆候パターンテーブル50の障害ID=1のレコードを参照し、障害兆候パターンを取得する(ステップS12)。このとき取得された障害兆候パターンは、CPU負荷率=70%、ヒープ使用率=40%、タスク実行時間=200msを含む。
演算装置1は、ステップS11で取得したタスク動作状態の測定値とステップS12で取得した障害兆候パターンとを比較する(ステップS13)。
演算装置1は、比較結果から式(1)を用いて障害兆候パターンの一致率(P)を算出する(ステップS14)。具体的な数値を当てはめると、a1=30%、b1=20%、c1=20ms、a2=70%、b2=40%、c2=200msであり、P=0.278となる。
ただし、タスク動作状態テーブル40及び障害兆候パターンテーブル50のCPU負荷率、ヒープ使用率、タスク実行時間のいずれか1つが0又はN/A(Not Applicable)である場合、残りの2項目の相乗平均を一致率とする。
例えば、図3に示す障害兆候パターンテーブル50の障害ID=2のレコードでは、タスク実行時間がN/Aであり、P=sqrt((a1/a2)×(b1/b2))となる。具体的な数値を当てはめると、a1=30%、b1=20%、a2=40%、b2=80%であり、P=0.433となる。なお、sqrt(x)はxの平方根を戻り値とする関数である。
また、タスク動作状態テーブル40及び障害兆候パターンテーブル50のCPU負荷率、ヒープ使用率、タスク実行時間のいずれか2つが0又はN/A(Not Applicable)である場合、残りの1項目の値を一致率とする。
例えば、図3に示す障害兆候パターンテーブル50の障害ID=3のレコードでは、CPU負荷率及びヒープ使用率がN/Aであり、P=c1/c2となる。具体的な数値を当てはめると、c1=20ms、c2=100msであり、P=0.2となる。
図8に戻り、演算装置1は、すべての障害兆候パターンと比較したか否かを判定する(ステップS15)。演算装置1は、すべての障害兆候パターンと比較していないと判定した場合(ステップS15;NO)、ステップS12に処理を戻す。
一方、演算装置1は、すべての障害兆候パターンと比較したと判定した場合(ステップS15;YES)、ステップS14で算出した一致率の最大値を求める(ステップS16)。
ここで、ステップS16の動作を、図2に示すタスク動作状態テーブル40のタスク名=タスクAのレコード及び図3に示す障害兆候パターンテーブル50の障害ID=1,2,3のレコードを用いて具体的に説明する。なお、説明を簡単にするため、障害兆候パターンテーブル50は、障害ID=1,2,3のレコードのみ格納していると仮定する。
障害ID=1,2,3の障害兆候パターンに対して、ステップS14において算出した一致率(P)は、前述したように、それぞれ、0.278、0.433、0.2となる。したがって、演算装置1は、一致率の最大値として、0.433を特定する(求める)。
図8に戻り、演算装置1は、ステップS16で算出した一致率の最大値が障害判定しきい値テーブル60の測定頻度変更しきい値よりも小さいか否かを判定する(ステップS17)。ここで、測定頻度変更しきい値は、図7に示す障害兆候判定処理を実行する頻度を上昇するか否かを判定するしきい値である。
一致率の最大値が測定頻度変更しきい値よりも小さいと判定した場合(ステップS17;YES)、演算装置1は、障害兆候判定処理の実行頻度をタスク毎に設定し(ステップS18)、呼び出し元の障害兆候判定処理にリターンする。具体的には、演算装置1は、障害兆候判定処理をタスクの実行終了時に1回のみ実行するように実行頻度を設定して、呼び出し元の障害兆候判定処理にリターンする。
例えば、ステップS16で示したケースでは、一致率の最大値が0.43(43%)であり、図4に示す障害判定しきい値テーブル60では、タスクAについて、測定頻度変更しきい値、障害判定しきい値は、それぞれ、80%、90%である。この場合、演算装置1は、一致率(P)の最大値「43%」が測定頻度変更しきい値「80%」より小さいと判定し(ステップS17;YES)、ステップS18の処理によりタスクAについて障害兆候判定処理の実行頻度をタスクの実行終了時に1回のみ実行するように実行頻度を設定する。
ここで、演算装置1は、例えば、一致率(P)の最大値が測定頻度変更しきい値以上であり(ステップS17;NO)、且つ、障害判定しきい値以下であると判定した場合に(ステップS19;NO)、すべてのタスクについて障害兆候判定処理の実行頻度を上昇する(ステップS20で後述する)。しかし、一致率(P)が測定頻度変更しきい値より小さいと判定した場合(ステップS17;YES)、演算装置1は、ステップS18の処理によりタスクAについて障害兆候判定処理の実行頻度を元に戻すことになる。一方、演算装置1は、すべてのタスクについて障害兆候判定処理の実行頻度を上昇していない場合も、ステップS18の処理によりタスクAの実行頻度を元に戻す。この場合、実質的に、実行頻度に変化はない。これにより、CPUの負荷を抑制することができる。
一方、演算装置1は、一致率の最大値が測定頻度変更しきい値以上であると判定した場合(ステップS17;NO)、一致率の最大値が障害判定しきい値テーブル60の障害判定しきい値よりも大きいか否かを判定する(ステップS19)。ここで、障害判定しきい値は、障害の兆候の有無を判定するしきい値である。
一致率の最大値が障害判定しきい値以下であると判定した場合(ステップS19;NO)、演算装置1は、すべてのタスクについて障害兆候判定処理の実行頻度を上昇し(ステップS20)、呼び出し元の障害兆候判定処理にリターンする。具体的には、例えば、図6(D)で説明したように、実行頻度を上昇する。この場合、1つのタスクに対して障害兆候判定処理が実行される回数は2回となる。これにより、障害が発生する前に障害を回避する可能性が高まる。なお、ステップS20において、すでに障害兆候判定処理の実行頻度が上昇している場合は、演算装置1はその実行頻度をさらに上昇させることはない。この場合、ステップS20の前後で実行頻度は変化しない。
ステップS19において、一致率の最大値が障害判定しきい値よりも大きいと判定した場合(ステップS19;YES)、すなわち、障害の兆候があると判定した場合、呼び出し元の障害兆候判定処理にリターンする。なお、この場合、図7に示す障害兆候判定処理において、障害の兆候があるため、ステップS2でYESとなり、障害回避処理が実行される(ステップS3)。
次に、図9を用いて、監視制御装置100の演算装置1(障害回避処理部12)が実行する障害回避処理を説明する。図9は、本発明の実施形態である障害回避処理装置を組み込んだ監視制御装置100の演算装置1が実行する障害回避処理のフローチャートである。
最初に、演算装置1は、障害兆候パターンテーブル50から一致率が最大値となる障害兆候パターンを取得する(ステップS21)。なお、一致率の最大値は、図8のステップS16で算出されたものである。演算装置1は、取得した障害兆候パターンに対応する障害原因回避率の中から最大値を求める(ステップS22)。
例えば、図3に示す障害兆候パターンテーブル50において、障害ID=2のレコードの障害兆候パターンの一致率(P)が最大値であったと仮定する。この場合、演算装置1は、障害ID=2のレコードの障害兆候パターンを取得する(ステップS21)。障害ID=2のレコードにおいて、取得した障害兆候パターンに対応する障害原因は「処理渋滞」、「ヒープメモリの枯渇」、「処理順序違反」の3つある。また、障害原因「処理渋滞」に対応する障害原因回避率は40%であり、障害原因「ヒープメモリの枯渇」に対応する障害原因回避率は60%であり、障害原因「処理順序違反」に対応する障害原因回避率は、0%である。したがって、演算装置1は、取得した障害兆候パターンに対応する障害原因回避率の中から障害原因回避率の最大値として、60%を特定する(求める)。
図9に戻り、演算装置1は、障害原因回避率の中に、最大値が同じものがないか否か判定する(ステップS23)。
演算装置1は、障害原因回避率の中に、最大値が同じものがあると判定した場合(ステップS23;NO)、状態データごとの一致率を算出し、最大値を求める(ステップS24)。具体的には、演算装置1は、次の式(2)〜式(4)を用いて、状態データごとの一致率として、CPU負荷率の一致率(X)、ヒープ使用率の一致率(Y)、タスク実行時間の一致率(Z)を個別に算出し、その中から最大値を求める。ここで、a1、b1、c1、a2、b2、c2は、式(1)で用いたものと同一である。CPU負荷率の一致率(X)は、障害兆候パターンテーブル50のヒープ使用率及びタスク実行時間がN/Aである場合の障害兆候パターンの一致率(P)に該当する。また、ヒープ使用率の一致率(Y)は、障害兆候パターンテーブル50のCPU負荷率及びタスク実行時間がN/Aである場合の障害兆候パターンの一致率(P)に該当する。さらに、タスク実行時間の一致率(Z)は、障害兆候パターンテーブル50のCPU負荷率及びヒープ使用率がN/Aである場合の障害兆候パターンの一致率(P)に該当する。
演算装置1は、ステップS25に処理を進め、状態データごとの一致率が最大値となる障害原因に対応する障害回避手段の先頭アドレスを障害回避処理インデックステーブル70から取得する(ステップS25)。
例えば、図3に示す障害兆候パターンテーブル50において、障害ID=1のレコードの障害兆候パターンの一致率(P)が最大値であったと仮定する。この場合、演算装置1は、障害ID=1のレコードの障害兆候パターンを取得する(ステップS21)。障害ID=1のレコードにおいて、障害原因「処理渋滞」に対応する障害原因回避率は40%であり、障害原因「ヒープメモリの枯渇」に対応する障害原因回避率は40%であり、障害原因「処理順序違反」に対応する障害原因回避率は20%である。したがって、障害原因回避率の最大値は40%であるが、障害原因回避率が40%となるものは2つある。このため、演算装置1は、障害原因回避率の最大値に対応する障害原因を特定し、特定した障害原因に対応する障害回避手段を1つだけに特定することができない。そこで、演算装置1は、次のようにして障害回避手段を1つだけに特定する。
演算装置1は、障害原因回避率の中に、最大値が同じものがあると判定する(ステップS23;NO)。続いて、演算装置1は、状態データごとの一致率を算出し、最大値を求める(ステップS24)。具体的には、a1=30%、b1=20%、c1=20ms、a2=70%、b2=40%、c2=200msであり、X=0.429、Y=0.5、Z=0.1となる。演算装置1は、状態データごとの一致率(X,Y,Z)の中から最大値として、Y=0.5を求める(ステップS24)。
ここで、演算装置1は、CPU負荷率の一致率(X)が最大値となる場合、障害回避処理インデックステーブル70から障害原因「処理渋滞」に対応する障害回避手段「優先度変更処理」の先頭アドレスを取得する。演算装置1は、ヒープ使用率の一致率(Y)が最大値となる場合、障害回避処理インデックステーブル70から障害原因「ヒープメモリの枯渇」に対応する障害回避手段「ヒープメモリデフラグ処理」の先頭アドレスを取得する。演算装置1は、タスク実行時間の一致率(Z)が最大値となる場合、障害回避処理インデックステーブル70から障害原因「処理順序違反」に対応する障害回避手段「後タスク遅延処理」の先頭アドレスを取得する。
上記の例では、ヒープ使用率の一致率(Y)が最大値となるため、演算装置1は、障害回避処理インデックステーブル70から障害原因「ヒープメモリの枯渇」に対応する障害回避手段「ヒープメモリデフラグ処理」の先頭アドレスを取得する(ステップS25)。
図9に戻り、ステップS23において、障害原因回避率の中に、最大値が同じものがないと判定した場合(ステップS23;YES)、演算装置1は、障害原因回避率の最大値に対応する障害原因を特定し、特定した障害原因に対応する障害回避手段の先頭アドレスを障害回避処理インデックステーブル70から取得する(ステップS25)。
例えば、図3に示す障害兆候パターンテーブル50において、障害ID=2のレコードの障害兆候パターンの一致率(P)が最大値であったと仮定する。この場合、演算装置1は、障害ID=2のレコードの障害兆候パターンを取得する(ステップS21)。処理ID=2のレコードにおいて、障害原因「処理渋滞」に対応する障害原因回避率は40%であり、障害原因「ヒープメモリの枯渇」に対応する障害原因回避率は60%であり、障害原因「処理順序違反」に対応する障害原因回避率は0%である。演算装置1は、障害原因回避率の最大値「60%」に対応する障害原因「ヒープメモリの枯渇」を特定し、特定した障害原因「ヒープメモリの枯渇」に対応する障害回避手段「ヒープメモリデフラグ処理」の先頭アドレスを障害回避処理インデックステーブル70から取得する(ステップS25)。
図9に戻り、演算装置1は、取得した先頭アドレスにおいて定義される障害回避手段を実行し(ステップS26)、呼び出し元の障害兆候判定処理にリターンする。なお、この後、図7に示す障害兆候判定処理において、障害兆候パターン登録処理が実行される(ステップS4)。これにより、統計上、最も有効な障害回避手段を実行することができるので、障害の発生を的確に抑制することができる。
次に、図10を用いて、監視制御装置100の演算装置1(障害兆候パターン登録処理部13)が実行する障害兆候パターン登録処理を説明する。図10は、本発明の実施形態である障害回避処理装置を組み込んだ監視制御装置100の演算装置1が実行する障害兆候パターン登録処理のフローチャートである。ここで、障害兆候パターン登録処理が実行される要因は2つある。1つ目は、障害兆候判定処理の中でサブルーチンとして呼び出されて実行される場合であり、2つ目は、タスクが障害の発生により強制終了した際に、OSから実行される場合である。2つ目のケースでは、新規の障害兆候パターンが障害兆候パターンテーブル50に登録される。例えば、強制終了したときのCPU使用率、ヒープ使用率、タスク実行時間がそれぞれ、70%、20%、N/Aの場合、演算装置1は、障害兆候パターン登録処理がOSから実行されることにより、これらの状態データで構成される障害兆候パターンを新規の障害兆候パターンとして登録する。なお、この障害兆候パターンに対応する障害原因回避率はすべて0%となる。
最初に、演算装置1は、障害が回避されたか否かを判定する(ステップS31)。障害が回避されたと判定した場合(ステップS31;YES)、演算装置1は、次の式(5)を用いて、対象障害原因回避率(Q)を設定し(ステップS37)、ステップS35に処理を進める。
ここで、k、Nは、それぞれ対象障害原因復帰成功回数、障害回避手段実行回数である。対象障害原因回避率(Q)は、障害回避手段が実行された障害原因に対する障害原因回避率を意味する。ステップS37により、Qは増加する。これは、この障害原因回避率の障害原因に対応する障害回避手段を実行することにより、障害が回避されたことから、この障害回避手段が有効であることを示す。
一方、障害が回避されないと判定した場合(ステップS31;NO)、演算装置1は、タスク動作状態判定処理を実行済であるか否かを判定する(ステップS32)。タスク動作状態判定処理を実行済でないと判定した場合(ステップS32;NO)、すなわち、タスクが強制終了し、障害兆候パターン登録処理がOSから実行された場合、演算装置1は、強制終了したときの状態データを新規の障害兆候パターンとして、障害兆候パターンテーブル50に登録し(ステップS33)、呼び出し元(OS)にリターンする。
ステップS32において、タスク動作状態判定処理を実行済であると判定した場合(ステップS32;YES)、演算装置1は、次の式(6)を用いて、対象障害原因回避率(Q)を設定する(ステップS34)。ここで、k、Nは式(5)で用いたものと同一である。
ここで、ステップS34により、Qは減少する。これは、この障害原因回避率の障害原因に対応する障害回避手段を実行することにより、障害が回避されなかったことから、この障害回避手段が有効でないことを示す。
続いて、演算装置1は、次の式(7)を用いて、対象外障害原因回避率(R)を設定する(ステップS35)。ここで、mは、対象外障害原因復帰回数である。Nは式(5)で用いたものと同一である。対象外障害原因回避率(R)は、障害回避手段が実行されなかった障害原因に対する障害原因回避率を意味する。
例えば、「処理渋滞」に対応する障害回避手段を実行したにもかかわらず、障害が発生した場合、演算装置1は、「ヒープメモリの枯渇」の障害原因回避率を、式(7)を用いて算出した値に設定する。
ここで、ステップS34により、対象外障害原因に対応する障害回避手段が実行されなかったにもかかわらず、Rが減少する。これは、この障害回避手段が有効でないことを示すことにもなるが、式6のQの方がRより小さくなる。したがって、相対的には、図8のステップS16において、この対象外障害原因回避率(R)が最大値となる可能性は式6の対象障害原因回避率(Q)より大きくなる。
演算装置1は、ステップS35を他の障害原因にも適用し、障害兆候パターンテーブル50を更新し(ステップS36)、呼び出し元の障害兆候判定処理にリターンする。上記ステップS35で説明した例では、演算装置1は、「処理順序違反」の障害原因回避率を、式(7)を用いて算出した値に設定する。これにより、障害兆候パターンテーブル50の障害原因回避率が更新され、演算装置1は有効な障害回避手段を自己学習することができる。なお、ステップS37〜ステップS36によって更新された障害原因回避率の合計は100%となる。これについては、図10及び図11を用いて後述する。
次に、図10及び図11を用いて、障害兆候パターン登録処理によって障害兆候パターンテーブル50の障害原因回避率がどのように更新されるかを説明する。図11は、あるタイミングにおいて障害兆候パターン登録処理を実行する前の障害兆候パターンテーブル50Aと障害兆候パターン登録処理を実行した後の障害兆候パターンテーブル50Bの一例を示す図である。
ここで、図11に示すように、障害兆候パターンテーブル50Aの障害ID=1のレコードにおいて、障害原因「障害渋滞」に対応する障害原因回避率をx1/100、障害原因「ヒープメモリの枯渇」に対応する障害原因回避率をy1/100、障害原因「処理順序違反」に対応する障害原因回避率をz1とし、障害回避手段実行回数=100であるとする。また、x1+y1+z1=100とする。
一方、障害兆候パターンテーブル50Bの障害ID=1のレコードにおいて、障害原因「障害渋滞」に対応する障害原因回避率をR1、障害原因「ヒープメモリの枯渇」に対応する障害原因回避率をQ、障害原因「処理順序違反」に対応する障害原因回避率をR2とする。以下、障害原因「ヒープメモリの枯渇」に対応する障害原因回避手段を実行した場合を例にして、障害が回避された場合と障害が回避されなかった場合に分けて説明する。
(障害が回避された場合)
障害が回避された場合、図10のステップS37により、Q=(y1+1)/(100+1)、ステップS35により、R1=x1/(100+1)、ステップS36により、R2=z1/(100+1)となる。したがって、R1+Q+R2=(x1+y1+z1+1)/101となる。x1+y1+z1=100であるから、R1+Q+R2=101/101=100%となる。
(障害が回避されなかった場合)
障害が回避されなかった場合、図10のステップS34により、Q=(y1−1)/(100+1)、ステップS35により、R1=x1/(100+1)、ステップS36により、R2=z1/(100+1)となる。したがって、R1+Q+R2=(x1+y1+z1−1)/101となる。x1+y1+z1=100であるから、R1+Q+R2=99/101=98%となる。
以上、説明したように、演算装置1は、タスク動作状態の測定値との一致率が高い障害兆候パターンに対応する障害回避手段を実行する。このため、障害発生の兆候を事前に検知して障害を防止することができる。
また、障害の兆候がある程度認められると判定した場合、演算装置1は、障害兆候判定処理の実行頻度を上昇する。このため、障害が発生する前に障害を回避する可能性が高まる。
さらに、演算装置1は、障害原因回避率の最大値に対応する障害原因を特定し、特定した障害原因に対応する障害回避手段を実行する。このため、統計上、最も有効な障害回避手段を実行することができ、障害の発生を的確に抑制することができる。
また、新しい障害兆候パターンが登録されることにより、或いは、障害回避手段が実行されることにより、統計情報が蓄積される。このため、演算装置1は有効な障害回避手段を自己学習することができる。これにより、システムの動作時間が経過するにつれてシステムの信頼性の向上が期待できる。
なお、従来、CPU負荷率以外の原因による障害兆候を検知できないという課題があった。本実施形態によれば、障害兆候の検知の際に、CPU負荷率だけでなく、ヒープ使用率、タスク実行時間を監視するので、障害兆候を広く検知することができる。
また、従来、どのタスクが問題となっているかを特定し、検知した障害兆候に応じた障害回避手段を実行し、障害の発生を回避することができないという課題があった。本実施形態によれば、それぞれのタスクの実行が終了するタイミングで、障害兆候判定処理が実行される。したがって、どのタスクが問題となっているかを特定し、検知した障害兆候に応じた障害回避手段を実行し、障害の発生を回避することができる。
なお、本発明は上記記載した実施例に限定されるものではなく、様々な変形例が含まれる。例えば、上記した実施例は本発明を分かりやすく説明するために詳細に説明したものであり、必ずしも説明した全ての構成を備えるものに限定されるものではない。また、ある実施例の構成の一部を他の実施例の構成に置き換えることが可能であり、またある実施例の構成に他の実施例の構成を加えることも可能である。
上記実施形態では、タスク動作状態テーブル40は、状態データとして、CPU負荷率、ヒープ使用率及びタスク実行時間を格納するが、状態データの種類及び数は任意である。
上記実施形態では、障害兆候パターンテーブル50は、障害兆候が現れるときの状態データとして、CPU負荷率、ヒープ使用率及びタスク実行時間を含むが、状態データの種類及び数は任意である。ただし、状態データの種類及び数は、タスク動作状態テーブル40と障害兆候パターンテーブル50において同じである必要がある。
上記実施形態では、障害兆候判定処理の実行頻度を上昇すると、1つのタスクに対して2回、障害兆候判定処理が実行されるが、実行回数は任意である。また、障害兆候判定処理が実行されるタイミングも任意である。