以下、本実施の形態を図面を参照して説明する。
[第1の実施の形態]
図1は、第1の実施の形態の情報処理装置を示す図である。情報処理装置1は、解析対象のプログラムを実行しながら、ベースイベントのカウント数に応じたタイミングで、情報処理装置1の動作情報をサンプリングする。ベースイベントは、当該タイミングを決定するためのベースとなるイベントである。動作情報は、例えば情報処理装置1上で実行されるプログラムやハードウェアの情報(例えば、実行されたプロセスのプロセスIDや命令アドレスおよび該当のプロセスを実行したプロセッサの識別情報など)を含み得る。
情報処理装置1は、カウンタ1a、記憶部1b,1cおよび演算部1dを有する。カウンタ1aは、ベースイベント(キャッシュミス数や消費電力量)の数をカウントする。例えば、キャッシュミスをカウントする場合、キャッシュミスが1回あるとカウント数に1を加算する。また、例えば、消費電力量をカウントする場合、電力量が単位量分(例えば、1ジュール)消費されるとカウント数に1を加算する。カウンタ1aは、ハードウェアによる割り込み機能を備えていない。このため、例えばカウンタ1aのカウント数によってサンプリングタイミングを決定する場合、カウンタ1aのカウンタオーバーフローによるハードウェア割り込みを利用することはできない。
記憶部1b,1cは、RAM(Random Access Memory)などの揮発性記憶装置でもよいし、HDD(Hard Disk Drive)やフラッシュメモリなどの不揮発性記憶装置でもよい。例えば、記憶部1b,1cがRAMであってもよいし、記憶部1bがRAMであり記憶部1cがHDDであってもよい。記憶部1cは、情報処理装置1に外付けされた記憶装置でもよい。演算部1dは、CPU(Central Processing Unit)、DSP(Digital Signal Processor)、ASIC(Application Specific Integrated Circuit)、FPGA(Field Programmable Gate Array)などを含み得る。演算部1dはプログラムを実行するプロセッサであってもよい。ここでいう「プロセッサ」には、複数のプロセッサの集合(マルチプロセッサ)も含まれ得る。また、演算部1dは、カウンタ1aを含んでもよい。
記憶部1bは、カウンタ1aによるベースイベントのカウント数の積算値とプログラムやハードウェアの動作情報との演算部1dによる取得結果を一時記憶する。
記憶部1cは、解析対象プログラムの実行中における情報処理装置1の挙動解析に用いる動作情報の収集結果を記憶する。当該データは、演算部1dにより抽出される。
演算部1dは、カウンタ1aによるベースイベントのカウント数の積算値が所定値を超えるときの動作情報を取得し、記憶部1cに格納する。ただし、前述のように、カウンタ1aでは、カウンタオーバーフローによる割り込みを利用することはできない。そこで、演算部1dは、次のようにして動作情報の収集を行う。
演算部1dは、カウンタ1aのカウント数の積算値と動作情報とを一定時間間隔毎に取得して記憶部1bに格納する。一定時間間隔は、カウンタ1a以外の他のカウンタ(例えば、カウンタオーバーフローによる割り込み機能をもつタイマカウンタであり、図1では図示を省略している)によって計測され得る。例えば、演算部1dは、当該他のカウンタから一定時間間隔で受け付ける割り込みに応じて、カウンタ1aのカウント数の積算値と動作情報とを取得する。
演算部1dは、カウンタ1aのカウント数の積算値が所定値を超えると、当該積算値および所定値に基づいて、情報処理装置1における現在の動作情報または記憶部1bに一時記憶した動作情報を選択し、記憶部1cに格納する。
具体的には、カウンタ1aのカウント数の積算値に対する所定値として、閾値Lを、記憶部1bに予め設定しておく。閾値Lは、カウンタ1aによるサンプリングのサンプリングレートを決定する値と考えてもよい。そして、演算部1dは、タイミングt1−1において、積算値V1および動作情報Yを取得し、記憶部1bに格納する。積算値V1は、閾値Lよりも小さい値である。
次に、演算部1dは、タイミングt1−1の次のタイミングt1において、積算値V1および動作情報Zを取得する。積算値V2は、閾値Lよりも大きい値である。すなわち、演算部1dは、タイミングt1において、積算値V2が閾値Lを超えたことを検出する。グラフGは、タイミングt1−1,tでの積算値V1,V2と閾値Lとの関係を例示している。そして、演算部1dは、例えば記憶部1bに一時記憶された前回の積算値V1と閾値Lとの差D1=L−V1を得る。演算部1dは、今回の積算値V2と閾値Lとの差D2=V2−Lを得る。演算部1dは、差D1と差D2との比較に応じて、収集結果として採取する動作情報を、動作情報Y,Zの何れとするかを選択する。演算部1dは、差の小さい方に対応する動作情報を選択する。
より具体的には、上記の例において、差D1<差D2である。この場合、演算部1dは、動作情報Yを選択する。例えば、演算部1dは、動作情報Yをタイミングt1の情報に対応付けて、記憶部1cに記憶された収集結果テーブルT1に記録する。収集結果テーブルT1には、カウンタ1aによる1つ前のサンプリングタイミングt0で取得された動作情報Xも記録されている。なお、演算部1dは、動作情報Yをタイミングt1の情報に対応付けて記憶部1cに格納するものとしたが、タイミングt1の情報に対応づけずに記憶部1cに格納してもよい。
その後、演算部1dは、積算値V2から閾値Lを引いて、カウンタ1aのカウント数の積算値を求める。すると、演算部1dは、タイミングt1における値V2−Lからの積算値を求めることができ、当該積算値と閾値Lとの比較により、カウンタ1aによるサンプリングタイミングの決定を繰り返し行える。
演算部1dは、こうして記憶部1bに収集した動作情報を解析する。例えば、イベント発生箇所(例えば、キャッシュミス数や消費電力量の閾値超過)が発生したときに実行されていたプロセスIDや命令アドレスを基に、プログラム内の該当箇所(例えば、関数やサブルーチンなど)を特定できる。演算部1dは、収集結果を統計的に解析し、イベント発生時に実行されていた頻度の高いプログラム箇所を特定し、出力する(このような解析をプロファイリングと呼ぶこともある)。こうして、情報処理装置1は、開発者に対して、性能改善の余地のあるプログラム箇所の特定を支援できる。
ところで、上記のように、タイミングt1−1の積算値V1および動作情報Yを一時記憶せず、また、積算値V1,V2と閾値Lとの比較を行わずに、タイミングt1における動作情報Zを、そのまま収集結果テーブルT1に記録することも考えられる。ところが、この場合、タイミングt1は、カウンタ1aのカウント数の積算値が閾値Lを丁度超えたタイミング(積算値がL+1となった本来のタイミング)よりも遅延している可能性がある。タイミングt1の当該遅延量が大きいほど、動作情報Zは本来のタイミングでの動作情報とは異なっている可能性が高くなる。こうして蓄積した動作情報により解析を行うと、解析結果の信頼性が低いおそれがある。
そこで、情報処理装置1のように、タイミングt1−1の積算値V1および動作情報Yを一時記憶し、タイミングt1で積算値V2が閾値Lを超えた際に、積算値V1,V2と閾値Lとの比較により、動作情報Y,Zの何れを採用するかを選択する。閾値Lと積算値との差が大きいほど、閾値Lを丁度超過した本来のタイミングとの乖離が大きいと判断でき、閾値Lと積算値との差が小さいほど本来のタイミングとの乖離が小さいと判断できるからである。こうして、ハードウェア割り込み手段をもたないカウンタ1aを用いてサンプリング契機を計る場合でも、より適切な動作情報を選択できる。また、こうして蓄積した動作情報による解析を行うことで、解析結果の信頼性を向上させることができる。
[第2の実施の形態]
図2は、第2の実施の形態の解析装置を示す図である。解析装置100は、解析対象プログラムP1を実行し、実行中における解析装置100の動作情報を取得する。解析装置100は、サーバコンピュータでもよいし、クライアントコンピュータでもよい。解析装置100は、ネットワーク10に接続されており、ネットワーク10を介して他のコンピュータと通信できる。
図3は、第2の実施の形態の解析装置のハードウェア例を示す図である。解析装置100は、プロセッサ101、RAM102、HDD103、画像信号処理部104、入力信号処理部105、媒体リーダ106および通信インタフェース107を有する。各ユニットは解析装置100のバスに接続されている。
プロセッサ101は、解析装置100の情報処理を制御する。プロセッサ101は、マルチプロセッサであってもよい。プロセッサ101は、例えばCPU、DSP、ASICまたはFPGAなどである。プロセッサ101は、CPU、DSP、ASIC、FPGAなどのうちの2以上の要素の組み合わせであってもよい。
RAM102は、解析装置100の主記憶装置である。RAM102は、プロセッサ101に実行させるOS(Operating System)のプログラムやアプリケーションプログラムの少なくとも一部を一時的に記憶する。アプリケーションプログラムは、例えば、解析対象プログラムP1や後述する解析装置100の機能を実現するためのプログラムを含む。また、RAM102は、プロセッサ101による処理に用いる各種データを記憶する。
HDD103は、解析装置100の補助記憶装置である。HDD103は、内蔵した磁気ディスクに対して、磁気的にデータの書き込みおよび読み出しを行う。HDD103は、OSのプログラム、アプリケーションプログラム(例えば、解析対象プログラム)、および各種データを記憶する。解析装置100は、フラッシュメモリやSSD(Solid State Drive)などの他の種類の補助記憶装置を備えてもよく、複数の補助記憶装置を備えてもよい。
画像信号処理部104は、プロセッサ101からの命令に従って、解析装置100に接続されたディスプレイ11に画像を出力する。ディスプレイ11としては、CRT(Cathode Ray Tube)ディスプレイや液晶ディスプレイなどを用いることができる。
入力信号処理部105は、解析装置100に接続された入力デバイス12から入力信号を取得し、プロセッサ101に出力する。入力デバイス12としては、例えば、マウスやタッチパネルなどのポインティングデバイス、キーボードなどを用いることができる。
媒体リーダ106は、記録媒体13に記録されたプログラムやデータを読み取る装置である。記録媒体13として、例えば、フレキシブルディスク(FD:Flexible Disk)やHDDなどの磁気ディスク、CD(Compact Disc)やDVD(Digital Versatile Disc)などの光ディスク、光磁気ディスク(MO:Magneto-Optical disk)を使用できる。また、記録媒体13として、例えば、フラッシュメモリカードなどの不揮発性の半導体メモリを使用することもできる。媒体リーダ106は、例えば、プロセッサ101からの命令に従って、記録媒体13から読み取ったプログラムやデータをRAM102またはHDD103に格納する。
通信インタフェース107は、ネットワーク10を介して他の装置と通信を行う。通信インタフェース107は、有線通信インタフェースでもよいし、無線通信インタフェースでもよい。
図4は、第2の実施の形態のプロセッサの例を示す図である。プロセッサ101は、カウンタ101a,101bを有する。例えば、カウンタ101a,101bは、性能イベント監視カウンタ(PMC:Performance Monitoring Counter)と呼ばれるものでもよい。
カウンタ101aは、タイマとして利用可能なカウンタである。カウンタ101aは、ハードウェア割り込み機能を有する。具体的には、カウンタ101aは、カウントがオーバーフローすると、割り込みを発生させることができる。この機能により、カウンタ101aは、一定時間間隔毎に割り込みを発生させる。すると、予め用意した例外処理用のドライバなどを用いて、プログラムカウンタや所定のレジスタなどの値を記録でき、割り込み発生時の情報を採取できる。なお、カウンタ101aとして、他の種類のイベントの発生数をカウントするカウンタであって、ハードウェア割り込み機能をもつカウンタを用いてもよい。また、カウンタ101aとして、プロセッサ101のクロックサイクル数をカウントするタイムスタンプカウンタ(TSC:Time Stamp Counter)を用いてもよい。
カウンタ101bは、ベースイベントの発生数をカウントする。ベースイベントとは、例えば、命令実行、キャッシュミス発生、電力消費および実行サイクル数(時間経過)などである。第2の実施の形態の例では、ベースイベントとして、電力消費を想定する。この場合、カウンタ101bを電力制御監視カウンタと呼ぶこともできる。カウンタ101bの1カウントは、例えば単位消費電力量に相当する。消費電力量は、ジュールやワット時などの単位で表わされるエネルギーに相当する量である。例えば、カウンタ101bの1カウントは、電力量1ジュールが消費されたというイベントが1回発生したことに相当する。ただし、カウンタ101bは、命令実行やキャッシュミス発生など他の種類のベースイベントの発生数をカウントするカウンタでもよい。
カウンタ101bは、ハードウェア割り込み機能を有していない。この点が、カウンタ101aと異なる。すなわち、カウンタ101bでは、カウンタ101aのように、カウンタ・レジスタのオーバーフローによる割り込みを発生させることはできない。このため、第2の実施の形態の例では、カウンタ101bによりサンプリングタイミングを決定する(イベントベースのサンプリングを行う)ために、カウンタ101aを補助的に用いる。具体的には、プロセッサ101は、カウンタ101aによる割り込みが発生したタイミングでカウンタ101bのカウント数を参照し、カウンタ101bのカウント数と所定の閾値との比較により、サンプリングタイミングを決定する。
しかし、この場合、カウンタ101bのカウント数が閾値を丁度超えたタイミング(本来のタイミング)を計ることは困難である。カウンタ101bのカウント数と閾値との比較を行うタイミングがカウンタ101aによって決定されるので、当該比較を行うタイミングが本来のタイミングよりも遅延するからである。そこで、解析装置100は、カウンタ101bによるイベントベースのサンプリングにおいて、より適切な情報をサンプリング可能とする機能を提供する。なお、以下の説明において、便宜的にカウンタ101aの識別子を“CT1”、および、カウンタ101bの識別子を“CT2”とする。図中、これらの識別子によってカウンタを区別することがある。
図5は、第2の実施の形態の解析装置の機能例を示す図である。解析装置100は、採取データ記憶部110、解析対象データ記憶部120、データ採取部150、解析対象データ抽出部160および解析部170を有する。採取データ記憶部110および解析対象データ記憶部120は、RAM102またはHDD103に確保された記憶領域として実現される。データ採取部150、解析対象データ抽出部160および解析部170は、RAM102に記憶されたプログラムをプロセッサ101が実行することで実現される。
採取データ記憶部110は、採取データを記憶する。採取データは、解析対象プログラムP1の実行中に一定時間間隔毎に取得される解析装置100の動作情報である。一定時間間隔は、カウンタ101aにより計測される。
解析対象データ記憶部120は、解析対象データを記憶する。解析対象データは、採取データから抽出されるデータである。解析対象データのサンプリングのタイミングは、カウンタ101bのカウント数により決定される。
データ採取部150は、解析対象プログラムP1が実行されている期間中に、一定時間間隔毎のタイミング(カウンタ101aによる割り込みのタイミング)で、実行中のプロセスIDやプログラムカウンタのアドレス値などを取得する。また、データ採取部150は、同タイミングにおけるカウンタ101bのカウント数を取得する。データ採取部150は、取得したプロセスID、アドレス値およびカウンタ101bのカウント数(前回データ採取時点からの差分)を採取データ記憶部110に格納する。データ採取部150によって、採取データ記憶部110に格納される情報が採取データに相当する。データ採取部150は、割り込みによる例外処理用のドライバに呼び出される機能でもよいし、例外処理用のドライバに組み込まれた機能でもよい。
解析対象データ抽出部160は、採取データ記憶部110に記憶された採取データから、カウンタ101bのカウント数に応じたタイミングで取得された採取データを抽出する。こうして抽出された採取データを、解析対象データと呼ぶこととする。解析対象データ抽出部160は、採取データ記憶部110から解析対象データを抽出するということもできる。解析対象データ抽出部160は、カウンタ101bのカウント数に基づいて、採取データ記憶部110に記憶された採取データのうち、解析対象データとして抽出するものを特定する。解析対象データ抽出部160は、解析対象データ記憶部120に抽出した解析対象データを格納する。
例えば、解析対象データ抽出部160は、カウンタ101bのカウント数に基づき、閾値に相当する一定の電力量が消費されたタイミング毎に、解析対象データを抽出する。ただし、前述のようにカウンタ101bは、ハードウェア割り込み機能がないため、ハードウェア割り込み機能を利用できる場合ほど精密に一定の電力量が消費されたタイミングを計れているわけではない。厳密にいえば、解析対象データの抽出のタイミング間における消費電力量は、ほぼ一定ということになる。こうして解析対象データ記憶部120に格納される解析対象データは、一定の電力量が消費されたタイミング毎(前述のように、より厳密にいえば、ほぼ一定の電力量が消費されたタイミング毎)に実行されていたプロセスIDや命令アドレスなどを示している。
解析部170は、解析対象データ記憶部120に記憶された解析対象データを解析し(プロファイリング)、解析結果を出力する。解析部170は、当該解析対象データに基づいて、各タイミングで実行されていた解析対象プログラムP1の関数やサブルーチンなどのプログラム箇所を特定する。解析部170は、解析対象データを統計的に解析し、ベースイベント(一定の電力量が消費されたというイベント)の発生時に実行されていた頻度の高いプログラム箇所を特定し、ディスプレイ11などに出力する。例えば、解析部170は、出力結果を示す画像をディスプレイ11により表示させる。例えば、開発者は、ディスプレイ11に表示された画像を閲覧して、電力消費の観点で改善の余地のあるプログラム箇所の候補を特定できる。
図6は、第2の実施の形態のデータ採取部によるデータ採取例を示す図である。例えば、解析対象プログラムP1が実行されている期間中のある時点において、解析装置100のOSは、プロセスP11,P12,P13の実行をスケジューリング済であり、プロセスP11を実行中である。このとき、データ採取部150は、カウンタ101aから一定時間間隔毎に割り込みを受け付ける。データ採取部150は、カウンタ101aから割り込みを受け付けると、現在実行中のプロセスP11からプロセスIDなどを含むプロセス情報を取得する。また、データ採取部150は、プログラムカウンタの値を取得する(図示を省略している)。更に、データ採取部150は、ベースイベントのカウント数(消費電力量に相当)をカウンタ101bから取得する。データ採取部150は、取得した情報(採取データ)を、採取データ記憶部110(図6の例ではRAM102内に確保された記憶領域)に格納する。
図7は、第2の実施の形態の採取データテーブルの例を示す図である。採取データテーブル111は、採取データ記憶部110に格納される。採取データテーブル111は、サンプル番号、解析対象データ候補および区間カウント数の項目を含む。
サンプル番号の項目には、サンプル番号が登録される。サンプル番号は、レコードを識別する番号であり、データ採取部150により採取された順に、データ採取部150により付与される番号である。解析対象データ候補の項目には、解析対象データの候補が登録される。解析対象データ候補の項目には、更に、CPU ID、PID(Process ID)およびPC(Program Counter)の項目が設けられている。CPU IDには、CPUの識別子(CPU ID)が登録される。解析装置100が複数のCPUによりプログラムを実行する場合、CPU IDによって各プロセスの実行主体を区別できる(本例ではCPU IDは一定であるとする)。PIDの項目には、プロセスIDが登録される。PCの項目には、プログラムカウンタに格納されたアドレス値が登録される。区間カウント数の項目には、カウンタ101bの区間カウント数が登録される。区間カウント数とは、データ採取部150が直前にデータ採取を行った時点でのカウンタ101bのカウント数と、今回データ採取を行った時点でのカウンタ101bのカウント数との差分のカウント数である。なお、データ採取部150がデータ採取を開始して最初のデータ採取の時点では、カウント数“0”(カウンタ101bの初期値)からの差分が区間カウント数となる。
例えば、採取データテーブル111には、次のようなレコードが登録される。第1には、サンプル番号が“N−1”(Nは2以上の整数)、解析対象データ候補のCPU IDが“0”、PIDが“219”、PCが“0x4110”、区間カウント数が“140”というレコードである。これは、カウンタ101aからN−1回目の割り込みを受け付けたときの採取データであり、CPU IDが“0”、プロセスIDが“219”、プログラムカウンタの値が“0x4110”、カウンタ101bの区間カウント数が“140”であったことを示す。
第2には、サンプル番号が“N”、解析対象データ候補のCPU IDが“0”、PIDが“219”、PCが“0x4230”、区間カウント数が“1800”というレコードである。これは、カウンタ101aからN回目の割り込みを受け付けたときの採取データであり、CPU IDが“0”、プロセスIDが“219”、プログラムカウンタのアドレス値が“0x4230”、カウンタ101bの区間カウント数が“1800”であったことを示す。
図8は、第2の実施の形態の解析対象データテーブルの例を示す図である。解析対象データテーブル121は、解析対象データ記憶部120に格納される。解析対象データテーブル121は、サンプル番号および解析対象データの項目を含む。
サンプル番号の項目には、サンプル番号が登録される。解析対象データの項目には、解析対象データが登録される。解析対象データの項目には、更に、CPU ID、PIDおよびPCの項目が設けられている。CPU ID、PIDおよびPCの各項目に登録される情報は、図7で例示した同名の各項目と同様の情報である。なお、解析対象データテーブル121ではサンプル番号の項目を省いてもよい。あるいは、サンプル番号をキーに、採取データテーブル111から解析対象データの内容を取得する場合には、解析対象データテーブル121から解析対象データの項目を省いてもよい。
例えば、解析対象データテーブル121には、サンプル番号が“N−1”、解析対象データのCPU IDが“0”、PIDが“219”、PC“0x4110”というレコードが登録される。これは、解析対象データとして、サンプル番号“N−1”に対応するCPU ID“0”、プロセスID“219”、プログラムカウンタの値“4110”といった情報が採取データテーブル111から抽出されていることを示す。
図9は、第2の実施の形態の解析結果の出力例を示す図である。図9(A)は、グラフG1を例示している。グラフG1は、解析対象時間全体に対して解析対象データテーブル121に記録された解析対象データを解析部170により統計解析した結果の出力例である。例えば、解析部170は、解析対象データテーブル121のレコード毎に、プロセスIDやプログラムカウンタの情報から、消費電力量が閾値を超えたときに実行中であった関数などのプログラム箇所(実行箇所)を特定する。例えば、解析部170は、特定した実行箇所を集計し、解析対象時間全体における総観測回数(解析対象データテーブル121のレコード数に相当)に対して、各実行箇所が観測された回数が何回であったかという割合を求める。解析部170は、その結果をグラフG1としてディスプレイ11に表示させる。図9(A)では、凡例G1aも示している。凡例G1aにおいて、“実行箇所A,B,C,D,E”は、解析対象プログラムP1に含まれる関数やサブルーチンの名称に相当する。“その他”は、解析対象プログラムP1以外のアプリケーションプログラムにおける実行箇所を示す。“IDLE”は、特定のアプリケーションプログラムが実行されていなかったこと(例えば、OS関連のプロセスのみが実行されていたことなど)を示す。
図9(B)は、グラフG2を例示している。グラフG2は、解析結果の他の出力例である。例えば、解析部170は、解析対象時間全体を所定時間間隔に区切って、当該所定時間間隔毎に、図9(A)と同様にして、当該所定時間間隔において各実行箇所が観測された回数の割合を求める。解析部170は、所定時間間隔毎の当該割合の計算結果を、グラフG2に示すヒストグラムとしてディスプレイ11に表示させる。
グラフG2のように時間経過に応じたヒストグラムを出力する場合、データ採取部150は、採取データテーブル111の各レコードに、採取データを取得した時刻も登録する。また、解析対象データ抽出部160は、解析対象データテーブル121の各レコードに、当該時刻も登録する。すると、解析部170は、解析対象データテーブル121に基づいて、所定時間間隔毎に各実行箇所が観測された回数の割合を計算することができる。
グラフG2によれば、プログラムの開発者は、比較的短期間の間に消費電力量が比較的大きかったプログラム箇所を表示内容から容易に特定できる。図9(B)の表示例によれば、実行箇所A,Bを実行中の比較的短期間に、消費電力量が極度に増大していることが容易に分かる。このため、開発者は、実行箇所A,Bに相当するプログラムのコードなどを見直し対象の候補として容易に特定できる。
なお、解析部170は、所定時間間隔(ヒストグラムのビン幅)を任意の幅に変更可能である。また、解析対象時間において実行する解析対象プログラムは、1つでもよいし、複数でもよい。例えば、並列に複数の解析対象プログラムを解析装置100により実行させて、プロファイリングを行うこともできる。その場合、解析部170は、解析対象プログラム毎の実行箇所の情報を含むグラフG1やグラフG2をディスプレイ11に表示させることができる。例えば、解析部170は、解析対象プログラムP1の実行箇所A,B,C,・・・それぞれの割合と他の解析対象プログラムの複数の実行箇所それぞれの割合とを1つのグラフ上に区別して表示させてもよい。
また、キャッシュミスなど他の種類のベースイベントに対しても、図9と同様のグラフにより結果を表示できる。例えば、キャッシュミスの発生頻度や、発生頻度の割合をプログラムの実行箇所毎に表示させることもできる。
次に、解析装置100による処理の手順を説明する。図10に示す手順は、解析対象プログラムP1を実行している最中に実行される。
図10は、第2の実施の形態のデータ採取例を示すフローチャートである。以下、図10に示す処理をステップ番号に沿って説明する。
(S1)データ採取部150は、カウンタ101a(カウンタCT1)から割り込みを受け付ける。
(S2)データ採取部150は、採取データを取得し、採取データ記憶部110に記憶された採取データテーブル111に記録する。採取データは、例えば、CPU ID、プロセスIDおよびプログラムカウンタの値などを含む。また、採取データは、カウンタ101bの区間カウント数を含む。図9で例示したように、データ採取部150は、当該採取データを、採取時の時刻に対応付けて、採取データテーブル111に記録してもよい。
(S3)データ採取部150は、データ採取を終了するか否かを判定する。終了する場合、処理を終了する。終了しない場合、処理をステップS1に進める。例えば、解析対象プログラムP1の実行が終了した場合、データ採取は終了となる。
カウンタ101aは、カウンタオーバーフローによるハードウェア割り込みを一定時間間隔毎に発生させるので、データ採取部150は、ステップS1,S2,S3の手順を一定時間間隔毎に実行することになる。
こうして、採取データテーブル111に採取データが記録される。解析対象データ抽出部160は、採取データテーブル111から、カウンタ101bの区間カウント数に基づいて、解析対象データを抽出する。解析装置100は、解析対象データの抽出を解析対象プログラムP1の実行が終了した後に実行する。
図11は、第2の実施の形態の解析対象データ抽出例を示すフローチャートである。以下、図11に示す処理をステップ番号に沿って説明する。
(S11)解析対象データ抽出部160は、変数iに0を代入する。変数iは、サンプル番号に相当する値である(サンプル番号iということがある)。解析対象データ抽出部160は、変数S0に0を代入する。変数S0は、変数Siの初期値である。変数Siは、変数iで示されるサンプル番号に対応するカウンタ101bの区間カウント数の積算値である(積算値Siということがある)。
(S12)解析対象データ抽出部160は、i+1を変数iに代入する。この処理は、変数iをインクリメントする処理ともいえる。あるいは、変数iに1を加算した結果を、変数iに代入する処理であるともいえる。
(S13)解析対象データ抽出部160は、採取データテーブル111を参照して、採取データDiがあるか否かを判定する。ある場合、処理をステップS14に進める。ない場合、処理を終了する。ここで、採取データDiは、採取データテーブル111のサンプル番号iのレコードに相当する。
(S14)解析対象データ抽出部160は、変数S(i−1)+区間カウント数Ciを、変数Siに代入する。区間カウント数Ciは、サンプル番号iのレコードにおける区間カウント数である。この処理は、前回までの区間カウント数の積算値S(i−1)に、今回の区間カウント数Ciを加算して、今回までの区間カウント数の積算値Siを求める処理であるといえる。
(S15)解析対象データ抽出部160は、変数Siに代入された値が閾値Rよりも小さい(Si<R)か否かを判定する。小さい場合、処理をステップS12に進める。小さくない場合、すなわち、変数Siに代入された値が閾値R以上である(Si≧R)場合、処理をステップS16に進める。閾値Rは、イベントベースでのサンプリングレートを決める値として、RAM102やHDD103などに予め格納される情報である。
(S16)解析対象データ抽出部160は、(R−S(i−1))の演算結果が、(S(i)−R)の演算結果よりも小さい(R−S(i−1)<S(i)−R)か否かを判定する。小さい場合、処理をステップS17に進める。小さくない場合、すなわち、(R−S(i−1))の演算結果が、(S(i)−R)の演算結果以上である(R−S(i−1)≧S(i)−R)場合、処理をステップS18に進める。この処理は、閾値Rと前回までの区間カウント数の積算値S(i−1)との第1の差、および、今回までの区間カウント数の積算値S(i)と閾値Rとの第2の差の比較を行う処理であるといえる。第1の差の方が第2の差よりも小さければ、処理をステップS17に進める。第1の差が第2の差以上であれば、処理をステップS18に進める。
(S17)解析対象データ抽出部160は、i−1回目(サンプル番号i−1)の採取データを抽出する。抽出された採取データが、解析対象データに相当する(採取データのうち区間カウント数を除いたものを解析対象データとしてもよい)。解析対象データ抽出部160は、抽出した解析対象データを、解析対象データ記憶部120に記憶された解析対象データテーブル121に登録する。図9で例示したように、採取データテーブル111に該当データを採取した時刻の情報が登録されている場合、解析対象データ抽出部160は、当該解析対象データを、採取時の時刻に対応付けて、解析対象データテーブル121に登録してもよい。そして、処理をステップS19に進める。
(S18)解析対象データ抽出部160は、i回目(サンプル番号i)の採取データを抽出する。抽出された採取データが、解析対象データに相当する(採取データのうち区間カウント数を除いたものを解析対象データとしてもよい)。解析対象データ抽出部160は、抽出した解析対象データを、解析対象データ記憶部120に記憶された解析対象データテーブル121に登録する。図9で例示したように、採取データテーブル111に該当データを採取した時刻の情報が登録されている場合、解析対象データ抽出部160は、当該解析対象データを、採取時の時刻に対応付けて、解析対象データテーブル121に登録してもよい。そして、処理をステップS19に進める。
(S19)解析対象データ抽出部160は、変数Si−閾値Rを、変数Siに代入する。すなわち、今回までの区間カウント数の積算値Siから、閾値Rを減算した値をSiに代入する。そして、処理をステップS12に進める。
図12は、第2の実施の形態の解析対象データ抽出例を示す図である。図12では、採取データテーブル111から、ある解析対象データを抽出する際の具体例を示す。図12の例では、採取データテーブル111とともに、区間カウント数の積算値の計算結果(カウント積算値の項目)も図示している(図12で例示しているように、当該カウント積算値の項目を採取データテーブル111に設けてもよい)。また、R=10000とする。
解析対象データ抽出部160は、採取データテーブル111をサンプル番号の小さい順に参照してカウント積算値を求め、サンプル番号に対応付けて採取データテーブル111に登録する。また、解析対象データ抽出部160は、カウント積算値が閾値Rを超えるサンプル番号を検出する。解析対象データ抽出部160は、サンプル番号Nにおいて、カウント積算値S(N)が“11660”となり、閾値R=10000を超えたことを検出する。
すると、解析対象データ抽出部160は、サンプル番号N−1のカウント積算値S(N−1)“9860”を採取データテーブル111から取得し、R=10000との差10000−9860=240を求める。また、解析対象データ抽出部160は、サンプル番号Nのカウント積算値“11660”とR=10000との差11660−10000=1660を求める。解析対象データ抽出部160は、差240と差1660とを比較する(図12(1))。
差240<差1660なので、解析対象データ抽出部160は、サンプル番号N−1の解析対象データ候補を解析対象データとして採用する(図12(2))。そして、解析対象データ抽出部160は、カウント積算値S(N)から閾値R=10000を減算する。この場合、サンプル番号N+1におけるカウント積算値S(N+1)は、区間カウント数C(N+1)=70であるから、S(N+1)=11660−10000+70=1730ということになる(図12(3))。解析対象データ抽出部160は、図12で例示した処理を以降のサンプル番号の各レコードに対して順番に実行することで、解析対象データの抽出を行う。
図13は、第2の実施の形態の解析対象データ抽出例(続き)を示す図である。図13では、「(実行プログラム)::(関数)」の表記により実行中のプログラムおよび当該プログラムにおける関数を示している。ベースイベントの発生回数(図13におけるイベント発生回数)を示す軸は、時間軸の方向と同じ方向である。図13の紙面の左側から右側に向かう方向が時間軸の方向である。例えば、「A::foo1()」が付与された矩形は、プログラムAの関数名foo1()の関数が実行されている期間を示す。すなわち、図13では、プログラムAの関数名foo1()の関数、プログラムAの関数名foo2()の関数、プログラムBの関数名bar()の関数が、この順序で順番に実行されることを示している。
閾値Rは、ベースイベントの発生回数によるサンプリングのサンプリングレートを決定する値である。例えば、一単位分の電力量(例えば、1ジュール)が消費されたというベースイベントを考える場合、R=10000とするなら、1万単位分の電力量(例えば、10000ジュール)が消費されるたびに解析対象データを抽出することになる。ただし、カウンタ101bでは、ハードウェア割り込み機能がないため、ベースイベントの発生回数が丁度10000になったタイミングを計れるわけではない。
具体的には、サンプル番号N(N回目)の時点で、カウンタ101bの区間カウント数の積算値S(N)(カウント積算値S(N))がサンプリングレートR(閾値R)を超えたとする。ただし、サンプル番号Nの採取データが取得された時点は、ベースイベントの発生回数が丁度10000になったタイミング(本来のタイミング)よりも遅れた時点となる。このため、本来のタイミングよりも処理が進んでしまっており、採取データの内容が、本来のタイミングにおける内容とは異なっている可能性がある。例えば、図13では、タイミングT0が本来のタイミングである。そして、タイミングT0では、プログラムAの関数名foo2()の関数が実行されていたにも関わらず、サンプル番号Nの採取データを採用すると、プログラムBの関数名bar()の関数が実行されていたという誤った情報を得ることになる。
そこで、解析対象データ抽出部160は、閾値Rとサンプル番号N−1(N−1回目)の時点の積算値S(N−1)との差d1、および、積算値S(N)と閾値Rとの差d2とを比較する。図13の例では、d1<d2である。このため、解析対象データ抽出部160は、サンプル番号Nの採取データではなく、サンプル番号N−1の採取データを解析対象データとして採用する。サンプル番号N−1の採取データは、プログラムAの関数名foo2()の関数が実行されていたことを示しているので、サンプル番号Nの採取データを採用するよりも適切に解析対象データを抽出できたことになる。
図14は、サンプリングの比較例を示す図である。図14(A)は、差d1,d2の比較を行わずに、解析対象データの抽出を行う例を示している。図14(A)の例では、カウンタ101bの区間カウント数の積算値S(N)が閾値Rを超えるとき、サンプル番号Nのレコードを解析対象データとする。すると、上記のように、本来のタイミングT0では、プログラムAの関数名foo2()の関数が実行されていたにも関わらず、プログラムBの関数名bar()の関数が実行されていたという誤った情報を得てしまう。
更に、図14(B)は、差d1,d2の比較を行わずに、解析対象データの抽出を行う場合において、本来のタイミングからの遅延が徐々に増えていく様子を例示している。例えば、解析対象データを抽出したタイミング毎に、積算値S(i)を0にリセットして、当該タイミングから積算値S(i)を計算していくことも考えられる。しかし、このようにすると、解析対象データを抽出するタイミングの本来のタイミングからの遅延が徐々に増えてしまう。図14(B)では当該遅延Δ1,Δ2,Δ3を図示しており、Δ1<Δ2<Δ3である。このような遅延が発生する理由は、解析対象データを抽出するタイミングは、本来のタイミングから遅延し、この遅延分(図14(B)のδ1,δ2)が積算されながら、解析対象データの抽出タイミングが決定されていくからである。
図14の比較例に対し、解析装置100によれば、図13で例示したように、より適切に解析対象データを抽出できる。解析装置100は、より適切な解析対象データを蓄積していくことで、後段のプロファイリングによる評価の信頼性を向上させることができる。また、解析装置100は、積算値S(N)が閾値Rを超えたとき、積算値S(N)から閾値Rを引いた値を用いて、積算値S(N+1)を計算する。このため、図14(B)で例示した遅延の増大を抑えることができる(図14(B)で示したδ1やδ2の積算を抑えられるため)。その結果、解析対象データを抽出するタイミングの本来のタイミング(積算値S(i)が閾値Rを丁度超えたタイミング)からのずれを抑えることができる。
図15は、サンプリング方法の比較例を示す図である。図15(A)はタイムベース・サンプリングの例を示している。タイムベース・サンプリングでは、命令アドレス、プロセスIDおよび消費電力量などの動作情報を一定周期で採取する。しかし、この方法では、特定のイベント(例えば、電力消費やキャッシュミスなど)に対するホットスポット(例えば、電力消費の大きなプログラム箇所やキャッシュミス頻度の高いプログラム箇所)を得ることが容易でない。当該イベントの発生とは無関係のタイミング(一定周期のタイミング)で動作情報をサンプリングするためである。すなわち、着目するイベントが発生したときよりも後のタイミングの動作情報が取得されるため、着目するイベント発生時から動作情報の内容が変わっている可能性がある。
一方、図15(B)は消費電力ベース・サンプリングの例を示している。消費電力ベース・サンプリングでは、PMCなどにより消費電力量を示すカウント数を計数し、消費電力量が一定量を超えるたびに、動作情報をサンプリングする。しかし、カウンタ101bのようにハードウェア割り込み機能を有していないカウンタでは、動作情報を取得する契機となる割り込みを発生させることができないため、カウントオーバーフロー割り込み機能をもつタイマ用のカウンタを用いることが考えられる。具体的には、タイマ用のカウンタによる割り込みに応じたタイミングで、カウンタ101bのカウント数を取得し、当該カウント数に応じたタイミングで動作情報を取得する。しかし、この方法では、結局、着目するイベントが発生したときよりも後のタイミングの動作情報が取得されることになり、着目するイベントの発生時から動作情報の内容が変わっている可能性が残る。
解析装置100によれば、消費電力ベース・サンプリングを行う場合に、動作情報の内容が変わっている可能性を考慮して、採取する動作情報を、今回の動作情報とするか前回の動作情報とするかを選択する。これにより、ハードウェア割り込み機能をもたないカウンタ101bをサンプリングの契機を計るために用いる場合でも、より適切な動作情報を選択して取得することができる。このように取得した動作情報を用いて、後段のプロファイリングを行うことで、当該プロファイリングの結果に対する信頼性を向上させることができる。
また、採取データテーブル111には、解析対象プログラムP1の実行期間中におけるサンプルが複数登録されている。このため、採取データテーブル111を一度作成しておけば、採取データテーブル111に基づいて、消費電力ベース・サンプリングによるプロファイリングを行える。例えば、閾値Rを変更して解析対象データの抽出をやり直すことも可能である。
[第3の実施の形態]
以下、第3の実施の形態を説明する。前述の第2の実施の形態と相違する事項を主に説明し、共通する事項の説明を省略する。
第3の実施の形態では、採取データに含まれる一部の情報を補正して、より適切な解析対象データを取得する機能を提供する。ここで、第3の実施の形態の解析装置のハードウェア例は、図3で例示した第2の実施の形態のハードウェア例と同様であるため説明を省略する。第3の実施の形態では、第2の実施の形態と同じ符号・名称を用いて、同一の要素を指し示す。ただし、第3の実施の形態では、解析装置100が分岐トレース情報と呼ばれる情報を基に、採取したデータの一部を補正する点が第2の実施の形態と異なる。
図16は、第3の実施の形態のプロセッサの例を示す図である。プロセッサ101は、カウンタ101a,101bに加えて、分岐トレース支援機構101cを有する。分岐トレース支援機構101cは、プログラムの実行命令の分岐トレース情報を採取する。分岐トレース支援機構101cは、LBR(Last Branch Record)と呼ばれることもある。分岐トレース支援機構101cは、分岐トレース情報記憶部101dを有する。
分岐トレース情報記憶部101dは、分岐トレース情報を記憶する。分岐トレース情報は、分岐元の命令を格納したアドレス(分岐元アドレス:Fromアドレス)と分岐先の命令を格納したアドレス(分岐先アドレス:Toアドレス)のペアを示す情報である。分岐トレース情報記憶部101dは、分岐トレース情報を格納する専用のレジスタでもよい。当該レジスタを、LBRレジスタと称することもある。分岐トレース情報記憶部101dは、RAM102などに確保された記憶領域でもよい。RAM102などに確保された当該記憶領域をBTS(Branch Tree Store)と称することもある。分岐トレース情報の採取に分岐トレース支援機構101cを用いることで、例えば分岐成立毎にトラップを検出して分岐トレース情報を採取する手法(single step on branch)を用いるよりも、アプリケーション処理時間へのオーバーヘッドを軽減できる。
なお、以下の説明では、解析装置100により実行される所定の命令群を「基本ブロック(ベーシック・ブロック)」と称することがある。基本ブロックは、命令列上において途中で分岐することなく順次実行された命令群(命令ブロックということもできる)で、ある分岐の直後の命令から次に分岐する命令までの各命令の集合である。ここで、命令列上には条件分岐があるので、基本ブロックを予め静的に取得することは困難である。このため、解析装置100は、解析対象プログラムP1の実行中において採取された分岐トレース情報か、または、シミュレーションにより取得された分岐トレース情報を基に、基本ブロックを抽出する。例えば、分岐トレース情報において、あるレコードの分岐先アドレスから、その次のレコードの分岐元アドレスまでが基本ブロックである。
図17は、第3の実施の形態の解析装置の機能例を示す図である。第3の実施の形態の解析装置100は、採取データ記憶部110、解析対象データ記憶部120、オブジェクトファイル記憶部130、命令列記憶部140、データ採取部150、解析対象データ抽出部160、解析部170、オブジェクト回収部180、逆アセンブル実行部185および命令数カウント部190を有する。採取データ記憶部110、解析対象データ記憶部120、データ採取部150、解析対象データ抽出部160および解析部170は、図5で例示した同名・同一符号の各部と同様であるため説明を省略する。
ただし、データ採取部150は、カウンタ101aからの割り込み受付時に、プロセスの情報やカウンタ101bのカウント数(消費電力量)などに加え、分岐トレース支援機構101cから分岐トレース情報を採取し、採取データ記憶部110に格納する。ここで、第3の実施の形態の例では、データ採取部150により採取される各採取データに含まれるプロセスIDは同じであるとする。解析対象データ抽出部160は、解析対象データを抽出する際、採取データに含まれる情報の一部(プログラムカウンタのアドレス値)を命令数カウント部190により補正させる(後述する)。
オブジェクトファイル記憶部130および命令列記憶部140は、RAM102やHDD103に確保された記憶領域として実現される。オブジェクト回収部180、逆アセンブル実行部185および命令数カウント部190は、RAM102に記憶されたプログラムをCPU101が実行することで実現される。
オブジェクトファイル記憶部130は、解析対象プログラムP1のオブジェクトファイルを記憶する。オブジェクト回収部180はオブジェクトファイル記憶部130に記憶された解析対象プログラムP1のオブジェクトファイルを取得し、逆アセンブル実行部185に提供する。逆アセンブル実行部185は、オブジェクトファイルを入力として逆アセンブル処理を実行する。逆アセンブル実行部185は、逆アセンブル処理の結果として、当該オブジェクトファイルに対応する命令列の情報(アセンブルリストと呼ばれることもある)を生成し、命令列記憶部140に格納する。命令列の情報は、RAM102上のアドレスと命令の内容とを対応づけた情報である。
命令数カウント部190は、解析対象データ抽出部160が抽出した採取データを取得し、当該採取データおよび命令列記憶部140に記憶された命令列の情報に基づいて、採取データに含まれるアドレス値を補正する。命令数カウント部190は、補正後のアドレス値を解析対象データ抽出部160に応答する。解析対象データ抽出部160は、命令数カウント部190による補正後のアドレスを含む採取データを、解析対象データとして解析対象データ記憶部120に格納する。
図18は、第3の実施の形態の分岐トレース情報の例を示す図である。分岐トレース情報W10は、分岐トレース情報記憶部101dに格納される。分岐トレース情報W10は、TOS(Top Of Stack)情報W11およびアドレスペア情報W12を含む。
TOS情報W11は、アドレスペア情報W12が格納されたレジスタ・スタックにおける、最後の記録位置を示すインデックス(TOS)を記憶する。図18の例では、TOS情報W11には、インデックス“#1”が格納されている。TOS情報W11は、専用のレジスタに記録される。
アドレスペア情報W12は、実行された分岐のソース(分岐元の分岐命令アドレス)とターゲット(分岐先の命令アドレス)とを対応付けた情報である。アドレスペア情報W12は、分岐トレース支援機構101cにより、専用のレジスタ・スタックに記録されていく。例えば、当該レジスタ・スタックには、16ペア分(各ペアは#0〜#15のインデックスで示される)の分岐アドレスを記録可能である。また、当該レジスタ・スタックは、サイクリックに利用可能である。例えば、#0,#1,#2,・・・と順番にアドレスペアを格納していき、#15に対してアドレスペアを格納した後は、#0に戻って、アドレスペアを上書きで記録していく。アドレスペア情報W12の何れかのインデックスに対するレジスタ領域に、新たなアドレスペアが格納されると、TOS情報W11も更新されることになる。例えば、今回、#5のレジスタ領域に新たなアドレスペアを格納した場合、分岐トレース支援機構101cは、TOS情報W11としてインデックス“#5”を記録する。
なお、データ採取部150は、分岐トレース支援機構101cに対して、採取対象とする分岐命令の絞り込みを指示できる。例えば、データ採取部150は、採取対象とする分岐命令の種類(無条件分岐/条件分岐/call/returnなど)や分岐命令を実行する特権レベル(OSモードやユーザモードなど)といったフィルタリング設定が可能である。また、データ採取部150は、分岐トレース支援機構101cに対する分岐トレース情報の採取開始および採取停止などの指示を行うこともできる。
図19は、第3の実施の形態の命令列情報の例を示す図である。命令列情報141は、命令列記憶部140に格納される。命令列情報141は、アドレスおよび命令の項目を含む。アドレスの項目は、命令が格納されるアドレスを示す。命令の項目は、命令の内容を示す。ここで、命令列情報141の紙面に対して右側の番号は行番号である。命令列情報141では、行番号の昇順に(上の行から下の行へ向かう順に)各命令が実行されることも示している(ただし、行番号の大きい方の行から、行番号の小さい方の行へ処理がジャンプすることもある)。
例えば、命令列情報141の2行目には、アドレスが“0x4018”、命令が“add”という情報が登録されている。これは、アドレス“0x4018”の命令の内容が加算命令であることを示す。
また、例えば、命令列情報141の4行目には、アドレスが“0x4028”、命令が“Jmp A”という情報が登録される。これは、アドレス“0x4028”の命令の内容が分岐命令であり、“A:・・・”で示されるアドレスへ遷移することを示す。命令列情報141の例では、7行目の“A:0x4070”へ遷移することになる。アドレス“A:0x4070”への遷移後は、8行目以降の命令が順番に実行されることになる。
図20は、第3の実施の形態の採取データテーブルの例を示す図である。採取データテーブル111aは、採取データテーブル111に代えて、採取データ記憶部110に格納される。採取データテーブル111aは、サンプル番号、解析対象データ候補、区間カウント数および区間毎の分岐トレース情報の項目を含む。ここで、サンプル番号、解析対象データ候補および区間カウント数の項目に登録される情報は、図7で例示した採取データテーブル111の同名の項目に登録される情報と同様であるため説明を省略する。
区間毎の分岐トレース情報の項目には、分岐元アドレスと分岐先アドレスのアドレスペアが登録される。区間毎の分岐トレース情報の項目には、前回のデータ採取から今回のデータ採取までの差分のアドレスペアが登録される。このため、採取データテーブル111aの各レコードに含まれる区間毎の分岐トレース情報のアドレスペア数は、レコード毎に異なることがある。
例えば、採取データテーブル111aには、サンプル番号が“N−1”、解析対象データ候補のCPU IDが“0”、PIDが“219”、PCが“0x4110”、区間カウント数が“140”、区間毎の分岐トレース情報が“(From_1 0x40c0,To_1 0x40d8),(From_2 0x40da,To_2 0x40e0),・・・,(From_k 0x40f8,To_k 0x40fa)”(kは、3以上の整数)という情報が登録されている。
これは、カウンタ101aからN−1回目の割り込みを受け付けたときの採取データであり、CPU IDが“0”、プロセスIDが“219”、プログラムカウンタの値が“0x4110”、カウンタ101bの区間カウント数が“140”であったことを示す。更に、前回のデータ採取タイミング後、アドレス“0x40c0”からアドレス“0x40d8”への分岐、アドレス“0x40da”からアドレス“0x40e0”への分岐、・・・、アドレス“0x40f8”からアドレス“0x40fa”への分岐というようにk+1回の分岐が発生したことを示す。ただし、発生する分岐数は、1回や2回のこともある。
ここで、例えば、採取データテーブル111aのサンプル番号Nのレコードにおいて、区分毎の分岐トレース情報に登録されたアドレスペアの数がM個であるとする(Mは1以上の整数)。この場合、当該レコードには、From_1/To_1のアドレスペアから、From_M/To_Mのアドレスペアまで、M×2個のアドレスが含まれることになる。
また、サンプル番号Nのレコードにおける区分毎の分岐トレース情報を示すことを明示するため、各アドレスを、「N_From_1」、「N_To_1」、「N_From_M」、「N_To_M」というように接頭辞にサンプル番号Nを付して表わす。
前述のように、実行された命令列中において、途中に分岐を含まない命令列単位を基本ブロック(ベーシックブロック)とする。例えば、To_1アドレスからFrom_2アドレスまでの命令列が、1つの基本ブロックに相当する。
すなわち、ある分岐先アドレスTo_(m−1)(mは1以上の整数)から次の分岐元アドレスFrom_mまでが基本ブロックとなる。そこで、サンプル番号Nのレコードに含まれる区分毎の分岐トレース情報に基づく、N_To_(m−1)からN_From_mまでの命令列を、基本ブロック「N_BLK_m」とする。
そして、サンプル番号N−1におけるプログラムカウンタのアドレス値を、N_To_0とし、サンプル番号Nのレコードにおけるプログラムカウンタのアドレス値をN_From_(M+1)とする。すると、N−1回目からN回目のサンプリング間の実行命令列は、基本ブロックN_BLK_1〜N_BLK_(M+1)までの集合となる。この集合に含まれる命令の総数を、命令列情報141においてカウントした値を、総命令数Pとする。総命令数Pは、基本ブロックN_BLK_1〜N_BLK_(M+1)の間に実行された命令の総数である。
次に第3の実施の形態の解析装置100による処理手順を説明する。第3の実施の形態のデータ採取の手順は、図10で例示した第2の実施の形態のデータ採取の手順と同様であるため説明を省略する。
図21は、第3の実施の形態の解析対象データ抽出例を示すフローチャートである。以下、図21に示す処理をステップ番号に沿って説明する。ここで、第3の実施の形態では、図11で例示した第2の実施の形態の手順のステップS16〜S19に代えて、ステップS16a,S17a,S18aを実行する点が異なる。そこで、ステップS11〜S15の説明を省略する。ステップS16aは、ステップS15でNoの場合に実行される。
(S16a)解析対象データ抽出部160は、サンプル番号“i”のレコードを採取データテーブル111から取得して、命令数カウント部190に提供する。命令数カウント部190は、サンプル番号“i−1”の採取データを取得したタイミングとサンプル番号“i”の採取データを取得したタイミングとの間の総命令数Pを算出する。算出方法は、図20で例示した通りである。なお、前述のように、両タイミングで取得された採取データに含まれるプロセスIDは同一である。
(S17a)命令数カウント部190は、サンプル番号“i−1”の採取データを取得したタイミングとサンプル番号“i”の採取データを取得したタイミングとの間の総命令数Pの按分比αを、式(1)により算出する。
ここで、Rはサンプリングレートに相当する閾値である。S(i−1)は、サンプル番号“i−1”のタイミングにおけるカウンタ101bの区間カウント数の積算値である。S(i)は、サンプル番号“i”のタイミングにおけるカウンタ101bの区間カウント数の積算値である。
(S18a)命令数カウント部190は、分岐トレース情報W10を基に、命令列情報141における実走行命令上の「P×α」番目の命令アドレスを抽出する。例えば、命令数カウント部190は、サンプル番号“N−1”におけるプログラムカウンタのアドレス値N_To_0を、命令列情報141から検索する。そして、命令数カウント部190は、命令列情報141のアドレス値N_To_0の行以降の行を順に「P×α」番目に到達するまでカウントする。このとき、分岐トレース情報W10に含まれるFromアドレスに到達したならば、Toアドレスへ遷移させた上でカウントを行っていく。命令数カウント部190は、こうして「P×α」番目の行に到達したら、命令列情報141から当該行に含まれる命令アドレスを取得して、解析対象データ抽出部160に応答する。解析対象データ抽出部160は、採取データテーブル111のサンプル番号“i”のレコードのうち、プログラムカウンタのアドレス値を命令数カウント部190から取得したアドレス値に変更し、変更後のレコードを解析対象データとする。解析対象データ抽出部160は、当該解析対象データを解析対象データテーブル121に登録する。
このように、例えば、積算値S(i)がi=Nで閾値Rを超えた場合、解析装置100は、按分比αにより当該タイミングにおけるプログラムカウンタのアドレス値を補正する。補正後のアドレス値は、i=N−1(前回のタイミング)で観測されたプログラムカウンタのアドレス値から、P×α個の命令分だけ進めた命令のアドレス値である。これにより、解析装置100は、解析対象データとして取得するアドレス値の精度をより高めることができる。
なお、上記の例では解析装置100は、サンプル番号i=N−1の採取データにおけるアドレス値を起点に「P×α」個の命令分だけ進めることで、当該アドレス値を補正するものとした。一方、解析装置100は、サンプル番号i=Nの採取データにおけるアドレス値を起点に「P×β」個の命令分だけ戻すことで、当該アドレス値を補正してもよい。βは、式(1)の分子を“S(i)−R”に置き換えて算出される値である。この場合、命令数カウント部190は、分岐トレース情報W10を基に、命令列情報141を逆に辿って命令数をカウントする。命令数カウント部190は、(R−S(i−1))と(S(i)−R)との比較に応じて、サンプル番号i=N−1の採取データにおけるアドレス値を補正するか、または、サンプル番号i=Nの採取データにおけるアドレス値を補正するかを選択してもよい。例えば、(R−S(i−1))<(S(i)−R)のときは前者の補正を行い、(R−S(i−1))≧(S(i)−R)のきは後者の補正を行うことで、探索のコストが小さくなる方を選択し、補正処理のコストを軽減することも考えられる。
[第4の実施の形態]
以下、第4の実施の形態を説明する。前述の第2,第3の実施の形態と相違する事項を主に説明し、共通する事項の説明を省略する。
OSでは、プロセス毎に異なるアドレス空間を割り当てることがある。この場合、アドレス値は、解析装置100上で複数のプロセスに対して一元的に扱えず、プロセス毎に扱うことになる。例えば、プロセスIDが異なれば、アドレス空間も異なる。この場合、データ採取の2つのタイミング間(例えば、i−1番目とi番目との間)でプロセスIDが異なる場合に、第3の実施の形態の手法を適用できないことが考えられる。例えば、両タイミング間でプロセスIDが異なる場合、i番目に採取された複数の分岐アドレスペアの中の途中から別プロセスのアドレス値を示すことになるが、プロセスの切り替わりのタイミングを特定することは困難である。そこで、第4の実施の形態では、第2および第3の実施の形態の方法を組み合わせて実行する機能を提供する。
ここで、第4の実施の形態の解析装置のハードウェア例は、図3で例示した第2の実施の形態のハードウェア例と同様であるため説明を省略する。第4の実施の形態では、第2の実施の形態と同じ符号・名称を用いて、同一の要素を指し示す。また、第4の実施の形態の解析装置100の機能例は、図17で例示した第3の実施の形態の機能例と同様であるため説明を省略する。ただし、採取データ記憶部110には、採取データテーブル111aが格納される。更に、第4の実施の形態のデータ採取の手順は、図10で例示した第2の実施の形態のデータ採取の手順と同様であるため説明を省略する。第4の実施の形態では、積算値S(i)≧閾値Rとなった場合の解析対象データ抽出部160による処理が、第2および第3の実施の形態とは異なる。
図22は、第4の実施の形態の解析対象データ抽出例を示すフローチャートである。以下、図22に示す処理をステップ番号に沿って説明する。第4の実施の形態では、図11および図21で示したステップS15の後に、ステップS16bを実行し、ステップS16bの判定に応じて、ステップS16,S16aの何れへ進めるかを選択する点が、第2および第3の実施の形態と異なる。そこで、以下ではステップS16bについて説明し、他のステップの説明を省略する。ステップS16bは、ステップS15でNoの場合に実行される。
(S16b)解析対象データ抽出部160は、採取データテーブル111に含まれるサンプル番号“i−1”のレコードのプロセスID(“PID(i−1)”)と、サンプル番号“i”のレコードのプロセスID(“PID(i)”)とを比較して、両者が一致するか否かを判定する。一致する場合、処理をステップS16aに進める。一致しない場合、処理をステップS16に進める。
ステップS16a以降の手順は、図21と同様である。解析装置100は、ステップS16a〜S18aまでの処理を実行すると、処理をステップS12に進める。また、ステップS16以降の手順は、図11と同様である。解析装置100は、ステップS16〜S19までの処理を実行すると、処理をステップS12に進める。
このように、解析装置100は、積算値Siが閾値Rを超えたとき、プロセスIDの一致/不一致に応じて、解析対象データの抽出方法を選択してもよい。このようにすれば、プロセスIDが一致する場合に、より適切なアドレス情報を取得でき、後段のプロファイルの信頼性を一層高めることができる。一方、プロセスIDが一致しない場合には、補正を行わないようにすることで、不適切な補正が行われないよう制御できる。
[第5の実施の形態]
以下、第5の実施の形態を説明する。前述の第2の実施の形態と相違する事項を主に説明し、共通する事項の説明を省略する。
第2の実施の形態では、解析対象プログラムP1の実行期間中に、一定時間間隔毎にデータ採取を行い、採取データテーブル111を取得するものとした。第2の実施の形態の例では、採取データテーブル111に当該実行期間中において採取された全ての採取データが登録されることになる。一方、採取データテーブルに前回および今回の採取データのみを登録することで、解析装置100によるRAM102の使用量を節約することも考えられる。
ここで、第5の実施の形態の解析装置のハードウェア例は、図3で例示した第2の実施の形態のハードウェア例と同様であるために説明を省略する。第5の実施の形態では、第2の実施の形態と同じ符号・名称を用いて同一の要素を指し示す。また、第5の実施の形態の解析装置100の機能例は、図5で例示した第2の実施の形態の機能例と同様であるため説明を省略する。ただし、第5の実施の形態では、採取データ記憶部110に格納される情報が第2の実施の形態と異なる。
図23は、第5の実施の形態の採取データテーブルの例を示す図である。採取データテーブル111bは、採取データテーブル111に代えて、採取データ記憶部110に格納される。採取データテーブル111bは、サンプル番号、解析対象データ候補、カウント積算値(Si)およびカウンタCT2カウント数(γi)の項目を含む。ここで、サンプル番号および解析対象データ候補の項目に登録される情報は、図7で例示した採取データテーブル111の同名の項目に登録される情報と同様であるため説明を省略する。
カウント積算値(Si)の項目には、カウンタ101bの区間カウント数の積算値(Si)が登録される。カウンタCT2カウント数(γi)の項目には、カウンタ101bのカウント数(γi)が登録される。
例えば、採取データテーブル111bには、次のような情報が登録される。第1には、サンプル番号が“N−1”、解析対象データ候補のCPU IDが“0”、PIDが“219”、PCが“0x4110”、カウント積算値(Si)が“140”、カウンタCT2カウント数(γi)が“48683”という情報である。
これは、カウンタ101aからN−1回目の割り込みを受け付けたときの採取データであり、CPU IDが“0”、プロセスIDが“219”、プログラムカウンタの値が“0x4110”、カウント積算値が“140”、カウンタ101bのカウント数が“48683”であったことを示す。
第2には、採取データテーブル111bには、サンプル番号が“N”、解析対象データ候補のCPU IDが“0”、PIDが“219”、PCが“0x4230”、カウント積算値(Si)が“1800”、カウンタCT2カウント数(γi)が“50343”という情報である。
これは、カウンタ101aからN回目の割り込みを受け付けたときの採取データであり、CPU IDが“0”、プロセスIDが“219”、プログラムカウンタの値が“0x4230”、カウント積算値が“1800”、カウンタ101bのカウント数が“50343”であったことを示す。
データ採取部150は、採取データを取得するたびに、当該採取データを採取データテーブル111bに前回の採取データを残して上書きで記録する(前々回の採取データが上書きされることになる)。次に、第5の実施の形態の解析装置100による処理手順を説明する。ここで、第5の実施の形態では、データ採取を行いながら、解析対象データの抽出を行う。第5の実施の形態では、第2の実施の形態におけるデータ採取の手順および解析対象データ抽出の手順に代えて、以下の手順を実行する。
図24は、第5の実施の形態の解析対象データ抽出例を示すフローチャートである。以下、図24に示す処理をステップ番号に沿って説明する。
(S21)解析対象データ抽出部160は、変数iに0を代入する。変数iは、サンプル番号に相当する値である(サンプル番号iということがある)。解析対象データ抽出部160は、変数S0に0を代入する。変数S0は、変数Siの初期値である。変数Siは、変数iで示されるサンプル番号に対応するカウンタ101bの区間カウント数のカウント積算値である(積算値Siということがある)。更に、解析対象データ抽出部160は、カウンタ101b(カウンタCT2)の現在のカウント数γ0をRAM102に保存する。
(S22)解析対象データ抽出部160は、データ採取を終了するか否かを判定する。終了する場合、処理を終了する。終了しない場合、すなわち、データ採取を継続する場合、処理をステップS23に進める。例えば、解析対象プログラムP1の実行が終了した場合、データ採取は終了となる。
(S23)解析対象データ抽出部160は、i+1を変数iに代入する。この処理は、変数iをインクリメントする処理ともいえる。あるいは、変数iに1を加算した結果を、変数iに代入する処理であるともいえる。
(S24)データ採取部150は、カウンタ101a(カウンタCT1)から割り込みを受け付ける。
(S25)データ採取部150は、カウンタ101b(カウンタCT2)のカウント数γiを基に、積算値Siを計算する。具体的には、積算値Si=S(i−1)+{γi−γ(i−1)}である。
(S26)データ採取部150は、CPU ID、プロセスID、プログラムカウンタのアドレス値、積算値Siおよびカウンタ101b(カウンタCT2)のカウント数γiを含む現在の採取データを取得し、採取データテーブル111bに登録する。このとき、データ採取部150は、前々回(サンプル番号“i−2”)の採取データを、今回(サンプル番号“i”)の採取データで上書きする。
(S27)解析対象データ抽出部160は、変数Siに代入された値が閾値Rよりも小さい(Si<R)か否かを判定する。小さい場合、処理をステップS22に進める。小さくない場合、すなわち、変数Siに代入された値が閾値R以上である(Si≧R)場合、処理をステップS28に進める。閾値Rは、イベントベースでのサンプリングレートを決める値として、RAM102やHDD103などに予め格納される情報である。
(S28)解析対象データ抽出部160は、(R−S(i−1))の演算結果が、(S(i)−R)の演算結果よりも小さい(R−S(i−1)<S(i)−R)か否かを判定する。小さい場合、処理をステップS29に進める。小さくない場合、すなわち、(R−S(i−1))の演算結果が、(S(i)−R)の演算結果以上である(R−S(i−1)≧S(i)−R)場合、処理をステップS30に進める。
(S29)解析対象データ抽出部160は、採取データテーブル111bから、i−1回目(サンプル番号i−1)の採取データを抽出する。抽出された採取データが、解析対象データに相当する。解析対象データ抽出部160は、抽出した解析対象データを、解析対象データ記憶部120に記憶された解析対象データテーブル121に登録する。図9で例示したように、採取データテーブル111に該当データを採取した時刻の情報が登録されている場合、解析対象データ抽出部160は、当該解析対象データを、採取時の時刻に対応付けて、解析対象データテーブル121に登録してもよい。そして、処理をステップS31に進める。
(S30)解析対象データ抽出部160は、採取データテーブル111bから、i回目(サンプル番号i)の採取データを抽出する。抽出された採取データが、解析対象データに相当する。解析対象データ抽出部160は、抽出した解析対象データを解析対象データ記憶部120に記憶された解析対象データテーブル121に登録する。図9で例示したように、解析対象データを、採取時刻に対応付けて解析対象データテーブル121に登録してもよい点は、ステップS29と同様である。そして、処理をステップS31に進める。
(S31)解析対象データ抽出部160は、変数Si−閾値Rを、変数Siに代入する。すなわち、今回までの積算値Siから、閾値Rを減算した値をSiに代入する。解析対象データ抽出部160は、採取データテーブル111bにおけるサンプル番号“N”のレコードの積算値Siを、閾値Rの減算後の値に更新する。そして、処理をステップS22に進める。
第5の実施の形態の方法によっても、第2の実施の形態と同様に、より適切な動作情報を取得することができる。また、採取データテーブル111bでは、採取データテーブル111よりも記録する情報量が少ない。このため、採取データテーブル111を用いる場合に比べて、RAM102などの記憶領域を節約することができる。また、第5の実施の形態においても、第3および第4の実施の形態と同様に、解析装置100は、採取データに含まれるアドレス値を補正した解析対象データを抽出してもよい。
なお、第1の実施の形態の情報処理は、演算部1dにプログラムを実行させることで実現できる。また、第2〜第5の実施の形態の情報処理は、プロセッサ101にプログラムを実行させることで実現できる。プログラムは、コンピュータ読み取り可能な記録媒体13に記録できる。
例えば、プログラムを記録した記録媒体13を配布することで、プログラムを流通させることができる。また、プログラムを他のコンピュータに格納しておき、ネットワーク経由でプログラムを配布してもよい。コンピュータは、例えば、記録媒体13に記録されたプログラムまたは他のコンピュータから受信したプログラムを、RAM102やHDD103などの記憶装置に格納し(インストールし)、当該記憶装置からプログラムを読み込んで実行してもよい。
以上の第1〜第5の実施の形態を含む実施形態に関し、更に以下の付記を開示する。
(付記1) カウンタによるベースイベントのカウント数の積算値とプログラムまたはハードウェアの動作情報とを記憶する第1の記憶部と、
一定時間間隔毎に前記積算値と第1の動作情報とを取得して前記第1の記憶部により一時記憶し、前記積算値が所定値を超えると、前記積算値および前記所定値に基づいて現在の第2の動作情報または一時記憶した前記第1の動作情報を選択し、第2の記憶部に格納する演算部と、
を有する情報処理装置。
(付記2) 前記演算部は、前記所定値と前回の積算値との第1の差、および、今回の積算値と前記所定値との第2の差の比較に応じて、前記第1および前記第2の動作情報の何れかを選択する、付記1記載の情報処理装置。
(付記3) 前記演算部は、前記第1の差の方が前記第2の差よりも小さい場合は前記第1の動作情報を選択し、前記第1の差が前記第2の差以上の場合は前記第2の動作情報を選択する、付記2記載の情報処理装置。
(付記4) 前記第1の動作情報は、前記一定時間間隔毎のタイミングのうち前記第2の動作情報が取得されたタイミングの直前のタイミングで取得された前記動作情報である、付記1乃至3の何れか1つに記載の情報処理装置。
(付記5) 前記演算部は、前記積算値および前記所定値を用いて、前記第1の動作情報または前記第2の動作情報を補正する、付記1乃至4の何れか1つに記載の情報処理装置。
(付記6) 前記演算部は、前記所定値と前回の積算値との差の、今回の積算値と前記前回の積算値との差に対する比の値を用いて、前記第1の動作情報または前記第2の動作情報を補正する、付記5記載の情報処理装置。
(付記7) 前記第1および前記第2の動作情報は、プログラムカウンタのアドレス値を含み、
前記演算部は、前記比の値を用いて前記アドレス値を補正する、付記6記載の情報処理装置。
(付記8) 前記第1および前記第2の動作情報は、プロセスの識別情報およびプログラムカウンタのアドレス値を含み、
前記演算部は、前記第1および前記第2の動作情報に含まれる前記プロセスの識別情報の比較に応じて、前記アドレス値に対する補正を行うか否かを選択する、
付記5記載の情報処理装置。
(付記9) 前記演算部は、前記第1のおよび前記第2の動作情報に含まれる前記プロセスの識別情報が一致する場合に前記補正を行い、一致しない場合に前記補正を行わない、付記8記載の情報処理装置。
(付記10) 前記演算部は、前記積算値が前記所定値を超えると、前記積算値から前記所定値を減算する、付記1乃至9の何れか1つに記載の情報処理装置。
(付記11) 前記カウンタは、ハードウェア割り込み機能をもたないカウンタであり、
前記演算部は、他のカウンタからのハードウェア割り込みを前記一定時間間隔毎に受け付け、前記ハードウェア割り込みを受け付けると前記積算値を取得する、
付記1乃至10の何れか1項に記載の情報処理装置。
(付記12) コンピュータに、
カウンタによるベースイベントのカウント数の積算値とプログラムまたはハードウェアの第1の動作情報とを一定時間間隔毎に取得して第1の記憶部により一時記憶し、
前記積算値が所定値を超えると、前記積算値および前記所定値に基づいて現在の第2の動作情報または一時記憶した前記第1の動作情報を選択し、第2の記憶部に格納する、
処理を実行させる実行情報記録プログラム。
(付記13) コンピュータが、
カウンタによるベースイベントのカウント数の積算値とプログラムまたはハードウェアの第1の動作情報とを一定時間間隔毎に取得して第1の記憶部により一時記憶し、
前記積算値が所定値を超えると、前記積算値および前記所定値に基づいて現在の第2の動作情報または一時記憶した前記第1の動作情報を選択し、第2の記憶部に格納する、
実行情報記録方法。