(57)【要約】【課題】ダンプ採取を効率的に高速化する。【解決手段】情報処理装置１０は、複数のプロセッサとメモリ１３とを有する。情報処理装置１０は、複数のプロセッサのうちのプロセッサ１１でエラーが検出された場合に、プロセッサ１１を用いてメモリ１３からのダンプ採取１４を開始する。情報処理装置１０は、ダンプ採取１４の進行に応じて、複数のプロセッサのうちのプロセッサ１２を動作させ、プロセッサ１１，１２を用いてダンプ採取１４を継続する。【選択図】図１
2017021625.tif 000002
【特許請求の範囲】
【請求項１】
複数のプロセッサとメモリとを有するコンピュータに、
前記複数のプロセッサのうちの第１のプロセッサでエラーが検出された場合に、前記第１のプロセッサを用いて前記メモリからのダンプ採取を開始し、
前記ダンプ採取の進行に応じて、前記複数のプロセッサのうちの第２のプロセッサを動作させ、前記第１および第２のプロセッサを用いて前記ダンプ採取を継続する、
処理を実行させるダンプ採取プログラム。
【請求項２】
前記メモリのうち前記ダンプ採取によって処理済みの領域の大きさが閾値を超えた後に、前記第２のプロセッサを前記ダンプ採取に用いる、
請求項１記載のダンプ採取プログラム。
【請求項３】
前記第２のプロセッサが初期化可能かチェックし、初期化不可の場合には前記第２のプロセッサを前記ダンプ採取に用いるプロセッサから除外する、
請求項１記載のダンプ採取プログラム。
【請求項４】
前記メモリのうち第１の領域を用いて前記ダンプ採取を開始し、
前記メモリのうち前記ダンプ採取によって処理済みの第２の領域を前記ダンプ採取に割り当て、前記第１および第２の領域を用いて前記ダンプ採取を継続する、
請求項１記載のダンプ採取プログラム。
【請求項５】
前記第２の領域が正常にアクセス可能かチェックし、正常にアクセス可能でない場合には前記第２の領域を前記ダンプ採取に用いる領域から除外する、
請求項４記載のダンプ採取プログラム。
【請求項６】
複数のプロセッサとメモリとを有するコンピュータが行うダンプ採取方法であって、
前記複数のプロセッサのうちの第１のプロセッサでエラーが検出された場合に、前記第１のプロセッサを用いて前記メモリからのダンプ採取を開始し、
前記ダンプ採取の進行に応じて、前記複数のプロセッサのうちの第２のプロセッサを動作させ、前記第１および第２のプロセッサを用いて前記ダンプ採取を継続する、
ダンプ採取方法。
【請求項７】
メモリと、
エラーを検出した場合に前記メモリからのダンプ採取を開始する第１のプロセッサと、
前記ダンプ採取の進行に応じて、前記第１のプロセッサよりも遅れて動作を開始し、前記第１のプロセッサと共に前記ダンプ採取を行う第２のプロセッサと、
を有する情報処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はダンプ採取プログラム、ダンプ採取方法および情報処理装置に関する。
【背景技術】
【０００２】
解消困難なエラーやオペレーティングシステム（ＯＳ：Operating System）のカーネルのエラーなどの重大なエラーがコンピュータに発生すると、そのまま処理を続けることが難しいため、コンピュータを停止または再起動することになる。そのとき、エラーの発生原因の分析が容易になるように、ＲＡＭ（Random Access Memory）などの揮発性のメモリに記憶されているデータを取得し、ＨＤＤ（Hard Disk Drive）やフラッシュメモリなどの不揮発性の記憶装置に「ダンプ」として保存することがある。ダンプは、ある時点にメモリに記憶されていたデータそのものであってもよい。後でダンプを分析することで、ハードウェアの故障やソフトウェアの不具合を発見できることがある。ダンプ採取は、例えば、ＯＳで重大なエラーが検出されたときにＯＳによって行われる。
【０００３】
なお、複数の処理プロセッサと制御プロセッサとを有する分散メモリ型並列処理システムのダンプ採取方法が提案されている。提案のダンプ採取方法では、ある処理プロセッサに障害が発生すると、制御プロセッサが全ての処理プロセッサの動作を停止させる。制御プロセッサは、障害が発生した処理プロセッサのメモリに正常な処理プロセッサのダンプを書き込み、ダンプの書き込みが完了すると正常な処理プロセッサを再起動する。ダンプの書き込み中に、障害が発生した処理プロセッサのメモリが満杯になった場合、制御プロセッサは、１つの正常な処理プロセッサのメモリに残りのダンプを書き込む。
【０００４】
また、２つのＣＰＵ（Central Processing Unit）と共有メモリと二次記憶装置を有する計算機システムの障害対応方法が提案されている。提案の障害対応方法では、一方のＣＰＵが通常ＯＳを実行し、他方のＣＰＵが障害対応ＯＳを実行する。通常ＯＳを実行するＣＰＵは、システム異常を検出すると、ダンプを共有メモリの所定領域に書き込み、障害対応ＯＳに障害発生を通知し、通常ＯＳを再起動する。障害対応ＯＳを実行するＣＰＵは、共有メモリの所定領域からダンプを読み込み、二次記憶装置にダンプを退避する。
【０００５】
また、異常が発生してから計算機システムを再起動するまでの時間を短縮するダンプ方法が提案されている。提案のダンプ方法では、計算機システムは、ＯＳで異常が検出されると、ＯＳのカーネルが使用するメモリ領域を変更してＯＳを再起動する。計算機システムは、再起動されたＯＳの実行と並行して、変更前にＯＳのカーネルが使用していたメモリ領域からダンプを採取してファイルに書き出す。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開平９−５０４２４号公報
【特許文献２】特開２００７−３３４４０３号公報
【特許文献３】特開２０１４−６６７６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
ダンプ採取を行うには、コンピュータは、採取したデータを一時的に格納するバッファをメモリに確保し、ダンプ採取プログラムをメモリにロードし、ダンプ採取プログラムを実行することになる。そこで、エラー検出時にダンプ採取を行えるようにする１つの方法として、メモリ領域などの計算リソースをダンプ採取用に予約しておき、予約した計算リソースは通常処理には使用せずにダンプ採取専用とする方法が考えられる。
【０００８】
しかし、ＯＳなどのソフトウェアによって使用されるメモリ領域が大きい場合、すなわち、ダンプの量が多くなる場合、限られた計算リソースだけでは処理能力不足によってダンプ採取に長時間を要してしまうことがある。一方、ダンプ採取用に予約する計算リソースを多くしてしまうと、計算リソースの使用効率が低下する。よって、従来はダンプ採取を高速化することが容易でなかったという問題がある。
【０００９】
１つの側面では、本発明は、ダンプ採取を効率的に高速化できるダンプ採取プログラム、ダンプ採取方法および情報処理装置を提供することを目的とする。
【課題を解決するための手段】
【００１０】
１つの態様では、複数のプロセッサとメモリとを有するコンピュータに以下の処理を実行させるダンプ採取プログラムが提供される。複数のプロセッサのうちの第１のプロセッサでエラーが検出された場合に、第１のプロセッサを用いてメモリからのダンプ採取を開始する。ダンプ採取の進行に応じて、複数のプロセッサのうちの第２のプロセッサを動作させ、第１および第２のプロセッサを用いてダンプ採取を継続する。
【００１１】
また、１つの態様では、複数のプロセッサとメモリとを有するコンピュータが行うダンプ採取方法が提供される。また、１つの態様では、メモリと第１のプロセッサと第２のプロセッサとを有する情報処理装置が提供される。
【発明の効果】
【００１２】
１つの側面では、ダンプ採取を効率的に高速化できる。
【図面の簡単な説明】
【００１３】
【図１】第１の実施の形態の情報処理装置を示す図である。
【図２】情報処理装置のハードウェア例を示すブロック図である。
【図３】ダンプ採取中のメモリ拡張の例を示す図である。
【図４】ダンプ採取中のＣＰＵ拡張の例を示す図である。
【図５】第２の実施の形態の情報処理装置の機能例を示すブロック図である。
【図６】メモリ故障テーブルの例を示す図である。
【図７】ＣＰＵ管理テーブルとメモリ管理テーブルの例を示す図である。
【図８】第２の実施の形態のダンプ採取の手順例を示すフローチャートである。
【図９】リソース拡張の手順例を示すフローチャートである。
【図１０】リソース拡張の手順例を示すフローチャート（続き）である。
【図１１】メモリ管理テーブルの更新例を示す図である。
【図１２】ＣＰＵ管理テーブルの更新例を示す図である。
【図１３】第３の実施の形態の情報処理装置の機能例を示すブロック図である。
【図１４】第３の実施の形態のダンプ採取の手順例を示すフローチャートである。
【発明を実施するための形態】
【００１４】
以下、本実施の形態を図面を参照して説明する。
［第１の実施の形態］
第１の実施の形態を説明する。
【００１５】
図１は、第１の実施の形態の情報処理装置を示す図である。
第１の実施の形態の情報処理装置１０は、プロセッサ１１，１２を含む複数のプロセッサとメモリ１３とを有する。プロセッサ１１，１２は、例えば、異なるＣＰＵ、同一ＣＰＵに属するＣＰＵコア、異なるＣＰＵに属するＣＰＵコアなどである。メモリ１３は、プロセッサ１１，１２によって使用される共有メモリであり、例えば、ＲＡＭなどの揮発性メモリである。プロセッサ１１，１２は、メモリ１３にプログラムをロードし、ロードされたプログラムを実行する。メモリ１３にロードされるプログラムには、ＯＳプログラム、アプリケーションプログラム、ダンプ採取プログラムなどが含まれる。
【００１６】
ここで、プロセッサ１１でエラーが検出されたとする。検出されるエラーには、解消困難なエラーやＯＳカーネルのエラーなどの重大なエラーが含まれる。重大なエラーの発生原因としては、例えば、一のプロセッサの故障、メモリ１３の中の一の領域の故障、ハードウェアを制御するデバイスドライバの不具合などが挙げられる。エラーは、例えば、プロセッサ１１によって実行されたＯＳによって検出される。
【００１７】
すると、情報処理装置１０は、エラーを検出したプロセッサ１１を用いてメモリ１３からのダンプ採取１４を開始する。例えば、プロセッサ１１がエラー検出前の処理を強制終了してダンプ採取プログラムを起動する。このとき、情報処理装置１０はプロセッサ１２を停止させており、まだプロセッサ１２をダンプ採取１４に使用しない。
【００１８】
プロセッサ１１は、例えば、メモリ１３の中の事前に予約された領域をダンプ採取１４に使用する。予約された領域は、ダンプ採取１４以外の用途には使用されない。ダンプ採取１４では、情報処理装置１０は、正常時に使用していた領域からデータを取得してダンプとして保存する。例えば、情報処理装置１０は、ＨＤＤやフラッシュメモリなどの不揮発性の記憶装置にダンプを保存する。ダンプを保存する不揮発性の記憶装置は、情報処理装置１０が備えていてもよいし、情報処理装置１０の外部に接続されていてもよい。
【００１９】
その後、情報処理装置１０は、ダンプ採取１４の進行に応じて、プロセッサ１２を動作させ、ダンプ採取１４に用いるプロセッサにプロセッサ１２を追加する。すなわち、プロセッサ１１よりも遅れて、プロセッサ１２にダンプ採取１４を行わせる。例えば、情報処理装置１０は、メモリ１３のうちダンプ採取１４によって処理済みの領域（データを取得済みの領域）の大きさが閾値を超えた場合など、処理済みの領域の増大に応じて、プロセッサ１２をダンプ採取１４に追加する。プロセッサ１２を追加するにあたり、例えば、情報処理装置１０は、処理済みの領域のデータを破棄してダンプ採取１４に割り当てる。これにより、事前に予約された領域よりも大きい領域をダンプ採取１４に使用できる。
【００２０】
以降、情報処理装置１０は、プロセッサ１１，１２を用いてダンプ採取１４を継続する。プロセッサ１１，１２は、ダンプ採取１４について負荷分散を行ってもよいし機能分散を行ってもよい。前者の場合、例えば、プロセッサ１１，１２は、メモリ１３の中の異なる領域に記憶されたデータを並列に処理する。後者の場合、例えば、プロセッサ１１，１２は、メモリ１３からのデータの採取、採取したデータの圧縮や暗号化、不揮発性の記憶装置へのデータの書き出しなどの異なる種類の処理を並列に実行する。
【００２１】
なお、情報処理装置１０は、プロセッサ１２をダンプ採取１４に追加する前に、プロセッサ１２が故障していないかチェックし、故障している場合にはプロセッサ１２の追加を回避するようにしてもよい。プロセッサ１２が正常であることは、例えば、プロセッサ１２を初期化させて所定時間以内に初期化が完了したことによって確認できる。なお、エラーを検出したプロセッサ１１は、故障していないと推定される。
【００２２】
また、情報処理装置１０は、メモリ１３の中の処理済みの領域をダンプ採取１４に追加する前に、その領域が故障していないかチェックし、故障している場合にはその領域の追加を回避するようにしてもよい。メモリ１３の一の領域が正常であることは、例えば、その領域にアクセスしてデータの読み書きを正常に行えたことによって確認できる。また、メモリ１３の一の領域が正常であることは、例えば、エラー検出前にＯＳが収集していたハードウェア情報を参照することによっても確認できる。
【００２３】
第１の実施の形態の情報処理装置１０によれば、エラーを検出したプロセッサ１１がダンプ採取１４を開始し、ダンプ採取１４の進行に応じて、後からプロセッサ１２を追加してプロセッサ１１，１２がダンプ採取１４を行う。これにより、プロセッサ１１のみを用いてダンプ採取１４を最後まで行う場合と比べて、ダンプ採取１４を高速化できる。
【００２４】
また、データ取得済みの領域が十分に大きくなってからプロセッサ１２を追加することで、バッファなどプロセッサ１２がダンプ採取１４に用いる領域を確保しやすくなり、メモリ不足が高速化のボトルネックになることを抑制できる。また、ダンプ採取１４に用いる領域を順次拡大できるようにすることで、事前に大きな領域を予約しておかなくてもよく、正常時のメモリ１３の使用効率を向上させることができる。
【００２５】
また、プロセッサ１２が故障していないことを確認してからプロセッサ１２をダンプ採取１４に追加することで、ダンプ採取１４を安全に高速化することができる。また、データ取得済みの領域が故障していないことを確認してから当該領域をダンプ採取１４に追加することで、ダンプ採取１４を安全に高速化することができる。
【００２６】
［第２の実施の形態］
次に、第２の実施の形態を説明する。
図２は、情報処理装置のハードウェア例を示すブロック図である。
【００２７】
第２の実施の形態の情報処理装置１００は、ＣＰＵ１０１ａ〜１０１ｄ、ＲＡＭ１０２、ＨＤＤ１０３、画像信号処理部１０４、入力信号処理部１０５、媒体リーダ１０６および通信インタフェース１０７を有する。上記ユニットはバス１０８に接続される。
【００２８】
ＣＰＵ１０１ａ〜１０１ｄは、プログラムの命令を実行する。ＣＰＵ１０１ａ〜１０１ｄは、並列にプロセスまたはスレッドを実行できる。ＣＰＵ１０１ａ〜１０１ｄは、ＨＤＤ１０３に記憶されたプログラムやデータの少なくとも一部をＲＡＭ１０２にロードし、プログラムを実行する。なお、ＣＰＵ１０１ａ〜１０１ｄは、同一または異なるＣＰＵに属するＣＰＵコアであってもよい。各ＣＰＵコアを「ＣＰＵ」と呼ぶことがある。また、各ＣＰＵまたは各ＣＰＵコアを「プロセッサ」と呼ぶことがある。また、ＣＰＵの集合またはＣＰＵコアの集合（マルチプロセッサ）を「プロセッサ」と呼ぶことがある。情報処理装置１００が備えるＣＰＵまたはＣＰＵコアの数は、２以上の任意でよい。
【００２９】
ＲＡＭ１０２は、ＣＰＵ１０１ａ〜１０１ｄが実行するプログラムや演算に用いられるデータを一時的に記憶する揮発性の半導体メモリである。なお、情報処理装置１００は、ＲＡＭ以外の種類のメモリを備えてもよく、複数個のメモリを備えてもよい。
【００３０】
ＨＤＤ１０３は、ＯＳやミドルウェアやアプリケーションソフトウェアなどのソフトウェアのプログラム、および、データを記憶する不揮発性の記憶装置である。プログラムには、ダンプ採取を制御するダンプ採取プログラムが含まれる。なお、情報処理装置１００は、フラッシュメモリやＳＳＤ（Solid State Drive）などの他の種類の記憶装置を備えてもよく、複数の不揮発性の記憶装置を備えてもよい。
【００３１】
画像信号処理部１０４は、ＣＰＵ１０１ａ〜１０１ｄからの命令に従って、情報処理装置１００に接続されたディスプレイ１１１に画像を出力する。ディスプレイ１１１としては、ＣＲＴ（Cathode Ray Tube）ディスプレイ、液晶ディスプレイ（ＬＣＤ：Liquid Crystal Display）、プラズマディスプレイ、有機ＥＬ（ＯＥＬ：Organic Electro-Luminescence）ディスプレイなどを用いることができる。
【００３２】
入力信号処理部１０５は、情報処理装置１００に接続された入力デバイス１１２から入力信号を取得し、ＣＰＵ１０１ａ〜１０１ｄに出力する。入力デバイス１１２としては、マウスやタッチパネルやタッチパッドやトラックボールなどのポインティングデバイス、キーボード、リモートコントローラ、ボタンスイッチなどを用いることができる。また、情報処理装置１００に、複数の種類の入力デバイスが接続されていてもよい。
【００３３】
媒体リーダ１０６は、記録媒体１１３に記録されたプログラムやデータを読み取る読み取り装置である。記録媒体１１３として、例えば、フレキシブルディスク（ＦＤ：Flexible Disk）やＨＤＤなどの磁気ディスク、ＣＤ（Compact Disc）やＤＶＤ（Digital Versatile Disc）などの光ディスク、光磁気ディスク（ＭＯ：Magneto-Optical disk）、半導体メモリなどを使用できる。媒体リーダ１０６は、例えば、記録媒体１１３から読み取ったプログラムやデータをＲＡＭ１０２またはＨＤＤ１０３に格納する。
【００３４】
通信インタフェース１０７は、ネットワーク１１４に接続され、ネットワーク１１４を介して他の情報処理装置と通信を行うインタフェースである。通信インタフェース１０７は、スイッチなどの通信装置とケーブルで接続される有線通信インタフェースでもよいし、基地局と無線リンクで接続される無線通信インタフェースでもよい。
【００３５】
なお、情報処理装置１００は、媒体リーダ１０６を備えていなくてもよく、ユーザが操作する他の情報処理装置から制御可能である場合には画像信号処理部１０４や入力信号処理部１０５を備えていなくてもよい。また、ディスプレイ１１１や入力デバイス１１２が、情報処理装置１００の筐体と一体に形成されてもよい。ＣＰＵ１０１ａ〜１０１ｄのうちの２つのＣＰＵは、第１の実施の形態のプロセッサ１１，１２に対応する。ＲＡＭ１０２は、第１の実施の形態のメモリ１３に対応する。
【００３６】
次に、情報処理装置１００によって行われるダンプ採取について説明する。
情報処理装置１００で実行されるＯＳには、正常時に情報処理装置１００を制御する運用カーネルと、異常時にダンプ採取を行うクラッシュカーネルとが含まれる。情報処理装置１００は、クラッシュカーネル用の領域を事前にＲＡＭ１０２に確保しておく。そして、情報処理装置１００は、ＲＡＭ１０２のうちクラッシュカーネル用に予約された領域を除く残りの領域を用いて、運用カーネルを実行する。
【００３７】
情報処理装置１００は、運用カーネルの実行中に重大なエラーが検出されると、運用カーネルを停止してクラッシュカーネルを起動する。重大なエラーには、ハードウェアからの応答がないこと、ハードウェアに依頼した処理が失敗し続けること、アクセスが禁止された計算リソースまたは存在しない計算リソースにアクセスしようとしたことなど、処理を続けることが難しいエラーが含まれる。重大なエラーの発生原因としては、ハードウェアの故障（ＣＰＵ１０１ａ〜１０１ｄの何れかの故障や、ＲＡＭ１０２の一部の領域の故障を含む）や、ハードウェアを制御するデバイスドライバの不具合などが考えられる。
【００３８】
情報処理装置１００は、ＣＰＵ１０１ａ〜１０１ｄのうちエラーを検出したＣＰＵと、事前に予約されたＲＡＭ１０２の領域とを用いて、クラッシュカーネルを開始する。クラッシュカーネルは、ＲＡＭ１０２から「ダンプ」を採取する。すなわち、クラッシュカーネルは、運用カーネル用の領域のデータをＲＡＭ１０２から読み込み、読み込んだデータをダンプとしてＨＤＤ１０３に保存する。ダンプは、ＲＡＭ１０２上のデータそのものでもよいし、当該データに対して圧縮・暗号化などの可逆変換を行ったものでもよい。
【００３９】
情報処理装置１００は、ダンプ採取の進行に応じて、クラッシュカーネルが使用するＲＡＭ１０２の領域を順次拡張し、また、クラッシュカーネルが使用するＣＰＵを順次拡張する。すなわち、情報処理装置１００は、運用カーネルの領域のうちダンプ採取済みの領域を解放し、クラッシュカーネルに割り当てる。また、情報処理装置１００は、クラッシュカーネルの領域が十分に大きくなると、ＣＰＵ１０１ａ〜１０１ｄのうち停止中の何れかのＣＰＵを初期化し、クラッシュカーネルに割り当てる。これにより、クラッシュカーネルが使用する計算リソースを増やすことができ、ダンプ採取を高速化できる。
【００４０】
図３は、ダンプ採取中のメモリ拡張の例を示す図である。
（Ａ）クラッシュカーネルに対して、ＲＡＭ１０２の領域２１が事前に予約されている。予約された領域２１は、運用カーネルからは使用されない。当初の領域２１は、クラッシュカーネルが１つのＣＰＵを用いてダンプ採取を行うのに要する最小限の大きさでよい。第２の実施の形態では、エラーが検出される前の正常時に予め、クラッシュカーネルのプログラムやデータの集合（クラッシュカーネルイメージ）がＨＤＤ１０３から領域２１にロードされている。これにより、エラー検出後に迅速にクラッシュカーネルを起動することができる。また、運用カーネルに対して、ＲＡＭ１０２の領域２２が割り当てられている。運用カーネルは、領域２２を用いて各種の処理を実行する。ただし、領域２２の一部分である領域２３がハードウェア的に故障した（正常に読み書きできなくなった）とする。
【００４１】
（Ｂ）運用カーネルがエラーを検出すると、運用カーネルが停止して、領域２１にロード済みのクラッシュカーネルイメージに基づいてクラッシュカーネルが起動する。クラッシュカーネルは、領域２１を用いて、領域２２からのダンプ採取を開始する。クラッシュカーネルに割り当てられた領域２１には、クラッシュカーネルのプログラム、領域２２から取得したデータを一時的に格納するバッファ、ダンプ採取を行うＣＰＵのページテーブルなどが記憶される。ダンプ採取を行うＣＰＵが増えるほど、クラッシュカーネルが要する領域も大きくなる。ダンプ採取が進行すると、領域２２の一部分である領域２４のダンプ採取が完了し、領域２４が運用カーネルから解放される。
【００４２】
（Ｃ）クラッシュカーネルは、解放された領域２４が故障していないかチェックする。故障のチェック方法は後述する。領域２４は故障していないため、クラッシュカーネルは、領域２４を領域２１に取り込み、クラッシュカーネルが使用する領域２１を拡張する。クラッシュカーネルは、取り込んだ領域２４を用いてバッファを拡張してもよいし、後述するように新たなＣＰＵをダンプ採取に使用してもよい。ダンプ採取を行うＣＰＵが増えると、当該ＣＰＵに対応するバッファやページテーブルなどが追加されることがある。
【００４３】
（Ｄ）クラッシュカーネルは、拡張された領域２１を用いて、領域２２からのダンプ採取を継続する。ダンプ採取が進行すると、領域２２の一部分である領域２３，２５のダンプ採取が完了し、領域２３，２５が運用カーネルから解放される。
【００４４】
（Ｅ）クラッシュカーネルは、解放された領域２３，２５が故障していないかチェックする。領域２５は故障していないため、クラッシュカーネルは、領域２５を領域２１に取り込み、クラッシュカーネルが使用する領域２１を拡張する。一方、領域２３は故障しているため、クラッシュカーネルは、領域２３を領域２１に取り込まずに放置する。これにより、クラッシュカーネルはＲＡＭ１０２の中の故障していない領域のみを使用することができ、ダンプ採取に用いる領域を安全に拡張できる。
【００４５】
図４は、ダンプ採取中のＣＰＵ拡張の例を示す図である。
（Ａ）運用カーネルに対して、ＣＰＵ１０１ａ〜１０１ｄ（ＣＰＵ０〜３）が割り当てられる。一方、正常時にはクラッシュカーネルは稼働していないため、クラッシュカーネルに対してＣＰＵが割り当てられていない。ＣＰＵ１０１ａ〜１０１ｄは、運用カーネルを実行する。ただし、ＣＰＵ１０１ｂがハードウェア的に故障したとする。また、運用カーネルはＣＰＵ１０１ｄを用いてエラーを検出したとする。
【００４６】
（Ｂ）運用カーネルがエラーを検出すると、運用カーネルはエラーを検出したＣＰＵ１０１ｄ以外のＣＰＵ１０１ａ〜１０１ｃを停止状態（ＨＡＬＴ状態）にする。ＨＡＬＴ状態では、プログラムの命令は実行されないが、ＣＰＵ１０１ａ〜１０１ｃの内部状態はまだ保持されている。ただし、ＣＰＵ１０１ｂは故障しているため、運用カーネルからの指示に反してＨＡＬＴ状態にならない可能性がある。そして、エラーを検出したＣＰＵ１０１ｄを用いてクラッシュカーネルが起動する。クラッシュカーネルは、ＣＰＵ１０１ａ〜１０１ｃがＨＡＬＴ状態であると仮定し、ダンプ採取を開始する。
【００４７】
（Ｃ）クラッシュカーネルは、ダンプ採取が進行してクラッシュカーネル用のＲＡＭ１０２の領域が十分に大きくなると、ダンプ採取を行うＣＰＵを増やすことを試みる。クラッシュカーネルは、ＣＰＵ１０１ａ〜１０１ｃのうちの１つとしてＣＰＵ１０１ａを選択し、ＣＰＵ１０１ａが故障していないかチェックする。例えば、クラッシュカーネルは、内部状態を消去する初期化をＣＰＵ１０１ａに指示し、ＣＰＵ１０１ａを初期化中状態（ＩＮＩＴ状態）にする。初期化を指示してから所定時間以内にＣＰＵ１０１ａの初期化が完了すると、クラッシュカーネルはＣＰＵ１０１ａが故障していないと判断する。
【００４８】
（Ｄ）ＣＰＵ１０１ａが故障していないことを確認すると、クラッシュカーネルは、ＣＰＵ１０１ａをクラッシュカーネルに組み込む。クラッシュカーネルは、ＣＰＵ１０１ａ，１０１ｄを並列に用いてダンプ採取を継続する。２以上のＣＰＵを用いた並列分散処理の形態としては、様々な形態が考えられる。例えば、２以上のＣＰＵが異なる領域のダンプ採取を並列に行う負荷分散が考えられる。また、例えば、２以上のＣＰＵがバッファリング・圧縮・暗号化などの異なる種類の処理を並列に行う機能分散が考えられる。
【００４９】
（Ｅ）クラッシュカーネルは、更にダンプ採取が進行してクラッシュカーネル用のＲＡＭ１０２の領域が十分に大きくなると、ダンプ採取を行うＣＰＵを増やすことを試みる。クラッシュカーネルは、ＣＰＵ１０１ｂ，１０１ｃのうちの１つとしてＣＰＵ１０１ｂを選択し、ＣＰＵ１０１ｂが故障していないかチェックする。例えば、クラッシュカーネルは、ＣＰＵ１０１ｂに初期化を指示し、ＣＰＵ１０１ｂをＩＮＩＴ状態にする。初期化を指示してから所定時間待ってもＣＰＵ１０１ｂの初期化が完了しない場合（ＩＮＩＴ失敗の場合）、クラッシュカーネルはＣＰＵ１０１ｂが故障していると判断する。
【００５０】
（Ｆ）ＣＰＵ１０１ｂが故障しているため、クラッシュカーネルは、ＣＰＵ１０１ｂをクラッシュカーネルに組み込まずに放置する。このとき、ＣＰＵ１０１ｂはクラッシュカーネルからの指示に応答しないため、ＣＰＵ１０１ｂの状態は不明である。そして、クラッシュカーネルは、ＣＰＵ１０１ｂに代えてＣＰＵ１０１ｃをクラッシュカーネルに組み込みことを試みてもよい。これにより、クラッシュカーネルは故障していないＣＰＵのみを使用することができ、ダンプ採取に用いる演算能力を安全に拡張できる。
【００５１】
次に、情報処理装置１００のダンプ採取機能について説明する。
図５は、第２の実施の形態の情報処理装置の機能例を示すブロック図である。
情報処理装置１００は、運用カーネル１２０、ブートローダ１３０およびクラッシュカーネル１４０を有する。運用カーネル１２０およびクラッシュカーネル１４０は、ＯＳに含まれる。ブートローダ１３０は、ＯＳの外部に存在する。
【００５２】
運用カーネル１２０は、故障テーブル記憶部１２１、事前ロード部１２２、故障検出部１２３およびカーネル停止部１２４を有する。故障テーブル記憶部１２１は、ＲＡＭ１０２またはＨＤＤ１０３に確保した領域を用いて実現できる。故障検出部１２３およびカーネル停止部１２４は、ＣＰＵ１０１ａ〜１０１ｄが実行するプログラムモジュールを用いて実現できる。
【００５３】
故障テーブル記憶部１２１は、ＲＡＭ１０２に含まれる物理ページのうち故障していると判断された物理ページを示すメモリ故障テーブルを記憶する。物理ページは、所定の大きさの単位領域であり、例えば、４キロバイトの領域である。
【００５４】
事前ロード部１２２は、ＨＤＤ１０３から、ＲＡＭ１０２上に確保されたクラッシュカーネル１４０用の領域に、クラッシュカーネルイメージをロードする。クラッシュカーネルイメージには、クラッシュカーネル１４０を実現するプログラムが含まれる。事前ロード部１２２は、クラッシュカーネルイメージをロードする前またはロードした後、クラッシュカーネルイメージのハッシュ値を算出し、クラッシュカーネル１４０用の領域にハッシュ値を保存しておく。ハッシュ値の算出には、例えば、ＳＨＡ（Secure Hash Algorithm）−２５６が用いられる。
【００５５】
事前ロード部１２２の処理は、例えば、運用カーネル１２０の起動後に呼び出されるユーザランドのシステムサービスとして実現することができる。クラッシュカーネルイメージを事前にＲＡＭ１０２にロードしておくことで、エラー検出後に迅速にクラッシュカーネル１４０を起動することができる。また、ＨＤＤ１０３の故障が原因でクラッシュカーネル１４０の起動が阻害されてしまうリスクを低減できる。また、ＨＤＤ１０３へのアクセスはデバイスドライバやファイルシステムなど様々なモジュールに依存する一方、ＲＡＭ１０２へのアクセスはこのようなモジュールに依存せず、処理を簡潔化できる。
【００５６】
故障検出部１２３は、運用カーネル１２０の実行中（正常時）に、ＲＡＭ１０２の一の領域のアクセスに失敗したことを検出する。アクセスの失敗には、データの書き込みの失敗とデータの読み出しの失敗とが含まれる。故障検出部１２３は、一の領域のアクセスに失敗すると、当該一の領域を含む物理ページがハードウェア的に故障したと判断し、故障テーブル記憶部１２１に記憶されたメモリ故障テーブルを更新する。故障検出部１２３による故障の監視は、運用カーネル１２０の実行中に継続的に行われる。なお、故障検出部１２３は、ＯＳの中のＭＣＥ（Machine Check Error）という機能を用いて実現できる。
【００５７】
カーネル停止部１２４は、処理を続けることが難しい重大なエラーを検出すると、運用カーネル１２０を停止し、エラーを検出したＣＰＵ以外の他のＣＰＵをＨＡＬＴ状態にする。また、カーネル停止部１２４は、ブートローダ１３０を呼び出す。
【００５８】
ブートローダ１３０は、ＯＳの起動を制御する。例えば、ブートローダ１３０は、情報処理装置１００の電源がＯＮになると、ＯＳに含まれる運用カーネル１２０を呼び出す。ブートローダ１３０は、カーネル診断部１３１およびカーネル起動部１３２を有する。カーネル診断部１３１およびカーネル起動部１３２は、プログラムモジュールを用いて実現できる。
【００５９】
カーネル診断部１３１は、運用カーネル１２０から呼び出されると、ＲＡＭ１０２上にロードされているクラッシュカーネルイメージが破損していないか確認する。具体的には、カーネル診断部１３１は、ロード済みのクラッシュカーネルイメージのハッシュ値（例えば、ＳＨＡ−２５６のハッシュ値）を、事前ロード部１２２と同様の方法で算出する。そして、カーネル診断部１３１は、事前ロード部１２２によってクラッシュカーネル１４０用の領域に保存されたハッシュ値と、カーネル診断部１３１が算出したハッシュ値とを比較する。両者が一致する場合はクラッシュカーネルイメージが破損していないと判断され、両者が一致しない場合はクラッシュカーネルイメージが破損していると判断される。
【００６０】
カーネル起動部１３２は、カーネル診断部１３１によってクラッシュカーネルイメージが破損していないと判断されると、当該クラッシュカーネルイメージに基づいてクラッシュカーネル１４０を起動する。カーネル起動部１３２は、ロード済みのクラッシュカーネルイメージの中の所定のエントリポイント（プログラムの開始点）に制御をジャンプさせることで、クラッシュカーネル１４０を起動することができる。
【００６１】
クラッシュカーネル１４０は、管理テーブル記憶部１４１、ダンプ採取部１４２、ＣＰＵ追加部１４３、メモリ追加部１４４およびメモリ診断部１４５を有する。管理テーブル記憶部１４１は、ＲＡＭ１０２に確保した領域を用いて実現できる。ダンプ採取部１４２、ＣＰＵ追加部１４３、メモリ追加部１４４およびメモリ診断部１４５は、プログラムモジュールを用いて実現できる。
【００６２】
管理テーブル記憶部１４１は、ＣＰＵ１０１ａ〜１０１ｄのうちクラッシュカーネル１４０に割り当てられたＣＰＵを示すＣＰＵ管理テーブルを記憶する。また、管理テーブル記憶部１４１は、ＲＡＭ１０２のうちクラッシュカーネル１４０に割り当てられた領域を示すメモリ管理テーブルを記憶する。
【００６３】
ダンプ採取部１４２は、クラッシュカーネル１４０が起動されるとダンプ採取を開始する。ダンプ採取部１４２は、クラッシュカーネル１４０に割り当てられたＣＰＵとＲＡＭ１０２の領域とを用いてダンプ採取を行う。すなわち、ダンプ採取部１４２は、運用カーネル１２０用の領域からデータを読み込み、クラッシュカーネル１４０用の領域に確保したバッファに格納する。ダンプ採取部１４２は、バッファにデータを格納する前または格納した後に、当該データに対して圧縮や暗号化などの可逆変換を行ってもよい。ダンプ採取部１４２は、バッファに格納したデータをダンプとしてＨＤＤ１０３に保存する。
【００６４】
ＣＰＵ追加部１４３は、ダンプ採取の進行に応じて、クラッシュカーネル１４０用のＣＰＵの増加を試みる。すなわち、ＣＰＵ追加部１４３は、ダンプ採取の進行状況が所定条件を満たすと、ＣＰＵ１０１ａ〜１０１ｄのうちＨＡＬＴ状態のＣＰＵを１つ選択し、選択したＣＰＵに初期化割込信号（ＩＮＩＴ割込信号）を送信する。ＣＰＵ追加部１４３は、ＩＮＩＴ割込信号を送信してから所定時間以内に、選択したＣＰＵから初期化成功を示すＩＮＩＴ完了通知を受信した場合、選択したＣＰＵが正常であると判断する。ＣＰＵ追加部１４３は、管理テーブル記憶部１４１に記憶されたＣＰＵ管理テーブルを更新することで、選択したＣＰＵをクラッシュカーネル１４０に割り当てる。
【００６５】
メモリ追加部１４４は、ダンプ採取の進行に応じて、クラッシュカーネル１４０用の領域の増加を試みる。すなわち、メモリ追加部１４４は、ダンプ採取部１４２によって既にデータが読み出された領域を運用カーネル１２０から解放し、解放した領域について故障の有無をチェックする。メモリ追加部１４４は、解放した領域が正常であると判断すると、管理テーブル記憶部１４１に記憶されたメモリ管理テーブルに当該領域を登録することで、解放した領域をクラッシュカーネル１４０に割り当てる。
【００６６】
ここで、解放した領域の故障をチェックする１つの方法として、メモリ追加部１４４は、運用カーネル１２０の故障テーブル記憶部１２１に記憶されたメモリ故障テーブルを参照する。メモリ追加部１４４は、解放した領域の属する物理ページが故障していると運用カーネル１２０によって判断されていた場合、クラッシュカーネル１４０は当該解放した領域をクラッシュカーネル１４０に割り当てない。また、解放した領域の故障をチェックする他の１つの方法として、メモリ追加部１４４はメモリ診断部１４５を呼び出す。
【００６７】
メモリ診断部１４５は、メモリ追加部１４４から呼び出しに応じて、ＲＡＭ１０２の中の指定された領域が正常であるか動的に診断する。メモリ診断部１４５は、指定された領域に診断用データを書き込む。メモリ診断部１４５は、書き込み後に当該領域を参照して、書き込んだ診断用データを正常に読み出せるか確認する。診断用データを正常に読み出せない場合、メモリ診断部１４５は当該領域が故障していると判断する。
【００６８】
図６は、メモリ故障テーブルの例を示す図である。
メモリ故障テーブル１２５は、運用カーネル１２０の故障テーブル記憶部１２１に記憶されている。メモリ故障テーブル１２５は、物理ページ番号と故障フラグの項目を有する。物理ページ番号は、ＲＡＭ１０２の物理ページ（例えば、４キロバイト毎に区切った単位領域）それぞれに付与された識別番号である。以下では、物理ページ番号やＲＡＭ１０２の物理アドレスは、１６進数で表すことがある。故障フラグは、物理ページ番号が示す物理ページが故障しているか否を示す。例えば、故障フラグが「０」（ＯＦＦ）である物理ページは正常であり、故障フラグが「１」（ＯＮ）である物理ページは故障している。
【００６９】
各故障フラグの初期値は「０」である。故障検出部１２３は、ある物理ページが故障していると判断すると、当該物理ページに対応する故障フラグを「１」に更新する。メモリ追加部１４４は、解放した領域の属する物理ページに対応する故障フラグをメモリ故障テーブル１２５から検索する。検索した故障フラグが「１」である場合、メモリ追加部１４４は、解放した領域は故障していると判断して使用しないようにする。
【００７０】
図７は、ＣＰＵ管理テーブルとメモリ管理テーブルの例を示す図である。
ＣＰＵ管理テーブル１４６は、クラッシュカーネル１４０の管理テーブル記憶部１４１に記憶されている。ＣＰＵ管理テーブル１４６は、ＣＰＵ番号と使用フラグの項目を有する。ＣＰＵ番号は、ＣＰＵ１０１ａ〜１０１ｄに付与された識別番号である。ＣＰＵ１０１ａのＣＰＵ番号は「０」、ＣＰＵ１０１ｂのＣＰＵ番号は「１」、ＣＰＵ１０１ｃのＣＰＵ番号は「２」、ＣＰＵ１０１ｄのＣＰＵ番号は「３」である。
【００７１】
使用フラグは、ＣＰＵ番号が示すＣＰＵが、クラッシュカーネル１４０によるダンプ採取に使用されているか否かを示す。例えば、使用フラグが「０」（ＯＦＦ）であるＣＰＵはダンプ採取に使用されておらず、使用フラグが「１」（ＯＮ）であるＣＰＵはダンプ採取に使用されている。クラッシュカーネル１４０が起動した直後は、１つのＣＰＵの使用フラグが「１」であり、他のＣＰＵの使用フラグは「０」になっている。
【００７２】
メモリ管理テーブル１４７は、クラッシュカーネル１４０の管理テーブル記憶部１４１に記憶されている。メモリ管理テーブル１４７は、領域番号と開始アドレスと終了アドレスの項目を有する。領域番号は、１つの連続した領域を識別する識別番号である。メモリ管理テーブル１４７の１つのレコードが、１つの連続した領域に対応する。開始アドレスは、領域の先頭を示すＲＡＭ１０２の物理アドレスである。終了アドレスは、領域の末尾を示すＲＡＭ１０２の物理アドレスである。クラッシュカーネル１４０が起動した直後は、事前に予約された領域を示すレコードがメモリ管理テーブル１４７に登録されている。
【００７３】
次に、情報処理装置１００が実行するダンプ採取の手順について説明する。
図８は、第２の実施の形態のダンプ採取の手順例を示すフローチャートである。
（Ｓ１０）運用カーネル１２０のカーネル停止部１２４は、ＣＰＵ１０１ａ〜１０１ｄのうちの１つのＣＰＵを用いて、処理を続けることが難しい所定の種類のエラーを検出する。ここでは、ＣＰＵ１０１ｄがエラーを検出したものとする。
【００７４】
（Ｓ１１）カーネル停止部１２４は、運用カーネル１２０を停止し、エラーを検出したＣＰＵ１０１ｄ以外のＣＰＵ１０１ａ〜１０１ｃをＨＡＬＴ状態にする。
（Ｓ１２）カーネル停止部１２４は、ＣＰＵ１０１ｄを用いてブートローダ１３０を呼び出す。ブートローダ１３０のカーネル診断部１３１は、ＲＡＭ１０２にロード済みのクラッシュカーネルイメージが破損していないか診断する。すなわち、カーネル診断部１３１は、クラッシュカーネルイメージからハッシュ値を算出し、予め算出されたハッシュ値と比較してクラッシュカーネルイメージが変更されていないか確認する。ハッシュ値が一致すればクラッシュカーネルイメージが破損していないと判断され、ハッシュ値が相違すればクラッシュカーネルイメージが破損していると判断される。
【００７５】
（Ｓ１３）カーネル診断部１３１は、クラッシュカーネルイメージが破損しているか判断する。破損している場合はダンプ採取が終了し、破損していない場合はステップＳ１４に処理が進む。なお、ロード済みのクラッシュカーネルイメージが破損している場合、カーネル診断部１３１は、ＨＤＤ１０３からの再ロードを試みてもよい。
【００７６】
（Ｓ１４）ブートローダ１３０のカーネル起動部１３２は、ＣＰＵ１０１ｄを用いてクラッシュカーネル１４０を起動する。具体的には、カーネル起動部１３２は、ロード済みのクラッシュカーネルイメージの中の所定のエントリポイントに制御を渡す。クラッシュカーネル１４０が起動した直後は、クラッシュカーネル１４０は計算リソースとして、エラーを検出したＣＰＵ１０１ｄと事前に予約されたＲＡＭ１０２の領域とを使用する。クラッシュカーネル１４０のダンプ採取部１４２は、事前に予約された領域に、ダンプとして書き出すデータを一時的に格納するバッファを確保する。
【００７７】
（Ｓ１５）ダンプ採取部１４２は、運用カーネル１２０が使用していたＲＡＭ１０２の領域のうちダンプ未採取の領域から所定サイズのデータを読み込む。
（Ｓ１６）ダンプ採取部１４２は、オプション処理として、ステップＳ１５で読み込んだデータに対して圧縮や暗号化などの可逆変換を行ってもよい。オプション処理は、予めユーザがクラッシュカーネル１４０に対してその旨を設定した場合のみ行ってもよい。
【００７８】
（Ｓ１７）ダンプ採取部１４２は、ステップＳ１５で読み込んだデータまたはステップＳ１６で変換されたデータを、クラッシュカーネル１４０用の領域に確保したバッファに格納する。クラッシュカーネル１４０に対して２以上のＣＰＵが割り当てられており、２以上のＣＰＵが並列にデータを読み込んでいる場合、クラッシュカーネル１４０用の領域には２以上のバッファが確保される。その場合、ダンプ採取部１４２は、データを読み込んだＣＰＵに対応するバッファに当該データを格納する。
【００７９】
（Ｓ１８）ダンプ採取部１４２は、ステップＳ１７でデータを格納したバッファが満杯になったか判断する。バッファが満杯になった場合はステップＳ１９に処理が進み、バッファが満杯でない（バッファにまだ空きがある）場合はステップＳ１５に処理が進む。
【００８０】
（Ｓ１９）ダンプ採取部１４２は、ＲＡＭ１０２のバッファに格納されているデータを、ダンプ（メモリダンプと呼ぶこともある）としてＨＤＤ１０３に書き出す。
（Ｓ２０）ダンプ採取部１４２は、ダンプ採取が完了したか、すなわち、運用カーネル１２０が使用していたＲＡＭ１０２の領域全てからデータを読み込んだか判断する。ダンプ採取が完了した場合、クラッシュカーネル１４０の処理が終了する。ダンプ採取が完了していない場合、ステップＳ２１に処理が進む。
【００８１】
なお、クラッシュカーネル１４０の処理が終了した場合、クラッシュカーネル１４０に割り当てられていたＣＰＵや領域が解放されてもよく、情報処理装置１００が再起動されてもよい。また、クラッシュカーネル１４０に割り当てられていたＣＰＵや領域は正常であることが確認されているため、情報処理装置１００を再起動せず、クラッシュカーネル１４０に割り当てられていたＣＰＵや領域を用いて運用カーネル１２０を再開してもよい。
【００８２】
（Ｓ２１）クラッシュカーネル１４０のＣＰＵ追加部１４３およびメモリ追加部１４４は、クラッシュカーネル１４０が使用する計算リソースの拡張を試みる。リソース拡張の詳細は後述する。そして、ステップＳ１５に処理が進む。
【００８３】
図９は、リソース拡張の手順例を示すフローチャートである。
リソース拡張は、上記ステップＳ２１で実行される。
（Ｓ３０）メモリ追加部１４４は、ダンプ採取済みの領域、すなわち、上記ステップＳ１５でデータを読み込み済みの領域を運用カーネル１２０から解放する。
【００８４】
（Ｓ３１）メモリ追加部１４４は、解放した領域の物理ページを１つ選択する。
（Ｓ３２）メモリ追加部１４４は、ステップＳ３１で選択した物理ページが正常であるか故障しているか判断する。１つの判断方法として、メモリ追加部１４４は、運用カーネル１２０が実行中に生成したメモリ故障テーブル１２５を故障テーブル記憶部１２１から読み出す。メモリ追加部１４４は、メモリ故障テーブル１２５から、選択した物理ページの物理ページ番号に対応する故障フラグを検索する。メモリ追加部１４４は、故障フラグが「１」（ＯＮ）である場合は当該物理ページが故障していると判断し、故障フラグが「０」（ＯＦＦ）である場合は当該物理ページが正常であると判断する。
【００８５】
また、他の１つの判断方法として、メモリ追加部１４４は、物理ページを指定してメモリ診断をメモリ診断部１４５に依頼する。メモリ診断部１４５は、指定された物理ページに対して診断用データを書き込み、書き込んだ診断用データを読み出せるか確認する。診断用データは、故障の有無を診断するのに適したビット列であり、ダミーデータである。指定された物理ページ全体について診断用データを読み出せた場合、メモリ診断部１４５は、当該物理ページが正常であると判断する。一方、指定された物理ページの中の少なくとも１つの単位領域について診断用データを読み出せなかった場合、メモリ診断部１４５は、当該物理ページが故障していると判断する。
【００８６】
（Ｓ３３）メモリ追加部１４４は、選択した物理ページが正常か判断する。正常である場合はステップＳ３４に処理が進み、故障している場合はステップＳ３５に処理が進む。
（Ｓ３４）メモリ追加部１４４は、管理テーブル記憶部１４１に記憶されたメモリ管理テーブル１４７に、選択した物理ページを示す物理アドレスを登録する。このとき、選択した物理ページが、メモリ管理テーブル１４７に登録済みの何れかの領域と隣接する場合、メモリ追加部１４４は、新たなレコードをメモリ管理テーブル１４７に追加せず、既存のレコードの開始アドレスまたは終了アドレスを更新して領域を拡張する。一方、選択した物理ページが、メモリ管理テーブル１４７に登録済みの何れの領域とも隣接しない場合、メモリ追加部１４４は、新たなレコードをメモリ管理テーブル１４７に追加する。
【００８７】
（Ｓ３５）メモリ追加部１４４は、ステップＳ３１において、解放した領域の物理ページを全て選択したか判断する。全ての物理ページを選択した場合はステップＳ３６に処理が進み、未選択の物理ページがある場合はステップＳ３１に処理が進む。
【００８８】
（Ｓ３６）メモリ追加部１４４は、メモリ管理テーブル１４７に新たに登録された領域を、クラッシュカーネル１４０に組み込む。これにより、クラッシュカーネル１４０に割り当てられたＲＡＭ１０２の領域が増える。
【００８９】
図１０は、リソース拡張の手順例を示すフローチャート（続き）である。
（Ｓ３７）クラッシュカーネル１４０のＣＰＵ追加部１４３は、クラッシュカーネル１４０に対してＣＰＵを１つ追加するのに十分な領域が確保されているか判断する。これは、追加したＣＰＵにダンプ採取を実行させると、追加したＣＰＵに対応するバッファやページテーブルなどをＲＡＭ１０２に確保することになるためである。
【００９０】
例えば、ＣＰＵ追加部１４３は、クラッシュカーネル１４０に割り当てられた領域のうち未使用領域のサイズを算出し、未使用領域のサイズが閾値以上の場合に十分な領域が確保されていると判断する。また、例えば、ＣＰＵ追加部１４３は、ＣＰＵを１つ追加した後のＣＰＵ数から、確保することが好ましい領域サイズを所定の式に従って算出する。ＣＰＵ追加部１４３は、クラッシュカーネル１４０に現在割り当てられている領域のサイズが好ましい領域サイズ以上になった場合、十分な領域が確保されていると判断する。
【００９１】
ＣＰＵを１つ追加するのに十分な領域が確保されている場合はステップＳ３８に処理が進み、十分な領域が確保されていない場合はリソース拡張の処理が終了する。
（Ｓ３８）ＣＰＵ追加部１４３は、管理テーブル記憶部１４１に記憶されたＣＰＵ管理テーブル１４６を参照して、ＨＡＬＴ状態のＣＰＵを１つ選択する。
【００９２】
（Ｓ３９）ＣＰＵ追加部１４３は、選択したＣＰＵにＩＮＩＴ割込信号を送信する。
（Ｓ４０）ＣＰＵ追加部１４３は、ステップＳ３９でＩＮＩＴ割込信号を送信してから１００ミリ秒経過したか判断する。１００ミリ秒経過したか否かは、情報処理装置１００が有するハードウェアタイマを利用して判断してもよいし、ＯＳが管理するソフトウェアタイマを利用して判断してもよい。１００ミリ秒経過した場合、ＣＰＵ追加部１４３は選択したＣＰＵが故障していると判断し、リソース拡張の処理が終了する。まだ１００ミリ秒経過していない場合、ステップＳ４１に処理が進む。なお、閾値としての１００ミリ秒は変更することが可能であり、ユーザが変更することもできる。
【００９３】
（Ｓ４１）ＣＰＵ追加部１４３は、選択したＣＰＵからＩＮＩＴ割込信号に対する応答として、初期化が完了したことを示すＩＮＩＴ完了通知を受信したか判断する。ＩＮＩＴ完了通知を受信した場合はステップＳ４２に処理が進み、ＩＮＩＴ完了通知を受信していない場合はステップＳ４０に処理が進む。
【００９４】
（Ｓ４２）ＣＰＵ追加部１４３は、選択したＣＰＵが正常であると判断する。ＣＰＵ追加部１４３は、ＣＰＵ管理テーブル１４６から、選択したＣＰＵのＣＰＵ番号に対応する使用フラグを検索し、使用フラグを「０」（ＯＦＦ）から「１」（ＯＮ）に更新する。
【００９５】
（Ｓ４３）ＣＰＵ追加部１４３は、ＣＰＵ管理テーブル１４６の使用フラグが新たにＯＮになったＣＰＵを、クラッシュカーネル１４０に組み込む。これにより、クラッシュカーネル１４０に割り当てられたＣＰＵが増える。
【００９６】
ダンプ採取部１４２は、クラッシュカーネル１４０に２以上のＣＰＵが割り当てられると、それら２以上のＣＰＵの役割を決定する。役割分担の方法は、予めユーザがクラッシュカーネル１４０に設定できるようにしてもよい。例えば、異なるＣＰＵが異なる領域のダンプ採取を並列に実行するようにしてもよい（負荷分散）。この場合、ダンプ採取部１４２は、クラッシュカーネル１４０に割り当てられた領域に、追加されたＣＰＵに対応する新たなバッファを確保する。また、例えば、異なるＣＰＵがバッファリング・圧縮・暗号化などの異なる種類の処理を並列に実行するようにしてもよい（機能分散）。
【００９７】
なお、メモリ診断部１４５がＲＡＭ１０２の各領域の故障を診断する場合、ダンプ採取部１４２のダンプ採取とメモリ診断部１４５の故障診断とを、異なるＣＰＵが実行するようにしてもよい。また、ダンプ採取部１４２のダンプ採取と、ＣＰＵ追加部１４３およびメモリ追加部１４４のリソース拡張とを、異なるＣＰＵが実行するようにしてもよい。
【００９８】
次に、メモリ管理テーブル１４７とＣＰＵ管理テーブル１４６の更新例を説明する。
図１１は、メモリ管理テーブルの更新例を示す図である。
クラッシュカーネル１４０用に予約された領域が、０ｘ２Ｄ００００００〜０ｘ３４ＦＦＦＦＦＦであるとする。この場合、メモリ管理テーブル１４７には初期値として、予約された領域を示すレコードが登録される。ここで、ダンプ採取が進行し、０ｘ００１０００００〜０ｘ１００ＦＦＦＦＦの領域がダンプ採取済みになったとする。
【００９９】
すると、０ｘ００１０００００〜０ｘ１００ＦＦＦＦＦの領域の先頭から順に、各物理ページが故障していないかチェックされる。ここでは、運用カーネル１２０が生成するメモリ故障テーブル１２５を用いて、各物理ページの故障の有無をチェックすることとする。各物理ページは４キロバイトであるため、上記領域の先頭の物理ページ番号は、先頭の物理アドレスの下１２ビットを除去した０ｘ００１００である。０ｘ００１００に対応する故障フラグが「０」であることが確認されると、この物理ページの領域を示す０ｘ００１０００００〜０ｘ００１００ＦＦＦがメモリ管理テーブル１４７に登録される。
【０１００】
次の物理ページについて、０ｘ００１０１に対応する故障フラグが「０」であることが確認されると、この物理ページの領域を示す０ｘ００１０１０００〜０ｘ００１０１ＦＦＦがメモリ管理テーブル１４７に登録される。このとき、追加される領域は登録済みの領域と連続しているため、両者が連結された形式でメモリ管理テーブル１４７が更新される。すなわち、物理アドレスの範囲として０ｘ００１０００００〜０ｘ００１０１ＦＦＦがメモリ管理テーブル１４７に登録される。以下同様にして、物理ページ番号０ｘ０ＦＦＦＦに対応する故障フラグが「０」であることが確認されると、物理アドレスの範囲として０ｘ００１０００００〜０ｘ０ＦＦＦＦＦＦＦが登録される。
【０１０１】
次に、物理ページ番号０ｘ１００００に対応する故障フラグが「１」であることが確認されると、この物理ページの領域はメモリ管理テーブル１４７に登録されない。次に、物理ページ番号０ｘ１０００１に対応する故障フラグが「０」であることが確認されると、この物理ページの領域を示す０ｘ１０００１０００〜０ｘ１０００１ＦＦＦがメモリ管理テーブル１４７に登録される。このとき、追加される領域は登録済みの領域と不連続であるため、０ｘ００１０００００〜０ｘ０ＦＦＦＦＦＦＦとは別に、０ｘ１０００１０００〜０ｘ１０００１ＦＦＦがメモリ管理テーブル１４７に追加される。
【０１０２】
最終的に、メモリ管理テーブル１４７には、０ｘ００１０００００〜０ｘ０ＦＦＦＦＦＦＦという領域と、０ｘ１０００１０００〜０ｘ１００ＦＦＦＦＦという領域が登録される。これは、ダンプ採取済みになった領域のうち、物理ページ番号０ｘ１００００が示す領域を除いたものがクラッシュカーネル１４０に割り当てられたことを示す。
【０１０３】
図１２は、ＣＰＵ管理テーブルの更新例を示す図である。
ＣＰＵ１０１ｄ（ＣＰＵ３）がエラーを検出すると、ＣＰＵ１０１ｄのみを用いてクラッシュカーネル１４０が起動する。この場合、ＣＰＵ管理テーブル１４６では、ＣＰＵ１０１ｄに対応する使用フラグのみが「１」に設定され、ＣＰＵ１０１ａ〜１０１ｃ（ＣＰＵ０〜２）に対応するフラグは「０」に設定される。
【０１０４】
次に、ＣＰＵ１０１ａが初期化されてクラッシュカーネル１４０に割り当てられると、ＣＰＵ管理テーブル１４６では、ＣＰＵ１０１ａに対応する使用フラグが「１」に更新される。次に、ＣＰＵ１０１ｂの初期化に失敗すると、ＣＰＵ管理テーブル１４６では、ＣＰＵ１０１ｂに対応する使用フラグが「０」のままとなる。このとき、ＣＰＵ管理テーブル１４６は、ＣＰＵ１０１ａ，１０１ｄがダンプ採取を行っていることを示している。
【０１０５】
第２の実施の形態の情報処理装置１００によれば、エラーを検出したＣＰＵのみを用いてダンプ採取が開始される。エラーを検出したＣＰＵは故障していない可能性が高いため、ダンプ採取の安全性を向上できる。また、ダンプ採取済みの領域がクラッシュカーネル１４０に順次割り当てられる。これにより、クラッシュカーネル１４０用に大きな領域を予約しておかなくてもよく、運用カーネル１２０によって使用されない無駄な領域を削減できる。また、ダンプ採取済みの領域のうち故障していないことが確認された領域のみがクラッシュカーネル１４０に割り当てられる。これにより、ダンプ採取の安全性を向上できる。
【０１０６】
また、ダンプ採取開始後に、停止中のＣＰＵが追加的にクラッシュカーネル１４０に割り当てられる。これにより、ダンプ採取を高速化することができる。また、クラッシュカーネル１４０に十分な大きさの領域が割り当てられてからＣＰＵが追加される。これにより、メモリ不足によってダンプ採取の速度が低下するのを抑制できる。また、停止中のＣＰＵのうち故障していないことが確認されたＣＰＵのみがクラッシュカーネル１４０に割り当てられる。これにより、ダンプ採取の安全性を向上できる。
【０１０７】
また、クラッシュカーネル１４０が使用したＣＰＵリソースやメモリリソースは、故障していないことが確認されている。このため、ダンプ採取後に情報処理装置１００を再起動しなくても、クラッシュカーネル１４０が使用したＣＰＵリソースやメモリリソースを利用して運用カーネル１２０を再開することが可能となる。すなわち、ダンプ採取中に、故障している可能性のあるハードウェアを実質的に切り離すことができ、ダンプ採取完了後に迅速に運用カーネル１２０を再開することができる。
【０１０８】
［第３の実施の形態］
次に、第３の実施の形態を説明する。第２の実施の形態との違いを中心に説明し、第２の実施の形態と同様の事項については説明を省略することがある。
【０１０９】
第３の実施の形態の情報処理装置は、クラッシュカーネルイメージをＨＤＤからＲＡＭにロードするタイミングが、第２の実施の形態の情報処理装置１００と異なる。第３の実施の形態の情報処理装置は、図２に示した第２の実施の形態の情報処理装置１００と同様のハードウェアを用いて実現することができる。以下では、図２と同じ符号を用いて、第３の実施の形態の情報処理装置のハードウェアに言及することがある。
【０１１０】
図１３は、第３の実施の形態の情報処理装置の機能例を示すブロック図である。
第３の実施の形態の情報処理装置１００ａは、運用カーネル１２０ａ、ブートローダ１３０ａおよびクラッシュカーネル１４０を有する。以下では、図５に示した第２の実施の形態の情報処理装置１００と同様のモジュールについては説明を省略する。
【０１１１】
運用カーネル１２０ａは、故障テーブル記憶部１２１、故障検出部１２３およびカーネル停止部１２４を有する。運用カーネル１２０ａは、第２の実施の形態と異なり、事前ロード部１２２を有しなくてよい。すなわち、クラッシュカーネル１４０用の領域はＲＡＭ１０２上に予約されているものの、運用カーネル１２０ａは、エラーを検出する前に、予約された領域に対してクラッシュカーネルイメージをロードしておかなくてよい。
【０１１２】
ブートローダ１３０ａは、カーネル起動部１３２ａを有する。カーネル起動部１３２ａは、運用カーネル１２０ａから呼び出されると、ＨＤＤ１０３からＲＡＭ１０２の予約された領域に、クラッシュカーネルイメージをロードする。カーネル起動部１３２ａは、ロードしたクラッシュカーネルイメージに基づいてクラッシュカーネル１４０を起動する。すなわち、カーネル起動部１３２ａは、クラッシュカーネルイメージの中の所定のエントリポイント（プログラムの開始点）に制御をジャンプさせる。なお、クラッシュカーネルイメージは運用カーネル１２０ａによって事前にロードされていないため、ブートローダ１３０ａは、カーネル診断部１３１を有しなくてよい。
【０１１３】
図１４は、第３の実施の形態のダンプ採取の手順例を示すフローチャートである。
（Ｓ５０）運用カーネル１２０ａのカーネル停止部１２４は、ＣＰＵ１０１ａ〜１０１ｄのうちの１つのＣＰＵを用いて、処理を続けることが難しい所定の種類のエラーを検出する。ここでは、ＣＰＵ１０１ｄがエラーを検出したものとする。
【０１１４】
（Ｓ５１）カーネル停止部１２４は、運用カーネル１２０ａを停止し、エラーを検出したＣＰＵ１０１ｄ以外のＣＰＵ１０１ａ〜１０１ｃをＨＡＬＴ状態にする。
（Ｓ５２）カーネル停止部１２４は、ＣＰＵ１０１ｄを用いてブートローダ１３０ａを呼び出す。ブートローダ１３０ａのカーネル起動部１３２ａは、ＣＰＵ１０１ｄを用いてクラッシュカーネル１４０を起動する。具体的には、カーネル起動部１３２ａは、ＨＤＤ１０３から、事前に予約されたＲＡＭ１０２の領域にクラッシュカーネルイメージをロードする。カーネル起動部１３２ａは、ロードされたクラッシュカーネルイメージの中の所定のエントリポイントに制御を渡す。
【０１１５】
（Ｓ５３）ダンプ採取部１４２は、運用カーネル１２０ａが使用していたＲＡＭ１０２の領域のうちダンプ未採取の領域から所定サイズのデータを読み込む。
（Ｓ５４）ダンプ採取部１４２は、オプション処理として、ステップＳ５３で読み込んだデータに対して圧縮や暗号化などの可逆変換を行ってもよい。
【０１１６】
（Ｓ５５）ダンプ採取部１４２は、ステップＳ５３で読み込んだデータまたはステップＳ５４で変換されたデータを、クラッシュカーネル１４０用の領域に確保したバッファに格納する。
【０１１７】
（Ｓ５６）ダンプ採取部１４２は、ステップＳ５５でデータを格納したバッファが満杯になったか判断する。バッファが満杯になった場合はステップＳ５７に処理が進み、バッファが満杯でない（バッファにまだ空きがある）場合はステップＳ５３に処理が進む。
【０１１８】
（Ｓ５７）ダンプ採取部１４２は、ＲＡＭ１０２のバッファに格納されているデータを、ダンプ（メモリダンプと呼ぶこともある）としてＨＤＤ１０３に書き出す。
（Ｓ５８）ダンプ採取部１４２は、ダンプ採取が完了したか、すなわち、運用カーネル１２０ａが使用していたＲＡＭ１０２の領域全てからデータを読み込んだか判断する。ダンプ採取が完了した場合、クラッシュカーネル１４０の処理が終了する。ダンプ採取が完了していない場合、ステップＳ５９に処理が進む。
【０１１９】
（Ｓ５９）クラッシュカーネル１４０のＣＰＵ追加部１４３およびメモリ追加部１４４は、クラッシュカーネル１４０が使用する計算リソースの拡張を試みる。リソース拡張については、図９，１０に示した第２の実施の形態の手順と同様である。そして、ステップＳ５３に処理が進む。
【０１２０】
第３の実施の形態の情報処理装置１００ａによれば、第２の実施の形態と同様の効果が得られる。また、第３の実施の形態によれば、クラッシュカーネルイメージを事前にＲＡＭ１０２にロードしないＯＳについても対応することができる。
【０１２１】
なお、前述のように、第１の実施の形態の情報処理は、情報処理装置１０にプログラムを実行させることで実現できる。第２の実施の形態の情報処理は、情報処理装置１００にプログラムを実行させることで実現できる。第３の実施の形態の情報処理は、情報処理装置１００ａにプログラムを実行させることで実現できる。
【０１２２】
プログラムは、コンピュータ読み取り可能な記録媒体（例えば、記録媒体１１３）に記録しておくことができる。記録媒体として、例えば、磁気ディスク、光ディスク、光磁気ディスク、半導体メモリなどを使用できる。磁気ディスクには、ＦＤおよびＨＤＤが含まれる。光ディスクには、ＣＤ、ＣＤ−Ｒ（Recordable）／ＲＷ（Rewritable）、ＤＶＤおよびＤＶＤ−Ｒ／ＲＷが含まれる。プログラムは、可搬型の記録媒体に記録されて配布されることがある。その場合、可搬型の記録媒体から他の記録媒体（例えば、ＨＤＤ１０３）にプログラムをコピーして実行してもよい。
【符号の説明】
【０１２３】
１０  情報処理装置
１１，１２  プロセッサ
１３  メモリ
１４  ダンプ採取
【図１】
2017021625.tif 000003
【図２】
2017021625.tif 000004
【図３】
2017021625.tif 000005
【図４】
2017021625.tif 000006
【図５】
2017021625.tif 000007
【図６】
2017021625.tif 000008
【図７】
2017021625.tif 000009
【図８】
2017021625.tif 000010
【図９】
2017021625.tif 000011
【図１０】
2017021625.tif 000012
【図１１】
2017021625.tif 000013
【図１２】
2017021625.tif 000014
【図１３】
2017021625.tif 000015
【図１４】
2017021625.tif 000016