JP2014182561A - 計算機システム、プロセス及びスレッドの監視方法 - Google Patents

計算機システム、プロセス及びスレッドの監視方法 Download PDF

Info

Publication number
JP2014182561A
JP2014182561A JP2013056258A JP2013056258A JP2014182561A JP 2014182561 A JP2014182561 A JP 2014182561A JP 2013056258 A JP2013056258 A JP 2013056258A JP 2013056258 A JP2013056258 A JP 2013056258A JP 2014182561 A JP2014182561 A JP 2014182561A
Authority
JP
Japan
Prior art keywords
monitoring
thread
function
call
hook
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Ceased
Application number
JP2013056258A
Other languages
English (en)
Inventor
Takashi Norimatsu
隆志 乗松
Toku Tsukada
徳 塚田
Isao Konno
功 今野
Josuke Matsuki
譲介 松木
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Hitachi Ltd
Original Assignee
Hitachi Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Hitachi Ltd filed Critical Hitachi Ltd
Priority to JP2013056258A priority Critical patent/JP2014182561A/ja
Publication of JP2014182561A publication Critical patent/JP2014182561A/ja
Ceased legal-status Critical Current

Links

Images

Landscapes

  • Debugging And Monitoring (AREA)

Abstract

【課題】ソースコードの変更や再コンパイルを行わずに誤ってスレッドを異常と判定する可能性を低減させる。
【解決手段】プロセスを構成する1以上のスレッドを実行する計算機システムで、前記プロセスは、第1のプロセスと、第1のプロセスを監視する監視プロセスと、第1のプロセスの監視条件を設定する監視設定部と、を含み、第1のプロセスは、第1のプロセスの処理を実行する第1のスレッドと、第1のスレッドを監視する監視スレッドと、第1のスレッドがライブラリから所定の関数を呼び出すと所定の処理を実行する関数フック部と、を含み、関数フック部は、第1のスレッドが、ライブラリから所定のフック対象関数を呼び出したときには、第1のスレッドの正常状態を示す第1の生存情報を更新し、監視スレッドは、第1の生存情報が更新されていない場合には、第1のスレッドに異常が発生したことを示す異常スレッド情報を記憶部に書き込む。
【選択図】図2

Description

本発明は、プロセスとスレッドの監視を行う計算機システムに関する。
高信頼性を要求される計算機システムは、システムを構成するプロセス及びスレッドが障害を起こした場合でも、システム全体を止めずに、縮退運転を行い、提供するサービスを継続する必要がある。従って、このような計算機システムは、プロセス及びスレッドが正常に稼働しているかを監視し、プロセス及びスレッドが異常な状態に陥った場合は、この異常を検出する必要がある。この異常の検出機能を、死活監視機能と呼ぶ。
ここで、プロセスとはプログラムの実行単位である。プロセスは、プログラム内で利用される変数と状態を保持し、一つ以上のスレッドから構成される。
ここで、スレッドとはプログラムが含む処理の実行単位である。OS(Operating System)が、各スレッドにCPU(Central Processing Unit)時間(またはタイムスライス時間)を割り当てる。
スレッドの死活監視方法の一つとして特許文献1に記載の方法は、スレッドを監視するという特別な役割を持った監視スレッドが、他のスレッドに対して、正常に稼働しているか否かを、指定された監視周期で周期的に問い合わせ、スレッドはこの問い合わせに対して応答するというものである。
また、近年、計算機システムに占めるソフトウェアの割合と規模が拡大し、システムに占めるOSやサードパーティ製など外部調達するソフトウェアの割合が増加している。
自社開発のプログラムには、ソースコードを修正することにより、死活監視機能を実装することができるが、ソースコードがないプログラム、あるいはソースコードがあってもライセンス条項等の理由からソースコードを修正することが出来ないプログラムには、死活監視機能を実装できない。こういったプログラムに当てはまるのは、前記の外部調達するソフトウェアである。従って、計算機システムの信頼性を上げるには、このようなプログラムのプロセス及びスレッドに対しても死活監視機能を適用しなければならない。然しながら、特許文献1に記載の方法のように、ソースコードの修正が必要な死活監視方式ではこの問題を解決できない。
この問題を解決する技術として、特許文献2に記載の、スレッドの異常状態を引き起こす一つの原因であるデッドロックを検知する方法がある。これは、排他制御を行うためのリソース占有(ロック)及びリソース解放(アンロック命令)を行う関数をフック(関数フック)し、排他制御の情報を取得する処理を実行し、本来行うべきロック及びアンロック命令を実行する。そして、取得した排他制御情報を基に、スレッド間のデッドロックを検出するものである。
ここでデッドロックとは、複数のプロセスまたはスレッドがリソースを共有する場合に、お互いがお互いの取得したリソースの解放を待つ状況に陥り、双方のスレッドの処理が進まないことを意味する。
ここで関数フックとは、任意の関数が呼び出されたとき、その関数の呼び出し前に、前記の処理とは別な処理を行う関数を呼び出し、この処理を実施することを意味する。
また、特許文献2で記載の関数フックを利用し、特許文献1に記載の死活監視方法を実施することができる。この場合、特許文献1が抱える問題(ソースコードの修正が必要であること)を解決することができる。解決例として、スレッドが特定の関数を実行した際に、関数フックを実行し、スレッドが正常に稼働していることを監視スレッドに伝える生存報告処理を行う方法が考えられる。この方法によれば、スレッドのソースコードに、生存報告処理を行う命令を記述する必要がなくなる。
特開平11−232143号公報 特開2009−271858号公報
前述の特許文献1には以下の問題点が存在する。
特許文献1における第一の問題点は、死活監視の対象となるプログラムのソースコードを修正しなければならないため、ソースコードが入手できないプログラムに適用できないことである。
特許文献1における第二の問題点は、監視対象のスレッドが大量の処理を行わなければならない状態に陥った場合、監視スレッドが発行する周期的に問い合わせに応答ができず、監視スレッドが、そのスレッドを誤って異常と判定する場合があることである。
特許文献2に記載の関数フックを利用し、特許文献1に記載の死活監視方法を実行する場合に以下の三つの問題点が存在する。
第一の問題点は、スレッドがいつ関数フック対象の関数を呼び出すかが予め分からず、監視スレッドの監視周期内にスレッドが生存報告処理を行えず、監視スレッドが誤って前記スレッドを異常と判定される場合があることである。
監視スレッドが、予め指定された監視周期内に、スレッドが生存報告を行わない場合、そのスレッドを異常と判定する。スレッドは、関数フックの対象とした関数(以後、フック対象関数)を呼び出した際、生存報告処理をする。
ソースコードが入手できないプログラムの場合、スレッドのソースコードにはどのような命令が記述されているか不明であり、従って、いつ生存報告がなされるかが不明である。よって、監視周期内に生存報告を行わない場合があった。
ソースコードが入手できるプログラムの場合、スレッドのソースコードに記述された関数から、関数フック対象にする関数を選択することができる。しかしながら、指定された監視周期内に必ず選択した関数を実行する保証がない。よって、監視周期内に生存報告を行わない場合があった。
第二点の問題点は、スレッドがいつ関数フック対象の関数を呼び出すかが予め分からず、一定時間内に関数呼出しが集中し、それらの呼出しに伴う関数フック処理と生存報告の処理の分、関数の応答が遅延し、CPU時間を消費してしまうことであった。従って、計算機システムが提供するサービスの性能の劣化を招く恐れがある。
監視スレッドが、予め指定された監視周期内に、スレッドが生存報告を一回でも行えば、そのスレッドを正常と判定する。
ソースコードが入手できないプログラムの場合、スレッドのソースコードにはどのような命令が記述されているか不明であり、従って、いつ生存報告がなされるかが不明である。よって、監視周期内に関数フック対象の関数を大量に呼び出す場合があり、本来一回行えば十分である生存報告処理を大量に行う場合があった。
ソースコードが入手できるプログラムの場合、スレッドのソースコードに記述された関数から、フック対象関数を選択することができる。しかしながら、指定された監視周期内に必ず選択した関数を実行する保証がない。よって、監視周期内にフック対象関数を大量に呼び出す場合があり、本来一回行えば十分である生存報告処理を大量に行う場合がある。このため、計算機システムの処理能力を浪費する恐れがあった。
第三点の問題点は、システムの稼働状態の変化に伴い、スレッドによる関数の呼び出しパターンが変化した場合、その変化に応じて死活監視の設定(フック対象関数と監視周期)を変えられないことであった。
フック対象関数の呼び出し頻度が下がった場合、前述の第一の問題点にあるように、スレッドが誤って異常と判定されることがある。フック対象関数の呼び出し頻度が上がった場合、前述の第二の問題点にあるように、システムのサービスの性能劣化を招くことがあった。
従って、本発明の目的は前述の六点の問題点を解決する方法を提供することである。
具体的には、本発明の目的は、OSのカーネルの変更や、ソースコードの変更及び再コンパイルを行わず、計算機システムの稼働状態の変化に対応し、誤ってスレッドを異常と判定する可能性を低減させ、かつCPU時間の消費が低い死活監視方法を提供することにある。
本発明は、1以上のプロセスと、前記プロセスを構成する1以上のスレッドを実行する計算機システムであって、前記計算機システムは、前記プロセス、スレッド及びライブラリを保持する記憶部と、前記プロセス及びスレッドを実行する1以上のプロセッサと、を備え、前記ライブラリは、前記スレッドが呼び出す関数を有し、前記プロセスは、第1のプロセスと、前記第1のプロセスを監視する監視プロセスと、前記第1のプロセスの監視条件を設定する監視設定部と、を含み、前記第1のプロセスは、前記第1のプロセスの処理を実行する1以上の第1のスレッドと、前記第1のスレッドを監視する監視スレッドと、前記第1のスレッドが前記ライブラリから所定の関数を呼び出すと、当該関数をフックして所定の処理を実行する関数フック部と、を含み、前記監視設定部は、前記関数フック部に、前記第1のスレッドが前記ライブラリから呼び出す関数の内、前記フックする対象の関数をフック対象関数として設定し、前記関数フック部は、前記第1のスレッドが、前記ライブラリから前記フック対象関数を呼び出したときには、前記記憶部に保持されて前記第1のスレッドが正常であることを示す第1の生存情報を更新し、前記監視スレッドは、第1の監視周期となるたびに、前記記憶部に保持されて前記第1のプロセスが正常であることを示す第2の生存情報を更新し、前記第1の監視周期となるたびに、前記記憶部から前記第1の生存情報を読み込んで、前記生存情報が更新されたか否かを判定し、前記生存情報が更新されていない場合には、前記第1のスレッドに異常が発生したことを示す異常スレッド情報を前記記憶部に書き込み、前記監視プロセスは、第2の監視周期となるたびに、前記記憶部から前記第2の生存情報を読み込んで、前記生存情報が更新されたか否かを判定し、前記生存情報が更新されていない場合には、前記第1のプロセスに異常が発生したことを判定し、前記第2の監視周期となるたびに、前記記憶部から異常スレッド情報を読み込んで、異常スレッド情報の有無を判定し、異常スレッド情報が存在する場合には、前記第1のスレッドに異常が発生した情報を出力する。
本発明によれば、関数フックを利用した第1のスレッドの生存情報により、ソースコードの有無にかかわらず、第1のスレッドに対する死活監視が可能になり、かつ第1のスレッドの異常を、計算機システムの性能劣化を招くことなく、高い確率で検出することが可能になる。また、計算機システムの稼働状態の変化により、フック対象関数の呼出パターンが変化した場合にも、計算機システムを停止させることなく、フック対象関数と第1の監視周期を再計算してプロセス及びスレッドの監視を継続できる。
本発明の第一の実施例を示し、計算機システムのハードウェア構成を示すブロック図である。 本発明の第一の実施例を示し、プロセス及びスレッドの死活監視方法の概要を示す説明図である。 本発明の第一の実施例を示し、監視プロセスが保持するプロセス監視設定情報の一例を示す説明図である。 本発明の第一の実施例を示し、プロセスが共有するプロセス・スレッド監視情報及び異常スレッド情報の一例を示す説明図である。 本発明の第一の実施例を示し、監視スレッドが保持するスレッド監視設定情報の一例を示す説明図である。 本発明の第一の実施例を示し、スレッドが共有するスレッド監視情報の一例を示す説明図である。 本発明の第一の実施例を示し、プロセス及びスレッドの監視処理のシーケンス図である。 本発明の第一の実施例を示し、スレッドの異常判定と、監視プロセスへの状態通知、監視プロセスへの生存報告の処理の一例を示すフローチャートである。 本発明の第一の実施例を示し、プロセスの異常判定と、異常スレッドの状態取得処理の一例を示すフローチャートである。 本発明の第一の実施例を示し、関数フック処理のソフトウェア構成の一例を示すブロック図である。 本発明の第一の実施例を示し、関数呼出統計情報の一例を示す説明図である。 従来例を示し、関数フックを利用した死活監視方法において、誤検出の発生を示す説明図である。 従来例を示し、関数フックを利用した死活監視方法において、生存報告の多重実行を示す説明図である。 本発明の第一の実施例を示し、関数フック対象集合の決定方法を示す説明図である。 本発明の第一の実施例を示し、関数フック対象集合を決定する基準である呼出確率の確率密度の一例を示すグラフである。 本発明の第一の実施例を示し、関数フック対象集合と監視周期を決定する処理の一例を示すフローチャートである。 本発明の第二の実施例を示し、関数フック処理のソフトウェア構成の一例を示すブロック図である。 本発明の第二の実施例を示し、関数フック対象集合の呼出頻度の増加の検知を示す説明図である。 本発明の第二の実施例を示し、関数フック対象集合の呼出頻度の減少の検知を示す説明図である。 本発明の第二の実施例を示し、関数フック対象集合の呼出頻度の振動の検知を示す説明図である。 本発明の第二の実施例を示し 関数呼出変化検知の処理の一例を示すフローチャートである。
以下、本発明の一実施例を添付図面に基づいて説明する。
第一の実施例では、プロセス及びスレッドが正常に稼働しているか否かを監視する装置として、通信システムを構成するゲートウェイの機能を有する計算機を例に説明する。
なお、本実施例における関数フック処理とは、任意のライブラリとして提供される関数に対し、ライブラリの利用者が独自の処理を追加または関数本来の処理内容を変更することである。また、ライブラリとは、特定の処理及び機能を行うための再利用可能なプログラムを含む、データの集まりである。プロセス及びスレッドとは、計算機による処理の分割単位である。計算機による実行主体はスレッドである。計算機が実施する処理であるタスクは、複数の単位(プロセス)に分割され、プロセスを構成するスレッドにより実行される。なお、プロセスは、少なくとも一つ以上のスレッドから構成される。
図1は、本発明を適用する計算機システム10のハードウェア構成を示すブロック図である。計算機システム10は、少なくとも一つのCPU20、メモリ30、ストレージ40、ネットワークインターフェース(NWIF)50、ユーザーIF(インターフェース)60、これらを物理的に接続するバス(またはリンク)70から構成される。
メモリ30には、オペレーティングシステム(以下、OS)80と、アプリケーションやサービスを構成するプロセス120と、プロセス120を監視する監視プロセス100と、監視条件などを設定する監視設定プログラム180が読み込まれて、CPU20によって実行される。なお、OS80は、関数を格納した標準ライブラリ800を有する。また、監視設定プログラム180は、監視設定プロセスとしてCPU20に実行される。
CPU20は、各機能部のプログラムに従って処理することによって、所定の機能を実現する機能部として機能する。例えば、CPU20は、監視設定プログラム180に従って処理することで監視設定部として機能し、監視プログラムに従って処理することで監視部(監視プロセス100)として機能する。他のプログラムについても同様である。さらに、CPU20は、各プログラムが実行する複数の処理のそれぞれを実現する機能部としても処理する。計算機及び計算機システムは、これらの機能部を含む装置及びシステムである。
なお、上記の例では、監視プロセス100や監視設定プログラム180等のひとつのプロセスでひとつの処理を実行するプログラムは、ひとつのスレッドとしてCPU20に実行される。なお、計算機システム10が実行するOS80の種類によっては、CPU20がプロセスを実行することができる。
計算機システム10の各機能を実現するプログラム、テーブル等の情報は、ストレージ40や不揮発性半導体メモリ、ハードディスクドライブ、SSD(Solid State Drive)等の記憶デバイス、または、ICカード、SDカード、DVD等の計算機読み取り可能な非一時的データ記憶媒体に格納することができる。
図2は計算機システム10において、プロセス及びスレッドの死活監視を行うソフトウェアの概要を示す説明図である。
監視プロセス100は、メモリ30内の自身(100)以外のプロセスである1以上のプロセス120が正常に稼働しているか否かの判定と、プロセス120を構成する1以上のスレッド130の中に異常なスレッドが存在するか否かの判定を、プロセス・スレッド監視情報150の内容を基に行う。各プロセス120にはそれぞれ1つの監視スレッド140と、関数フック部(関数フックスレッド)810が含まれる。また、メモリ30には監視設定プログラム180が読み込まれ、スレッド130の死活判定を行う条件を決定し、関数フック部810及び監視スレッド140に設定する。
プロセス120内の監視スレッド140は、プロセス120内の自身(監視スレッド)以外のスレッドであるスレッド130が正常に稼働しているか否かの判定を、スレッド監視情報160を基に行う。監視スレッド140は、プロセス120が正常に稼働していることを示す情報と、検出した異常なスレッド130の情報を、プロセス・スレッド監視情報150に記録する。
監視プロセス100以外のプロセスは一つ以上存在するが、図2では例としてその中の一つであるプロセス120を記載する。
プロセス120内の関数フック部810は、監視設定プログラム180によって設定されたフック対象の関数がスレッド130によって呼び出された際に、関数フック処理を実施し、スレッド監視情報160にスレッド130が正常に稼働していることを示す情報を記録する。また、関数フック部810は、呼び出された関数の記録を関数呼出統計情報170に記録する。
プロセス120内の監視スレッド140以外のスレッドは一つ以上存在するが、図2では例としてその中の一つであるスレッド130を記載する。
監視設定プログラム180は、関数呼出統計情報170に記録された関数の情報を基に、関数フック部810が関数フックの対象にする関数(以後、フック対象関数群)と、監視スレッド140がスレッド130の死活監視を行う監視周期を決定する。また、監視設定プログラム180は、関数呼出統計情報170に記録されたスレッド130による関数呼出のパターンの変化を検出し、変化後のパターンに適合するフック対象関数群と監視周期を更新する。
各プロセスまたはスレッドの処理の概要を以下に説明する。計算機システム10のメモリ30には、監視プロセス100と監視設定プログラム180が実行されている。
まず、監視プロセス100は、プロセス120の実行が開始されると、当該プロセス120に監視スレッド140と関数フック部810を組み込む。この処理は、監視スレッド140と関数フック部810のプロセスIDを、プロセス120と同一に設定すればよい。監視設定プログラム180は、関数フック部810にスレッド130がライブラリ800から関数を呼び出すときに、フックする関数(フック対象関数812)を後述するように設定する。
監視プロセス100は、処理が開始されると(110)、所定の監視周期となる度に(111)、死活判定を実行する(112)。この死活判定は、後述するように、プロセス・スレッド監視情報150に書き込まれた情報に基づいて行われる。
プロセス120のスレッド130は、処理が開始されると(131)、メッセージや命令等のイベントがキュー135に入力されるのを待機し(132)、キュー135にメッセージや命令等が入力される度にイベントとして所定の処理を実行する(133)。このとき、スレッド130がOS80の標準ライブラリ800の関数のうち所定の関数を呼び出すと(134)、関数フック部810が生存報告処理860を実行する。
関数フック部810は、スレッド130が所定の関数を呼び出すと、スレッド130が正常に実行されていることを示す生存報告処置860を実行し、後述する関数呼出統計情報170に呼び出された関数の情報を記録し、スレッド監視情報160にスレッド130が生存していることを示す情報を記録する。
監視スレッド140は、処理が開始されると(141)、所定の監視周期となる度に(142)、スレッド130の死活判定を後述するようにスレッド監視情報160を読み込んで実行し(143)、スレッド130の実行状態を生存報告としてプロセス・スレッド監視情報150に記録する。
ここで、監視プロセス100の監視周期(111)と、監視スレッド140の監視周期(142)は、異なる周期を設定することができるが、好ましくは同じ周期に設定する。なお、監視スレッド140の監視周期は、監視設定プログラム180がスレッド監視設定情報400に設定した値を用いることができる。
監視プロセス100は、プロセス120の死活監視を行う際に利用する情報を保持する。これを図3に示す。
図3は、監視プロセス100が保持するプロセス監視設定情報200の一例を示す説明図である。
監視プロセス100は、プロセス死活監視を行う際に利用する情報として、プロセス監視設定情報200を保持する。プロセス監視設定情報200は、監視周期210、プロセスID220、保護回数230、異常検出時アクション240から構成される。
監視周期210は、監視プロセス100が、プロセス・スレッド監視情報150を参照し、プロセス120の死活監視を実行する周期である。この周期は、例えば、秒で設定される。プロセスID220は、監視プロセス100がプロセス120の死活監視を実行する対象のプロセスの識別子である。保護回数230は、監視プロセス100が、監視対象のプロセス120が異常であると判定する際の基準に使用する情報である。保護回数230は、プロセス120の異常が連続して判定された回数を示し、図示の例ではプロセス120の異常が連続して3回検出されると、当該プロセス120に異常が発生したと判定する。異常検出時アクション240は、監視プロセス100が、監視対象プロセスが異常であると判定した際に実行する処理である。なお、プロセスID220〜異常検出時アクション240は、監視対象のプロセス120毎にエントリが設定される。
プロセス監視設定情報200は、計算機システム10の起動前に使用者等が予め設定しても良いし、計算機システム10の起動中に使用者が設定しても良い。また、計算機システム10の稼働中に、メモリ30に読み込まれたプロセスが実施する処理でプロセス監視設定情報200の情報を設定しても良い。
プロセス・スレッド監視情報150は、プロセスが正常稼働しているか否かを示す情報と、異常と判定されたスレッドの情報を保持する。これを図4に示す。
図4は、複数のプロセス120が共有するプロセス・スレッド監視情報150及びスレッド監視情報160の一例を示す説明図である。
プロセス・スレッド監視情報150はプロセス120が正常に稼働しているか否かを示す情報であるプロセス監視情報300と、異常と判定されたスレッド130の情報である異常スレッド情報310から構成される。プロセス・スレッド監視情報150は、監視スレッド140によって更新され、監視プロセス100によって参照される。
プロセス監視情報300は、プロセスID301、生存カウンタ302、生存カウンタ前回値303、連続無応答回数304、スレッド監視情報ポインタ305から構成される。
プロセスID301とは、監視プロセス100がプロセス死活監視を実行する対象のプロセスの識別子である。
生存カウンタ302とは、プロセスID301で識別されるプロセス120が正常に稼働していることを示すために使用されるカウンタ値である。プロセスID301で識別されるプロセス120は、この生存カウンタ302に“1”を加算して更新することで、自身が正常に稼働していることを表す。
生存カウンタ前回値303とは、プロセスID301で識別されるプロセス120が正常に稼働していることを示すために使用される生存カウンタ302の前回の値である。監視プロセス100は、生存カウンタ前回値303の値と生存カウンタ302の値が異なっている場合、プロセスID301で識別されるプロセス120が正常に稼働していると判定する。監視プロセス100は、プロセスID301で識別されるプロセスが正常稼働していると判定した後、生存カウンタ前回値303に現在の生存カウンタ302の値を代入して更新する。
連続無応答回数304とは、プロセスID301で識別されるプロセス120が、監視周期210の間に、連続して生存カウンタ302の更新がなされなかった回数を示す。監視プロセス100は、プロセスID301で識別されるプロセス120の連続無応答回数304が、保護回数230以上であった場合、このプロセス120を異常と判定する。
スレッド監視情報ポインタ305は、プロセスID301で識別されるプロセス120を構成するスレッド130の内、異常と判定されたスレッド130の情報を示す異常スレッド情報310へのポインタを示す。監視プロセス100は、プロセスID301で識別されるプロセス120を構成するスレッド130の状態を判定するために、スレッド監視情報ポインタ305を参照する。
異常スレッド情報310とは、異常スレッドID311と異常検出時刻312から構成される。
異常スレッドID311は、監視スレッド140が異常と判定したスレッドの識別子である。
異常検出時刻312とは、監視スレッド140が異常スレッドID311で識別されるスレッド130が、異常と判定された時刻を示す。
監視スレッド140は、スレッド130の死活監視を行う際に利用する情報を保持する。これを図5に示す。
図5は、監視スレッド140が保持するスレッド監視設定情報400の一例を示す説明図である。監視スレッド140は、スレッド130の死活監視を行う際に利用する情報として、スレッド監視設定情報400を保持する。スレッド監視設定情報400は、監視周期410、スレッドID420、保護回数430、異常検出時アクション440から構成される。なお、ひとつの監視スレッド140についてひとつの監視周期410が設定される。また、スレッドID420、保護回数430、異常検出時アクション440からなるエントリは、ひとつの監視スレッド140について監視対象のスレッド130の数に応じて設定される。
監視周期410とは、監視スレッド140が、スレッド監視情報160を参照し、スレッド130の死活監視を実行する周期である。図示の例では、10秒の周期でスレッド130の死活監視を行う例を示す。この監視周期410は、後述するように設定される。スレッドID420とは、監視スレッド140がスレッド130の死活監視を実行する対象のスレッドの識別子である。保護回数430とは、監視スレッド140が、監視対象のスレッド130が異常であると判定する際の基準として使用する情報(閾値)である。異常を検出された回数が保護回数430を超えるまで、監視スレッド140はスレッド130を異常と判定しない。これは、計算機システム10の負荷が大きいときなどで、応答が遅延したときに監視スレッド140が異常と誤判定するのを防ぐためである。
異常検出時アクション440とは、監視スレッド140が、監視対象のスレッド130が異常であると判定した際に実行する処理である。
スレッド監視設定情報400は、計算機システム10の起動前に使用者が設定しても良いし、計算機システム10の起動中に使用者が設定しても良い。また、計算機システム10の稼働中に、メモリ30に保持されたプロセス120が実施する処理で設定しても良い。
スレッド監視情報160は、スレッド130が正常稼働しているか否かを示す情報であるスレッド監視情報を保持する。これを図6に示す。
図6は、監視スレッド140と複数のスレッド130が共有するスレッド監視情報160の一例を示す説明図である。
スレッド監視情報160は、プロセスID501、生存カウンタ502、生存カウンタ前回値503、連続無応答回数504、スレッド監視情報ポインタ505から一つのエントリが構成される。
スレッドID501とは、監視スレッド140がスレッド130の死活監視を実行する対象のスレッドの識別子である。
生存カウンタ502とは、スレッドID501で識別されるスレッド130が正常に稼働していることを示すために使用されるカウンタ値である。スレッドID501で識別されるスレッド130は、この生存カウンタ502に“1”を加算して更新することで、自身が正常に稼働していることを表す。
生存カウンタ前回値503とは、スレッドID501で識別されるスレッドが正常に稼働していることを示すために使用されるカウンタ値である。監視スレッド140は、この生存カウンタ前回値503の値と、生存カウンタ502の値が異なっている場合、スレッドID501で識別されるスレッド130が正常に稼働していると判定することができる。監視スレッド140は、スレッドID501で識別されるスレッド130が正常に稼働していると判定した後、生存カウンタ前回値503に生存カウンタ502の値を代入して更新する。
連続無応答回数504とは、スレッドID501で識別されるスレッド130が、監視周期410の間に、連続して生存カウンタ502の更新がなされなかった回数を示す。監視スレッド140は、前記スレッドの連続無応答回数504が、保護回数430以上であった場合、このスレッドを異常と判定する。
監視プロセス100、監視スレッド140によるスレッド130の死活監視のシーケンスを図7に示す。
図7は、プロセス及びスレッドの監視処理のシーケンス図である。プロセス120内で実行される関数フック部810は、スレッド130が処理の実行中に予め設定されたフック対象関数を呼び出した際に、生存報告処理860を行う。生存報告処理860とは、スレッド監視情報160の生存カウンタ502に“1”を加算することで、前記スレッド130が正常に稼働していることを示すものである。前記スレッド130によるフック対象関数の呼び出しは不定期であり、周期的に行われるものではない。
監視スレッド140は、所定の監視周期410毎に各スレッド130が正常に稼働しているか否かを判定する死活判定処理143を実施する。この判定は、監視スレッド140がスレッド監視情報160のスレッドID801毎に、生存カウンタ502の値と生存カウンタ前回値503の値を比較する。そして、これらの値が一致しなければ、監視スレッド140は当該スレッド130が正常に稼働していると判定する。一方、生存カウンタ502の値と生存カウンタ前回値503の値が一致する場合、監視スレッド140は該当スレッド130に障害が発生したと判定し、所定の処理(異常検出時アクション240)を実行する。なお、監視スレッド140の監視条件は、監視設定プログラム180によって予めスレッド監視設定情報400が設定されているものとする。
監視スレッド140は、死活判定処理143の後に、スレッド状態通知と生存報告処理144を実行する。監視スレッド140は、監視プロセス100に対して、スレッド130の状態を通知して、監視スレッド140及びスレッド130が所属するプロセス120の生存報告処理144を行う。生存報告処理144では、監視スレッド140が、自身が所属するプロセスID301の生存カウンタ302と生存カウンタ前回値303を更新する。さらに、スレッド130に異常が発生した場合には、監視スレッド140が異常のあったスレッド130の識別子311と、異常を検出した異常検出時刻312のエントリを異常スレッド情報310に追加する。そして、監視スレッド140は異常スレッド情報310に加えたエントリへのスレッド監視情報ポインタ305をプロセス監視情報300に設定する。
監視プロセス100は、監視周期210毎にプロセス120が正常に稼働しているか否かを判定する死活判定処理112を実行する。また、監視プロセス100は、プロセス120のスレッド130の状態を取得する。死活判定処理112は、監視プロセス100が、プロセス監視情報300のプロセスID301毎に、生存カウンタ302の値と生存カウンタ前回値303の値が異なるか否かを判定する。生存カウンタ302の値と生存カウンタ前回値303の値が異なる場合は、監視プロセス100は当該プロセス120が正常に稼働していると判定する。一方、生存カウンタ302の値と生存カウンタ前回値303の値が等しい場合、監視プロセス100は当該プロセス120に異常が発生したと判定する。また、監視プロセス100は、スレッド監視情報ポインタ305から異常スレッド情報310を参照し、異常が発生したスレッド130を特定する。
なお、監視プロセス100の監視周期210と、監視周期410は同じ値であることが好ましい。
監視スレッド140によるスレッド130の死活判定処理143と、監視プロセス100へのスレッド130の状態通知、監視スレッド140及びスレッド130が所属するプロセス120の生存報告処理144の処理フローを図8に示す。
図8は、監視スレッド140で行われるスレッド130の異常判定と、監視プロセス100への状態通知、監視プロセス100への生存報告処理144の一例を示すフローチャートである。この処理は、所定の監視周期410となる度に監視スレッド140で実行される。
ステップ610において、監視スレッド140は、スレッド監視情報160を参照し、スレッドID501で識別されるスレッド130の生存カウンタ502の値と生存カウンタ前回値503の値を比較する。比較の結果、生存カウンタ502と生存カウンタ前回値503の値が一致していない場合は、前記関数フック部810が生存報告処理860を行ったとみなし、ステップ611において、前記スレッド130を正常と判定する。
その後、監視スレッド140は、ステップ612において、スレッド監視情報160の前記スレッド130の生存カウンタ前回値503に、生存カウンタ502の値を代入する。その後、監視スレッド140は、ステップ613において、連続無応答回数504に0を代入する。
その後、監視スレッド140は、ステップ640において、プロセス監視情報300の生存カウンタ302に“1”を加算することで、監視スレッド140が属するプロセス120が正常に稼働していることを示す。
ステップ610において、監視スレッド140が、スレッド監視情報160のスレッドID501で識別されるスレッドの、生存カウンタ502と生存カウンタ前回値503の値を比較した結果、一致した場合は、連続無応答回数504に“1”を加算する。その後、監視スレッド140は、ステップ621において、連続無応答回数504が保護回数430を超過しているか否かを判定する。超過している場合、前記スレッド130が、監視周期410×保護回数430の間、全く生存報告がないことから、ステップ622において、前記スレッド130を異常と判定する。
その後、ステップ623において、監視スレッド140は前記スレッドの識別子を、プロセス・スレッド監視情報150の異常スレッドID311に記録する。その後、ステップ624において、現在時刻をプロセス・スレッド監視情報150の異常検出時刻312に記録する。その後、監視スレッド140は、ステップ625において、前記スレッド130が異常と判定された場合に実施する異常検出時アクション440を実行する。その後、ステップ640にて、監視スレッド140は、プロセス監視情報300の生存カウンタ302に“1”を加算することで、監視スレッド140が属するプロセス120が正常に稼働していることを示す。
ステップ621において、監視スレッド140が、連続無応答回数504が保護回数430を超過しているか否かを判定した結果、超過していない場合は、スレッドID501で識別されるスレッド130が生存報告を行っていない期間が、監視周期410×保護回数430まで達していない。このため、監視スレッド140は、ステップ630において、前記スレッド130を異常疑診と判定する。異常疑診とは、前記スレッド130から生存報告がないものの、生存報告のない期間が、異常と判定する閾値(監視周期410×保護回数430)を超えていないため、異常ではないが異常である可能性があることを示す状態である。その後、ステップ640にて、監視スレッド140はプロセス監視情報300の生存カウンタ302に“1”を加算することで、監視スレッド140が属するプロセス120が正常に稼働していることを示す。
図8に示される前記処理は、監視スレッド140が、スレッド監視設定情報400に存在するスレッドの全てについて順次実施する。
監視プロセス100によるプロセス120の死活判定と、プロセス120を構成するスレッドの状態確認処理フローを図9に示す。
図9は、監視プロセス100で行われるプロセス120の異常判定と、異常スレッドの状態取得処理の一例を示すフローチャートである。この処理は、プロセス監視設定情報200の監視周期210となる度に監視プロセス100する。
ステップ710において、監視プロセス100は、プロセス監視情報300を参照し、プロセスID301で識別されるスレッド130の、生存カウンタ302と生存カウンタ前回値303の値を比較する。比較の結果、一致していない場合は、前記プロセス120の監視スレッド140が生存報告処理144を行ったとみなし、ステップ711において、前記スレッドを正常と判定する。その後、ステップ712において、前記プロセスの生存カウンタ前回値303に、生存カウンタ302の値を代入する。その後、ステップ713において、連続無応答回数304に“0”を代入する。
ステップ710において、監視プロセス100が、プロセスID301で識別されるプロセス120の、生存カウンタ302と生存カウンタ前回値303の値を比較した結果、一致した場合は、ステップ720へ進んで連続無応答回数304に“1”を加算する。その後、ステップ721において、連続無応答回数304が保護回数230を超過しているか否かを判定する。連続無応答回数304が保護回数230を超過している場合、前記プロセス120が、監視周期210×保護回数230の間、全く生存報告がない。このため監視プロセス100は、ステップ722に進んで、前記プロセス120を異常と判定する。その後、監視プロセス100はステップ723において、前記プロセス120が異常と判定された場合に実施する異常検出時アクション240を実行する。
ステップ721において、監視プロセス100が、連続無応答回数304が保護回数230を超過しているか否かを判定した結果、超過していない場合は、プロセスID301で識別されるプロセスが生存報告を行っていない期間が、監視周期210×保護回数230まで達していないことから、ステップ730において、前記プロセスを異常疑診と判定する。異常疑診とは、前記プロセスから生存報告がないものの、生存報告のない期間が、異常とまで判断するほどではないため、異常ではないが異常である可能性があることを示す状態である。
その後、ステップ740で、異常スレッド情報310を参照し、異常スレッドID311が存在する場合、異常スレッドID311と異常検出時刻312を、ユーザーIF60を介して通知する。通知処理は、異常スレッド情報310に存在する全てのスレッドに対して行う。なお、異常スレッドの発生を通知する警報の出力は、新たに異常スレッド情報310に書き込まれた異常スレッドID311と異常検出時刻312について行うようにしても良い。
図9に示される前記処理は、プロセス監視設定情報200に存在するプロセス120の全てについて順次実施する。
スレッド130がフック対象関数を呼び出すと、関数フック部810が生存報告処理860を行う。そのため、フック対象関数を決定する必要がある。監視設定プログラム180がこの処理を行う。監視設定プログラム180の構成と、関数フック処理を行う関数フック部の構成を図10に示す。
図10は、関数フック処理の一例を示すブロック図である。フックの対象となる関数は、任意のものを使用できるが、図10では例として、OS80が有するC言語の標準ライブラリ800に含まれる関数を用いる例を示す。
関数フック処理を行う関数フック部810は、フック対象関数群811と、呼出統計記録処理813と、生存報告処理860から構成される。
フック対象関数群811は、フック対象関数812の集合である。呼出統計記録処理813は、スレッド130が呼び出したフック対象関数812の呼出情報を、関数フック部810が関数呼出統計情報170に記録する。
例として、スレッド130がC言語の標準ライブラリ800のライブラリ関数epoll_waitを呼び出した際、関数フック部810がこの関数をフックし、呼出統計記録処理813と、生存報告処理860を実行する。その後、スレッド130は、C言語の標準ライブラリ800に存在するepoll_waitを呼び出し、本来の処理を実行する。
例として、スレッド130がC言語の標準ライブラリのライブラリ関数printfを呼び出した場合、この関数は、フック対象関数群811に存在しないため、C言語の標準ライブラリ800に存在するprintfが直ぐに実行される。
フックを行う具体的な方法の一つとして、Linux(登録商標)のローダの機能であるLD_PRELOAD環境変数オプションを利用する方法が知られている。
監視設定プログラム180は、フック対象関数群811と、監視スレッド140の監視周期410を決定する。監視設定プログラム180は、監視設定値計算部820と、監視設定部821と、監視制御パラメタ830から構成される。
監視設定値計算部820は、監視制御パラメタ830と、関数呼出統計情報170を基に、フック対象関数群811と、監視スレッド140の監視周期410を決定し、監視設定部821に通知する。
監視設定部821は、監視設定値計算部820で決定された、フック対象関数群811と、監視スレッド140の監視周期410を設定する。
フック対象関数群811で新たに含まれるフック対象関数812や、フック対象関数群811から新たに外されたフック対象関数812の設定方法の一つとして、ELFフォーマットの.GOTセクションに存在する関数のアドレスが記載された箇所を書き直す方法が知られている。
監視制御パラメタ830は、目標呼出確率831と、目標監視周期832と、監視周期上限833と、計測時間上限834から構成される。
目標呼出確率831とは、スレッド130が、目標監視周期832内に、少なくとも一回は、フック対象関数群811に含まれる任意のフック対象関数812を呼び出す確率の目標値を示す。監視設定値計算部820は、この目標呼出確率831を達成できるように、フック対象関数群811と監視周期410を決定する。
監視周期上限833とは、監視設定値計算部820が決定する監視周期410の上限を示す。監視設定値計算部820の計算により算出された監視周期410が、監視周期上限833を超えていた場合、計算機システム10の使用者に、ユーザーIF60を介して警告する。
計測時間上限834とは、呼出統計記録処理813による、関数呼出統計情報170への関数呼出記録の計測期間を示す。計測期間がこの計測時間上限834を超えると、呼出統計記録処理813は関数呼出の記録を停止し、監視設定値計算部820がその時点の関数呼出統計情報170を基に、フック対象関数群811と監視周期410を決定するための計算を始める。
なお、監視設定部821は、プロセス120が起動した直後では、関数フック部810が関数呼出統計情報170に関数を書き込んでいないので、予め設定された1以上のフック対象関数812をフック対象関数群811に設定しておく。同様に、監視設定部821は、プロセス120が起動した直後では、関数フック部810が関数呼出統計情報170に関数を書き込んでいないので、予め設定された監視周期410を監視スレッド140に設定しておく。
図11に、関数呼出統計情報170が保持する情報を示す。関数呼出統計情報170は、関数呼出統計テーブル900と、計測経過時間910と、平均呼出率920と、呼出確率930と、呼出率偏差940から構成される。
関数呼出統計テーブル900は、関数名901と、呼出回数902と、呼出率903から一つのエントリが構成される。
関数名901とは、フック対象関数812の候補になる任意の関数の名前を表わす。呼出回数902とは、スレッド130が関数名901で識別される関数を計測経過時間910内で呼び出した回数を表わす。
呼出率903とは、計測経過時間910の単位時間内に、スレッド130が関数名901で識別される関数を呼び出す平均回数を表わす。呼出率903は、呼出回数902を計測経過時間910で割ることで計算する。関数呼出統計テーブル900には、フック対象関数812の候補になる関数全ての情報が記録される。
計測経過時間910とは、呼出統計記録処理813が開始されてから経過した時間を示す。時間単位は、1秒や1マイクロ秒など任意の時間単位を取ることが出来る。
平均呼出率920とは、スレッド130が、単位時間内に、関数呼出統計テーブル900にある、フック対象関数812の候補になる任意の関数を呼び出す平均回数を示す。平均呼出率920は、関数呼出統計テーブル900内の、呼出率903の総和として計算される。
呼出確率930とは、スレッド130が、監視周期410内に、フック対象関数群811に含まれる任意のフック対象関数812を少なくとも一回は呼び出す確率を表わす。呼出確率930は、監視設定値計算部820による処理が実行される度に計算される。監視設定値計算部820による処理は、所定の周期で実行してもよいし、計算機システム10の使用者が明示的に実行してもよいし、計算機システム10の特定のイベントが発生した際に自動的に実行されてもよい。
呼出率偏差940とは、呼出確率930の標本標準偏差を表わす。呼出率偏差940は、監視設定値計算部820の処理により、呼出確率930を計算する際に逐次計算される。
図12は、従来例を示し、関数フックを利用した死活監視方法において、誤検出の発生を示す説明図である。
関数フックを利用したスレッド130の死活監視を行う従来例では、図12に示されるように、監視周期410(図中監視周期3)内で、スレッド130が、フック対象関数群811に含まれる任意のフック対象関数812を一度も呼び出すことがない場合に、監視スレッド140が前記スレッド130を異常と誤判定するという問題があった。
例として、関数呼出統計テーブル900にある、フック対象関数812の候補になる関数を、関数1、関数2、関数3、関数4とする。スレッド130は、これらの関数を呼び出すたびに、関数フック部810の生存報告処理860を行う。スレッド130は、少なくとも一回は監視周期410の間に生存報告処理860を行えば、監視スレッド140は前記スレッドを異常と誤判断することはない。
しかしながら、スレッド130が実行する処理を記述したコード(プログラム)に前記フック対象関数812が含まれているか否かが不明であり、フック対象関数812が含まれていたとしても、スレッド130の処理の実行は、計算機システム10の稼働状態に依存するため、スレッド130がいつこれらフック対象関数812を呼び出すかが不定である。従って、監視周期410の間に一回もフック対象関数812を呼び出すことがなく、監視スレッド140が誤ってスレッド130を異常であると判断してしまう。
図13は、従来例を示し、関数フックを利用した死活監視方法において、生存報告の多重実行を示す説明図である。
また、図13に示されるように、監視周期410内に、スレッド130が、フック対象関数群811に含まれる任意のフック対象関数812を大量に呼び出す場合に、計算機システム10のCPU20のCPU時間を大量に消費するという問題があった。
前述のとおり、スレッド130がいつこれらフック対象関数812を呼び出すかが不定である。従って、監視周期410の間に何回もフック対象関数812を呼び出し、関数フック処理によるCPU20のCPU使用時間を大量に消費してしまう。
これは、関数フック部810に含まれる呼出統計記録処理813の実行と、生存報告処理860に加え、フック対象関数812を呼び出した際の関数呼び出し処理が一回分増えるためである。また、CPU使用時間の増加は、計算機システム10のCPU20のCPU使用率が100%に近い場合に、計算機システム10のサービスを提供する処理を行うスレッド130のCPU20の単位時間におけるCPU使用時間が短くなるため、計算機システム10の提供するサービスの性能劣化を招く恐れがある。計算機システム10のCPU20のCPU使用率が低い場合には、前記のCPU使用時間の短縮は発生しないものの、前記の関数フック部810の処理を行う時間がかかるため、スレッド130が行う処理が遅延する。そのため、計算機システム10の処理の応答時間が遅れる。
監視設定値計算部820は、前記のような問題が生じないように、フック対象関数群811と監視周期410を決定する。これを図14に示す。
図14は、関数フック対象集合の決定方法を示す説明図である。スレッド130は、これらの関数3、4を呼び出すたびに、関数フック部810の生存報告処理860を行う。スレッド130は、少なくとも一回は監視周期410の間に生存報告処理860を行えば、監視スレッド140は前記スレッド130を異常と誤判断することはない。従って、監視周期410の間に少なくとも一回は生存報告処理860を行い、かつ生存報告処理860の回数が少なくなるような関数を、フック対象関数812に決定するのが好ましい。
然しながら、前述の通りスレッド130がフック対象関数812の呼出は不定であり、確実に前記の条件を満たすことはできない。そこで、関数呼出統計情報170を基に、高い確率で前記の条件を満たすフック対象関数812を決定する。この確率は、監視制御パラメタ830の目標呼出確率831で与える。これを図15で示す。
図15は、関数フック対象集合を決定する基準とする呼出確率の確率密度の一例を示すグラフである。
関数呼出統計情報170の平均呼出率920から、スレッド130が、フック対象関数群811に含まれる任意のフック対象関数812を呼び出した後、次に任意のフック対象関数812を呼び出すまでの時間間隔の確率密度関数を図15のように算出する。この確率密度関数の0から監視周期410までの定積分は、監視周期410の間に、任意のフック対象関数812を呼び出す確率であり、これを呼出確率930とする。
この呼出確率930が目標呼出確率831を上回れば、計算機システム10の使用者が指定した目標呼出確率831で、監視周期410内に、スレッド130がフック対象関数群811に含まれるフック対象関数812を呼び出すことで、生存報告処理860を呼び出すように、計算機システム10の死活監視機能の設定を行うことができる。
前記の通り、平均呼出率920、は関数名901で識別される関数の呼出率903の和で算出される。監視設定値計算部820は、この呼出確率930が目標呼出確率831を上回るような平均呼出率920を逆に算出し、その平均呼出率920を達成するように関数名901で識別される関数をフック対象関数820として、フック対象関数群811に含めることで、フック対象関数群811を決定する。
監視設定プログラム180がフック対象関数群811を決定する際、監視周期410が監視周期上限833を上回る場合、計算機システム10のユーザーIF60を介して使用者に警告する。この警告は、監視周期410が長くなりすぎると、監視スレッド140が、スレッド130の異常を検出する時間が遅れ、計算機システム10の異常時の処理が迅速に行えなくなるのを避けるために出力される。
関数呼出統計情報170は、計算機システム10の稼働状態を基に構築してもよいし、計算機システム10を稼働する前に、予め所定の値をプリセットしても良いものとする。
死活監視のパラメタとして設定される、目標呼出確率831と、目標監視周期832と、監視周期上限833から、フック対象関数群811と、監視周期410を決定する処理を図16に示す。
図16は、関数フック対象集合と監視周期を決定する処理の一例を示すフローチャートである。
ステップ1001において、監視設定値計算部820は、計測経過時間910が計測時間上限834を上回っているか否かを判定する。計測経過時間910が計測時間上限834を上回っていない場合は、関数呼出統計情報170に十分な関数呼出情報が蓄積されていないとみなし、一定の時間をおいて(1031)再度ステップ1001を実行する。計測経過時間910が計測時間上限834を上回っていた場合は、関数呼出統計情報170に十分な関数呼出情報が蓄積されているとみなし、フック対象関数群811と監視周期410の計算処理に進む。
その後、ステップ1002において、監視設定値計算部820は、関数呼出統計テーブル900に含まれる、関数名901で識別される関数の、呼出率903を全て下記の(1)式により計算する。
Figure 2014182561
上記(1)式のfは、関数名901で識別される関数であり、Tcは計測経過時間910であり、C(f)は関数fの呼出回数902であり、λ(f)は関数fの呼出率903である。
その後、ステップ1003において、監視設定値計算部820は、呼出率903の大きい順に、関数名901で識別される関数のエントリを並び替える。これにより、スレッド130が呼び出した回数が多い順に、関数名901で識別される関数のエントリが並ぶ。
その後、ステップ1004において、監視設定値計算部820は、呼出確率930を0に設定し、呼出確率930を初期化する。
その後、ステップ1005において、監視設定値計算部820は、関数呼出統計テーブル900から、関数名901で識別される関数fを選択する。これは、スレッド130が呼び出した回数が多い関数fを順に選択することを意味する。
その後、ステップ1006において、監視設定値計算部820は、関数fが選択できたか否かを判定する。関数fを選択できた場合、ステップ1010において、関数fをフック対象関数812としてフック対象関数群811に追加する。これは、スレッド130が呼び出した回数が多い順に、関数fをフック対象関数群811に追加していくことを意味する。
その後、ステップ1011において、関数f平均呼出率920を次の(2)式により計算して、更新する。
Figure 2014182561
上記(2)式のλは、平均呼出率920である。これは、スレッド130が、単位時間内に、これまでフック対象関数群811に追加された任意のフック対象関数812を呼び出す平均回数を意味する。
その後、ステップ1012において、監視設定値計算部820は、呼出確率930を次の(3)式により計算して、更新する。
Figure 2014182561
上記(3)式のTは目標監視周期832であり、pは呼出確率930である。これは、スレッド130が、目標監視周期832内に、これまでフック対象関数群811に追加された任意のフック対象関数812を呼び出す確率を意味する。
その後、ステップ1013において、監視設定値計算部820は、呼出確率930(p)が、目標呼出確率831を上回るか否かを判定する。呼出確率930(p)が、目標呼出確率831を上回っている場合、それまでにフック対象関数群811に追加されたフック対象関数812の集合をフック対象関数群811と決定し、目標監視周期832を監視周期410と決定する。
これは、スレッド130が、それまでにフック対象関数群811に追加された任意のフック対象関数812を呼び出し、目標監視周期832内に生存報告処理860を行う確率である呼出確率930が、目標呼出確率831を上回ることを意味する。
ステップ1013において、監視設定値計算部820は、呼出確率930が、目標呼出確率831以下である場合、ステップ1005に戻り、フック対象関数群811へのフック対象関数812の追加を継続して行う。
ステップ1006において、関数fが選択できなかった場合、フック対象関数群811に追加する関数が残っておらず、ステップ1010以下の、フック対象関数群811への関数の追加が行えない。
その後、ステップ1020において、監視設定値計算部820は、呼出確率930が目標呼出確率831を下回っているか否かを判定する。呼出確率930が目標呼出確率831を下回っていた場合、関数呼出統計テーブル900にある関数の全てをフック対象関数812としてフック対象関数群811に追加しても、目標監視周期832内に、フック対象関数群811に含まれる任意のフック対象関数812を呼び出す確率である呼出確率930が、目標呼出確率831に届かない。
そのため、監視周期410を次の(4)式により計算し、決定することで、呼出確率930が目標呼出確率831を上回るようにする。
Figure 2014182561
上記(4)式のTは監視周期410である。これは、目標監視周期832内にスレッド130がフック対象関数群811に含まれる任意のフック対象関数812を呼び出す可能性が低いため、監視周期410の方を伸ばすことで、前記の可能性を高めることを意味する。
その後、ステップ1022において、監視設定値計算部820は、(4)式で計算した監視周期410が、監視周期上限833を上回っているか否かを判定する。監視周期410が、監視周期上限833を上回っていた場合は、ユーザーIF60を介して、計算機システム10の使用者に警告を出力する。これは、(4)式で計算された監視周期410が長くなりすぎ、監視スレッド140でスレッド130の異常を検出するのが遅れ、計算機システム10の使用者がスレッド130の異常を検知して適切な処理を施すまでに時間がかかりすぎることになるため、その旨を使用者に知らせるためである。
前述の処理により、監視設定値計算部820が、フック対象関数群811と監視周期410が決定した後、監視設定部821がフック対象関数群811と監視周期410を設定する。
監視周期410の設定の具体例として、監視スレッド140が監視周期410の値を設定するインタフェース関数を用意し、監視設定部821がこの関数を呼び出す方法がある。
フック対象関数群811の設定の具体例として、フック対象関数群811に新たに追加されるフック対象関数812の設定を行う場合、監視スレッド140とスレッド130が属するプロセス120のELFフォーマットの.GOTセクションにある、関数呼出統計テーブル900内の関数名901で識別される関数のエントリのアドレスを、OS80の標準ライブラリ800内にある前記関数のアドレスから、フック対象関数群811のフック対象関数812のアドレスに書き換える方法がある。
フック対象関数群811の設定の具体例として、フック対象関数群811からフック対象関数812を外す設定を行う場合、監視スレッド140とスレッド130が属するプロセス120のELFフォーマットの.GOTセクションにある、関数呼出統計テーブル900内の関数名901で識別される関数のエントリのアドレスを、フック対象関数群811のフック対象関数812のアドレスから、標準ライブラリ800内にある前記関数のアドレスに書き換える方法がある。
上記第一の実施例によれば、実行するプロセス120のソースコードの変更や、OS80のカーネルの変更の必要がないために、ソースコードの入手ができないプログラムに対してもスレッド130単位の死活監視を実現可能である。関数フックによるプロセス120とスレッド130の死活監視において、計算機システム10の使用者が設定することができる関数の目標呼出確率831で、監視スレッド140が、スレッド130の異常状態を正しく検知できる。
また、スレッド130が生存報告処理860を行うのに使用するフック対象関数群811と、監視スレッド140の監視周期410を、監視設定プログラム180の監視設定値計算部820が自動的に決定し、監視設定部812が自動的に設定するため、計算機システム10の使用者が、計算機システム10の稼働後、死活監視の設定を一切行う必要がない。
第二の実施例では、第一の実施例の構成に加えて、計算機システム10の稼働状態の変化等により、スレッド130による関数の呼出パターンが変化した場合にこの変化を自動的に検知し、再度、フック対象関数群811と監視周期410を計算し直して、設定を変更するものである。これにより、第二の実施例では、計算機システム10の稼働状態の如何に関わらず、常に目標呼出確率831で、監視スレッド140が、スレッド130の異常状態を正しく検知できるのである。
図17に、スレッド130がフック対象関数群811に含まれる任意のフック対象関数812の呼出パターンが変化した場合に、この変化を検知する監視設定プログラム180を示す。図17は、関数フック処理のソフトウェア構成の一例を示すブロック図である。
監視設定プログラム180は、スレッド130によるフック対象関数群811に含まれるフック対象関数812の呼出パターンが変化した場合に、この変化を自動的に検知して、フック対象関数群811を更新する。監視設定プログラム180は、監視設定値計算部820と、監視設定部821と、関数呼出変化検知部822と、監視制御パラメタ830と、変化検知パラメタ840と、変化検知情報850から構成される。
この第二実施例の構成は、前記第一の実施例の図10に示した監視設定プログラム180に、関数呼出変化検知部822と、変化検知パラメタ840と、変化検知情報850を加えたものであり、その他の構成は前記第一実施例と同様である。
関数呼出変化検知部822は、変化検知パラメタ840と、変化検知情報850を基に、スレッド130によるフック対象関数812の呼出パターンの変化を検知する。
関数呼出変化検知部822は、前記呼出パターンの変化をスレッド130によるフック対象関数812の呼出頻度と、前記呼出頻度の時間変動を示す呼出頻度の標準偏差を基に、検知する。
変化検知パラメタ840は、検知閾値841と、検知周期842と、保護回数843から構成される。
検知閾値841とは、スレッド130によるフック対象関数812の呼出頻度の変化を判定する値域である予測範囲を計算する際に用いる値を示す。検知周期842とは、スレッド130によるフック対象関数812の呼出の変化を検知する処理を行う周期を示す。保護回数843とは、スレッド130によるフック対象関数812の呼出頻度の変化の判定に用いる値を示す。
変化検知情報850は、呼出率予測値851と、呼出率偏差値852と、連続疑診回数853から構成される。
呼出率予測値851とは、スレッド130によるフック対象関数812の呼出頻度の予測値を示す。呼出率偏差値852とは、スレッド130によるフック対象関数812の呼出頻度の標準偏差を示す。連続疑診回数853とは、スレッド130によるフック対象関数812の呼出頻度が、前記予測範囲を連続して逸脱した回数を示す。
関数呼出変化検知部822は、所定の周期で、スレッド130によるフック対象関数812の呼出頻度の予測値である呼出率予測値851と、呼出率予測値851の変動を表わす呼出率偏差値852と、検知周期842から、前記呼出頻度の予測範囲を計算し、平均呼出率920が予測範囲内であれば、スレッド130によるフック対象関数812の呼出パターンに変化がないと判定する。一方、関数呼出変化検知部822は、平均呼出率920が予測範囲外であれば、スレッド130によるフック対象関数812の呼出パターンに変化した疑いがあることを示す変化疑診と判定する。
そして、関数呼出変化検知部822は、変化疑診が連続して判定された回数が保護回数843を超えた場合、スレッド130によるフック対象関数812の呼出パターンが変化したと判定する。変化疑診の判定が連続して保護回数843を超えるまで、呼出パターンが変化したことを保留することで、関数呼出変化検知部822は、呼出パターンの変化が頻繁に判定されるのを防止できる。
スレッド130によるフック対象関数812の呼出頻度が増加した場合、図13で示したように、スレッド130が監視周期410内にフック対象関数812の呼出を大量に行うことで、生存報告処理860等が頻発してCPU20のCPU使用時間を増大させ、計算機システム10の性能劣化を招く恐れがある。
図18は、関数呼出変化検知部822が、スレッド130によるフック対象関数812の呼出頻度が増加した状態を検知する場合の説明図である。なお、図18における保護回数843は“2”とする。
関数呼出変化検知部822は、図中時刻t1〜t5で平均呼出率920(λ(t))の予測分布を更新する。平均呼出率920が、前述の予測範囲内であれば、前述のスレッド130によるフック対象関数812の呼出パターンは変化していないと判定する(時刻t1、t2)。その後、平均呼出率920と呼出率偏差940から、スレッド130によるフック対象関数812の呼出頻度の予測値である呼出率予測値851と、予測値の変動を表わす呼出率偏差値852を計算し、予測分布の平均と偏差を更新する。
平均呼出率920が、前述の予測範囲を上回った場合は、関数呼出変化検知部822は変化疑診と判定する(時刻t3、t4)。変化疑診の判定が保護回数843の値である“2”を超え、3回になった場合、関数呼出変化検知部822はスレッド130によるフック対象関数812の呼出頻度が上昇し、呼出パターンが変化したと判定する(時刻t5)。
図19は、関数呼出変化検知部822が、スレッド130によるフック対象関数812の呼出頻度が減少した状態を検知する場合の説明図である。なお、図19における保護回数843は“2”とする。
関数呼出変化検知部822は、上記図18と同様に、図中時刻t1〜t5で平均呼出率920の予測分布を更新する。平均呼出率920が、前述の予測範囲内ならば、図18と同様に、前述のスレッド130によるフック対象関数812の呼出パターンは変化していないと判定する(時刻t1、t2)。その後、平均呼出率920と呼出率偏差940から、スレッド130によるフック対象関数812の呼出頻度の予測値である呼出率予測値851と、予測値の変動を表わす呼出率偏差値852を計算し、予測分布の平均と偏差を更新する。
平均呼出率920が、前述の予測範囲を下回った場合は、図18と同様に、関数呼出変化検知部822は変化疑診と判定する(時刻t3、t4)。変化疑診の判定が保護回数843の値である2を超え、3回になった場合、関数呼出変化検知部822はスレッド130によるフック対象関数812の呼出頻度が減少し、呼出パターンが変化したと判定する(時刻t5)。
上記図18のように平均呼出率920が増大する場合や、上記図19のように平均呼出率920が減少する場合では、スレッド130の関数の呼び出しパターンが変化しているため、関数呼出統計情報170を平均呼出率920の変化方向に応じたプリセット値に切り替えるようにしても良い。図18のように平均呼出率920が増大する場合では、監視設定部821は、この増大に応じた値の関数呼出統計情報170に切り替える。また、図19のように平均呼出率920が減少する場合では、監視設定部821は、この減少に応じた値の関数呼出統計情報170に切り替える。
図20は、スレッド130によるフック対象関数812の呼出頻度が短時間に増減を繰り返し振動する場合に、関数呼出変化検知部822が、その都度変化の検出を行わず、フック対象関数群811と監視周期410の無用な再計算を防ぐ場合の説明図である。なお、図20における保護回数843は2とする。
関数呼出変化検知部822は、上記図18と同様に、図中時刻t1〜t5で平均呼出率920の予測分布を更新する。平均呼出率920が、前述の予測範囲内あれば、図19と同様に、前述のスレッド130によるフック対象関数812の呼出パターンは変化していないと判定する(時刻t1)。その後、平均呼出率920と呼出率偏差940から、スレッド130によるフック対象関数812の呼出頻度の予測値である呼出率予測値851と、予測値の変動を表わす呼出率偏差値852を計算し、予測分布の平均と偏差を更新する。
平均呼出率920が、前述の予測範囲を下回った場合は、図19と同様に、関数呼出変化検知部822は変化疑診と判定し、連続疑診回数853に1を加算する(時刻t2)。その後、平均呼出率920が前述の予測範囲内に戻った場合、前述の変化疑診判定を取り消し、連続疑診回数853を0に戻す(時刻t3)。その後、平均呼出率920が、前述の予測範囲を上回った場合は、図18と同様に、関数呼出変化検知部822は変化疑診と判定し、連続疑診回数853に1を加算する(時刻t4)。その後、平均呼出率920が前述の予測範囲内に戻った場合、前述の変化疑診判定を取り消し、連続疑診回数853を0に戻す(時刻t5)。
このように、関数呼出変化検知部822は、保護回数843の値を超えて、連続して変化疑診判定が行われない限り、スレッド130によるフック対象関数812の呼出頻度が変化したとは判定しないため、フック対象関数群811と監視周期410が監視設定値計算部820による再計算が頻繁に行われ、生存報告処理860等が頻発してCPU20のCPU使用時間を大量に消費することを防ぐことができる。換言すれば、監視設定プログラム180は、フック対象関数812の関数の呼び出しパターンの変化が振動した場合には、フック対象関数812及び監視周期410の再計算を禁止して、計算機システム10のリソースを無駄に消費するのを防止する。
関数呼出変化検知部822が、スレッド130によるフック対象関数812の呼出頻度の変化を検出する処理を図21に示す。図21は、関数呼出変化検知部822で行われる処理の一例を示すフローチャートである。
ステップ1101において、関数呼出変化検知部822は、平均呼出率920の予測分布が構築済みであるか否かを判定する。前記の予測分布とは、平均が呼出率予測値851であり、標準偏差が呼出率偏差値852である正規分布である。したがって、予測分布は、呼出率予測値851と呼出率偏差値852が計算済みであれば、構築済みであると云える。予測分布が構築されていない、すなわち呼出率予測値851と呼出率偏差値852が計算されていない場合、ステップ1102において、関数呼出変化検知部822は、平均呼出率920を呼出率予測値851に代入し、呼出率偏差値852に呼出率偏差940を代入することで、予測分布を構築する。予測分布は次の(5)式で表される。
Figure 2014182561
上記(5)式で、Xは予測分布に従う確率変数であり、λ(0)は平均呼出率920であり、σは呼出率偏差940である。
ステップ1103において、平均呼出率920が、前述の予測分布から計算される予測範囲内であるか否かを判定する。前記の予測範囲は、次の(6)式で計算される範囲である。
Figure 2014182561
上記(6)式で、nは関数呼出変化検知部822が実施した、スレッド130によるフック対象関数812の呼出頻度の変化の検出処理の回数である。また、μ(n)は呼出率予測値851であり、τ(n)は呼出率偏差値852であり、δは検知閾値841である。すなわち、前記の予測範囲は、呼出率偏差値852を中心とした検知閾値841×呼出率偏差値852の範囲である。
例として、検知閾値841が“1”であると、予測分布は正規分布であるため、平均呼出率920が前記の予測範囲に入る確率は、約68%であり、検知閾値841が“2”であると、前記の確率は約95%になる。
ステップ1103において、平均呼出率920(λ)が、前述の予測分布から計算される予測範囲内を判定し、予測範囲内である場合、関数呼出変化検知部822は、以後のステップ1110、ステップ1111、ステップ1112において、平均呼出率920の予測分布を更新する。予測分布の更新は、既存の予測分布に対し、平均呼出率920の最新の値の情報を、ベイズ更新により反映させ、将来の平均呼出率920を予測する。なお、ベイズ更新とは、“ベイズ統計入門”(繁枡算男著、東京大学出版会、1985年4月発行)等に開示される周知の統計手法である。
予測分布の更新処理として、ステップ1110において、関数呼出変化検知部822は、連続疑診回数853を0に戻し、ステップ1111において、呼出率予測値1251を、次の(7)式により更新する。
Figure 2014182561
そして、ステップ1112において、関数呼出変化検知部822は、呼出率偏差値1252を次の(8)式により更新する。
Figure 2014182561
上記ステップ1103において、関数呼出変化検知部822は、平均呼出率920が、前述の予測分布から計算される予測範囲内を判定し、予測範囲を外れた場合、変化疑診と判定し、ステップ1120にて連続疑診回数853に“1”を加算する。
ステップ1121において、関数呼出変化検知部822は、連続疑診回数853が、保護回数843を超過しているか否かを判定する。連続疑診回数853が保護回数843を超過している場合、関数呼出変化検知部822は、スレッド130によるフック対象関数812の呼出頻度が変化したと判定し、フック対象関数群811が最早有効に機能しなくなったと判定する。
ステップ1122にて、関数呼出変化検知部822は、フック対象関数群811を含む関数呼出統計情報170を全て初期状態に戻し、ステップ130が呼び出す関数の統計情報を取得し直す。その後、ステップ1123で、呼出率予測値1251と呼出率偏差値1252を初期状態に戻し、これまで使用していた予測分布を破棄する。
第二の実施例によれば、計算機システム10の稼働状態に変化により、スレッド130がフック対象関数群811に含まれる任意のフック対象関数812の呼出パターンが変化した場合に、関数呼出変化検知部822がこの変化を検知する。そして、監視設定プログラム180では、再度フック対象関数群811と監視周期410を計算し設定し直すことで、計算機システム10の稼働状態の如何に関わらず、常に目標呼出確率831で、監視スレッド140が、スレッド130の異常状態を正しく検知できる。
また、スレッド130がフック対象関数群811に含まれるフック対象関数812の呼出パターンの変化を、関数呼出変化検知部822が自動的に検出するため、計算機システム10の使用者または管理者が、計算機システム10の稼働後に、死活監視の設定を一切行う必要がない。これにより、死活監視のメインテナンスを不要にして、死活監視の運用に関するコストを低減できる。
なお、上記では関数フック部810が書き込んだ関数呼出統計情報170を監視設定プログラム180が利用する例を示したが、過去に生成した関数呼出統計情報170を監視設定プログラム180で利用するようにしても良い。この場合、アプリケーションやOSに応じて生成しておいた関数呼出統計情報170を選択して利用するようにしても良い。
また、各プロセスやデータ(情報)はメモリ30に保持される例を示したが、メモリ30またはストレージ40の双方に保持されていても良い。この場合、メモリ30とストレージ40を併せて記憶部として、記憶部に各プロセスやデータ(情報)を保持するようにしても良い。
なお、本発明において説明した計算機等の構成、処理部及び処理手段等は、それらの一部又は全部を、専用のハードウェアによって実現してもよい。
また、本実施例で例示した種々のソフトウェアは、電磁的、電子的及び光学式等の種々の記録媒体(例えば、非一時的な記憶媒体)に格納可能であり、インターネット等の通信網を通じて、コンピュータにダウンロード可能である。
また、本発明は上記した実施例に限定されるものではなく、様々な変形例が含まれる。例えば、上記した実施例は本発明をわかりやすく説明するために詳細に説明したものであり、必ずしも説明した全ての構成を備えるものに限定されるものではない。
10 計算機システム
20 CPU
30 メモリ
100 監視プロセス
120 プロセス
130 スレッド
140 監視スレッド
150 プロセス・スレッド監視情報
160 スレッド監視情報
170 関数呼出統計情報
180 監視設定プログラム
800 標準ライブラリ
810 関数フック部
820 監視設定値計算部
821 監視設定部
822 関数呼出変化検知部

Claims (10)

  1. 1以上のプロセスと、前記プロセスを構成する1以上のスレッドを実行する計算機システムであって、
    前記計算機システムは、
    前記プロセス、スレッド及びライブラリを保持する記憶部と、
    前記プロセス及びスレッドを実行する1以上のプロセッサと、を備え、
    前記ライブラリは、
    前記スレッドが呼び出す関数を有し、
    前記プロセスは、
    第1のプロセスと、前記第1のプロセスを監視する監視プロセスと、前記第1のプロセスの監視条件を設定する監視設定部と、を含み、
    前記第1のプロセスは、
    前記第1のプロセスの処理を実行する1以上の第1のスレッドと、
    前記第1のスレッドを監視する監視スレッドと、
    前記第1のスレッドが前記ライブラリから所定の関数を呼び出すと、当該関数をフックして所定の処理を実行する関数フック部と、を含み、
    前記監視設定部は、
    前記関数フック部に、前記第1のスレッドが前記ライブラリから呼び出す関数の内、前記フックする対象の関数をフック対象関数として設定し、
    前記関数フック部は、
    前記第1のスレッドが、前記ライブラリから前記フック対象関数を呼び出したときには、前記記憶部に保持されて前記第1のスレッドが正常であることを示す第1の生存情報を更新し、
    前記監視スレッドは、
    第1の監視周期となるたびに、前記記憶部に保持されて前記第1のプロセスが正常であることを示す第2の生存情報を更新し、
    前記第1の監視周期となるたびに、前記記憶部から前記第1の生存情報を読み込んで、前記第1の生存情報が更新されたか否かを判定し、前記第1の生存情報が更新されていない場合には、前記第1のスレッドに異常が発生したことを示す異常スレッド情報を前記記憶部に書き込み、
    前記監視プロセスは、
    第2の監視周期となるたびに、前記記憶部から前記第2の生存情報を読み込んで、前記第2の生存情報が更新されたか否かを判定し、前記第2の生存情報が更新されていない場合には、前記第1のプロセスに異常が発生したことを判定し、
    前記第2の監視周期となるたびに、前記記憶部から異常スレッド情報を読み込んで、異常スレッド情報の有無を判定し、異常スレッド情報が存在する場合には、前記第1のスレッドに異常が発生した情報を出力することを特徴とする計算機システム。
  2. 請求項1に記載の計算機システムであって、
    前記関数フック部は、
    前記第1のスレッドが前記ライブラリから呼び出した関数を、前記記憶部に保持された関数呼出統計情報に蓄積し、
    前記監視設定部は、
    前記第1の監視周期内に、前記第1のスレッドがフック対象関数を呼び出す呼出確率の目標値である目標呼出確率と、前記第1の監視周期の上限である監視周期上限とを前記記憶部に保持し、
    前記関数呼出統計情報に蓄積された関数のうち、前記第1の監視周期内に前記第1のスレッドが、前記フック対象関数の関数を呼び出す呼出確率が前記目標呼出確率以上となる条件を満たす関数を前記フック対象関数として設定し、前記監視周期上限以内で前記呼出確率が前記目標呼出確率以上となる第1の監視周期を設定することを特徴とする計算機システム。
  3. 請求項2に記載の計算機システムであって、
    前記監視設定部は、
    前記フック対象関数の関数を呼び出す頻度である呼出率を検出し、前記呼出率を予測する予測分布を構築するための呼出率予測値と呼出率偏差値を算出し、前記呼出率予測値と前記呼出率偏差値とから、前記呼出率が取り得る予測範囲を算出し、前記フック対象関数に含まれる関数の呼び出しパターンの変化を検知したときには、前記フック対象関数と、前記第1の監視周期とを再計算することを特徴とする計算機システム。
  4. 請求項3に記載の計算機システムであって、
    前記監視設定部は、
    前記フック対象関数に含まれる関数の呼び出しパターンの変化を検知したときには、前記パターンの変化方向に応じて、前記関数呼出統計情報をプリセット値に切り替えることを特徴とする計算機システム。
  5. 請求項3に記載の計算機システムであって、
    前記監視設定部は、
    前記フック対象関数に含まれる関数の呼び出しパターンの変化が振動した場合には、前記フック対象関数及び前記第1の監視周期の再計算を禁止することを特徴とする計算機システム。
  6. 1以上のプロセッサと記憶部を備えた計算機で、1以上のプロセスと、前記プロセスを構成する1以上のスレッドを監視するプロセス及びスレッドの監視方法であって、
    前記記憶部は、
    前記プロセス、スレッド及びライブラリを保持し、
    前記プロセッサは、
    前記プロセス及びスレッドを実行し、
    前記ライブラリは、
    前記スレッドが呼び出す関数を有し、
    前記プロセスは、
    第1のプロセスと、前記第1のプロセスを監視する監視プロセスと、前記第1のプロセスの監視条件を設定する監視設定部と、を含み、
    前記第1のプロセスは、
    前記第1のプロセスの処理を実行する1以上の第1のスレッドと、
    前記第1のスレッドを監視する監視スレッドと、
    前記第1のスレッドが前記ライブラリから所定の関数を呼び出すと、当該関数をフックして所定の処理を実行する関数フック部と、を含み、
    前記方法は、
    前記監視設定部が、前記関数フック部に、前記第1のスレッドが前記ライブラリから呼び出す関数の内、前記フックする対象の関数をフック対象関数として設定する第1のステップと、
    前記関数フック部は、前記第1のスレッドが、前記ライブラリから前記フック対象関数を呼び出したときには、前記記憶部に保持されて前記第1のスレッドが正常であることを示す第1の生存情報を更新する第2のステップと、
    前記監視スレッドは、第1の監視周期となるたびに、前記記憶部に保持されて前記第1のプロセスが正常であることを示す第2の生存情報を更新する第3のステップと、
    前記監視スレッドは、前記第1の監視周期となるたびに、前記記憶部から前記第1の生存情報を読み込んで、前記第1の生存情報が更新されたか否かを判定し、前記第1の生存情報が更新されていない場合には、前記第1のスレッドに異常が発生したことを示す異常スレッド情報を前記記憶部に書き込む第4のステップと、
    前記監視プロセスは、第2の監視周期となるたびに、前記記憶部から前記第2の生存情報を読み込んで、前記第2の生存情報が更新されたか否かを判定し、前記第2の生存情報が更新されていない場合には、前記第1のプロセスに異常が発生したことを判定する第5のステップと、
    前記監視プロセスは、前記第2の監視周期となるたびに、前記記憶部から異常スレッド情報を読み込んで、異常スレッド情報の有無を判定し、異常スレッド情報が存在する場合には、前記第1のスレッドに異常が発生した情報を出力する第6のステップと、
    を含むことを特徴とするプロセス及びスレッドの監視方法。
  7. 請求項6に記載のプロセス及びスレッドの監視方法であって、
    前記第1のステップは、
    前記関数フック部が、前記第1のスレッドが前記ライブラリから呼び出した関数を、前記記憶部に保持された関数呼出統計情報に蓄積するステップと、
    前記監視設定部が、前記第1の監視周期内に、前記第1のスレッドがフック対象関数を呼び出す呼出確率の目標値である目標呼出確率と、前記第1の監視周期の上限である監視周期上限とを前記記憶部に保持するステップと、
    前記監視設定部が、前記関数呼出統計情報に蓄積された関数のうち、前記第1の監視周期内に前記第1のスレッドが、前記フック対象関数の関数を呼び出す呼出確率が前記目標呼出確率以上となる条件を満たす関数を前記フック対象関数として設定し、前記監視周期上限以内で前記呼出確率が前記目標呼出確率以上となる第1の監視周期を設定するステップと、
    を含むことを特徴とするプロセス及びスレッドの監視方法。
  8. 請求項7に記載のプロセス及びスレッドの監視方法であって、
    前記監視設定部は、前記フック対象関数の関数を呼び出す頻度である呼出率を検出し、前記呼出率を予測する予測分布を構築するための呼出率予測値と呼出率偏差値を算出し、前記呼出率予測値と前記呼出率偏差値とから、前記呼出率が取り得る予測範囲を算出し、前記フック対象関数に含まれる関数の呼び出しパターンの変化を検知したときには、前記フック対象関数と、前記第1の監視周期とを再計算することを特徴とするプロセス及びスレッドの監視方法。
  9. 請求項8に記載のプロセス及びスレッドの監視方法であって、
    前記監視設定部は、前記フック対象関数に含まれる関数の呼び出しパターンの変化を検知したときには、前記パターンの変化方向に応じて、前記関数呼出統計情報をプリセット値に切り替えることを特徴とするプロセス及びスレッドの監視方法。
  10. 請求項8に記載のプロセス及びスレッドの監視方法であって、
    前記監視設定部は、前記フック対象関数に含まれる関数の呼び出しパターンの変化が振動した場合には、前記フック対象関数及び前記第1の監視周期の再計算を禁止することを特徴とするプロセス及びスレッドの監視方法。
JP2013056258A 2013-03-19 2013-03-19 計算機システム、プロセス及びスレッドの監視方法 Ceased JP2014182561A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2013056258A JP2014182561A (ja) 2013-03-19 2013-03-19 計算機システム、プロセス及びスレッドの監視方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2013056258A JP2014182561A (ja) 2013-03-19 2013-03-19 計算機システム、プロセス及びスレッドの監視方法

Publications (1)

Publication Number Publication Date
JP2014182561A true JP2014182561A (ja) 2014-09-29

Family

ID=51701221

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2013056258A Ceased JP2014182561A (ja) 2013-03-19 2013-03-19 計算機システム、プロセス及びスレッドの監視方法

Country Status (1)

Country Link
JP (1) JP2014182561A (ja)

Cited By (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP6126259B1 (ja) * 2016-02-25 2017-05-10 日本電信電話株式会社 監視装置、監視方法、及びプログラム
JP2017182115A (ja) * 2016-03-28 2017-10-05 日本電気株式会社 情報処理装置、プロセス切り替え方法及びプログラム
JP2018537779A (ja) * 2015-11-19 2018-12-20 ディスペース デジタル シグナル プロセッシング アンド コントロール エンジニアリング ゲゼルシャフト ミット ベシュレンクテル ハフツングdspace digital signal processing and control engineering GmbH 制御装置の動作方法ならびに外部バイパスのために設計されている制御装置
JP2021118960A (ja) * 2021-05-19 2021-08-12 株式会社ユニバーサルエンターテインメント 遊技機
JP2021118961A (ja) * 2021-05-19 2021-08-12 株式会社ユニバーサルエンターテインメント 遊技機
CN113434362A (zh) * 2021-06-24 2021-09-24 广州欢网科技有限责任公司 Android程序发生异常时自动预警的方法及装置
CN115373834A (zh) * 2021-05-27 2022-11-22 北京火山引擎科技有限公司 一种基于进程调用链的入侵检测方法
JP2022177949A (ja) * 2021-05-19 2022-12-02 株式会社ユニバーサルエンターテインメント 遊技機
JP2022177948A (ja) * 2021-05-19 2022-12-02 株式会社ユニバーサルエンターテインメント 遊技機
JP2022177951A (ja) * 2021-05-19 2022-12-02 株式会社ユニバーサルエンターテインメント 遊技機
JP2022177962A (ja) * 2021-05-19 2022-12-02 株式会社ユニバーサルエンターテインメント 遊技機
JP2022177954A (ja) * 2021-05-19 2022-12-02 株式会社ユニバーサルエンターテインメント 遊技機
JP2022177963A (ja) * 2021-05-19 2022-12-02 株式会社ユニバーサルエンターテインメント 遊技機
JP2022177950A (ja) * 2021-05-19 2022-12-02 株式会社ユニバーサルエンターテインメント 遊技機

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS6072039A (ja) * 1983-09-28 1985-04-24 Fujitsu Ltd マルチタスクプログラムの正常動作監視方法
JPH05224998A (ja) * 1992-02-17 1993-09-03 Nec Corp アプリケーション・タスクの障害検出方式
JP2009289054A (ja) * 2008-05-29 2009-12-10 Toshiba Corp クラスタシステム向けサーバ計算機及びアプリケーションクラスタ化可能性判定支援プログラム
JP2013114359A (ja) * 2011-11-25 2013-06-10 Hitachi Ltd 計算機システム、および、監視方法

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS6072039A (ja) * 1983-09-28 1985-04-24 Fujitsu Ltd マルチタスクプログラムの正常動作監視方法
JPH05224998A (ja) * 1992-02-17 1993-09-03 Nec Corp アプリケーション・タスクの障害検出方式
JP2009289054A (ja) * 2008-05-29 2009-12-10 Toshiba Corp クラスタシステム向けサーバ計算機及びアプリケーションクラスタ化可能性判定支援プログラム
JP2013114359A (ja) * 2011-11-25 2013-06-10 Hitachi Ltd 計算機システム、および、監視方法

Cited By (24)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2018537779A (ja) * 2015-11-19 2018-12-20 ディスペース デジタル シグナル プロセッシング アンド コントロール エンジニアリング ゲゼルシャフト ミット ベシュレンクテル ハフツングdspace digital signal processing and control engineering GmbH 制御装置の動作方法ならびに外部バイパスのために設計されている制御装置
JP6126259B1 (ja) * 2016-02-25 2017-05-10 日本電信電話株式会社 監視装置、監視方法、及びプログラム
JP2017151765A (ja) * 2016-02-25 2017-08-31 日本電信電話株式会社 監視装置、監視方法、及びプログラム
JP2017182115A (ja) * 2016-03-28 2017-10-05 日本電気株式会社 情報処理装置、プロセス切り替え方法及びプログラム
JP7345878B2 (ja) 2021-05-19 2023-09-19 株式会社ユニバーサルエンターテインメント 遊技機
JP7270278B2 (ja) 2021-05-19 2023-05-10 株式会社ユニバーサルエンターテインメント 遊技機
JP7360192B2 (ja) 2021-05-19 2023-10-12 株式会社ユニバーサルエンターテインメント 遊技機
JP7049509B2 (ja) 2021-05-19 2022-04-06 株式会社ユニバーサルエンターテインメント 遊技機
JP7125525B2 (ja) 2021-05-19 2022-08-24 株式会社ユニバーサルエンターテインメント 遊技機
JP7356170B2 (ja) 2021-05-19 2023-10-04 株式会社ユニバーサルエンターテインメント 遊技機
JP2022177949A (ja) * 2021-05-19 2022-12-02 株式会社ユニバーサルエンターテインメント 遊技機
JP2022177948A (ja) * 2021-05-19 2022-12-02 株式会社ユニバーサルエンターテインメント 遊技機
JP2022177951A (ja) * 2021-05-19 2022-12-02 株式会社ユニバーサルエンターテインメント 遊技機
JP2022177962A (ja) * 2021-05-19 2022-12-02 株式会社ユニバーサルエンターテインメント 遊技機
JP2022177954A (ja) * 2021-05-19 2022-12-02 株式会社ユニバーサルエンターテインメント 遊技機
JP2022177963A (ja) * 2021-05-19 2022-12-02 株式会社ユニバーサルエンターテインメント 遊技機
JP2022177950A (ja) * 2021-05-19 2022-12-02 株式会社ユニバーサルエンターテインメント 遊技機
JP2021118961A (ja) * 2021-05-19 2021-08-12 株式会社ユニバーサルエンターテインメント 遊技機
JP2021118960A (ja) * 2021-05-19 2021-08-12 株式会社ユニバーサルエンターテインメント 遊技機
JP7345879B2 (ja) 2021-05-19 2023-09-19 株式会社ユニバーサルエンターテインメント 遊技機
JP7345880B2 (ja) 2021-05-19 2023-09-19 株式会社ユニバーサルエンターテインメント 遊技機
JP7345881B2 (ja) 2021-05-19 2023-09-19 株式会社ユニバーサルエンターテインメント 遊技機
CN115373834A (zh) * 2021-05-27 2022-11-22 北京火山引擎科技有限公司 一种基于进程调用链的入侵检测方法
CN113434362A (zh) * 2021-06-24 2021-09-24 广州欢网科技有限责任公司 Android程序发生异常时自动预警的方法及装置

Similar Documents

Publication Publication Date Title
JP2014182561A (ja) 計算機システム、プロセス及びスレッドの監視方法
US10860714B2 (en) Technologies for cache side channel attack detection and mitigation
US9229902B1 (en) Managing update deployment
US9652332B2 (en) Information processing apparatus and virtual machine migration method
EP2414932B1 (en) Execution of a plugin according to plugin stability level
US20040003319A1 (en) Logically partitioned computer system and method for controlling configuration of the same
US7836344B2 (en) Method for automatic dump assurance
US9191296B2 (en) Network event management
JP6387747B2 (ja) 情報処理装置、障害回避方法およびコンピュータプログラム
JP4573179B2 (ja) 性能負荷異常検出システム、性能負荷異常検出方法、及びプログラム
JP5648187B2 (ja) 計算機システム、および、監視方法
US20160357623A1 (en) Abnormality detection method and information processing apparatus
US20120072779A1 (en) Memory leak monitoring device and method for monitoring memory leak
CN110674149B (zh) 业务数据处理方法、装置、计算机设备和存储介质
JP6504610B2 (ja) 処理装置、方法及びプログラム
JP2016076072A (ja) 障害通報装置、障害通報方法及び障害通報プログラム
CN111897626A (zh) 一种面向云计算场景的虚拟机高可靠系统和实现方法
CN112052088A (zh) 自适应的进程cpu资源限制方法、装置、终端及存储介质
CN114253825B (zh) 内存泄漏检测方法、装置、计算机设备和存储介质
CN114116230A (zh) 一种资源管理方法、装置、设备、介质及产品
JP2006227962A (ja) アプリケーションタスク監視システムおよび方法
CN111857689A (zh) 一种框架、框架的功能配置方法、终端及存储介质
EP3070610B1 (en) Information processing device, control method thereof, and recording medium
JP6812831B2 (ja) 監視装置、監視システム、監視方法、及びプログラム
JP2005293164A (ja) タスク監視方式

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20150722

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20160516

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20160524

A045 Written measure of dismissal of application

Free format text: JAPANESE INTERMEDIATE CODE: A045

Effective date: 20160927