(57)【要約】【課題】消費電力を適切に算出すること。【解決手段】情報処理装置１は、複数の関数それぞれの識別情報を含む実行履歴２を記録しながら、実行履歴２の記録中にプロセッサの消費電力を計測する計測関数を所定時間単位に実行する。情報処理装置１は、計測された消費電力と計測関数の識別情報とを対応付けた計測情報３をメモリ１ａに格納する。情報処理装置１は、実行履歴２および計測情報３に含まれる識別情報に基づいて、消費電力と消費電力が測定された時間帯に実行されていた関数を特定し、関数ごとの実行に伴うプロセッサの消費電力を算出する。【選択図】図１
2017111642.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータが、
複数の関数それぞれの識別情報を含む実行履歴を記録しながら、前記実行履歴の記録中にプロセッサの消費電力を計測する計測関数を所定時間単位に実行し、計測された前記消費電力と前記計測関数の識別情報とを対応付けた計測情報をメモリに格納し、
前記実行履歴および前記計測情報に含まれる識別情報に基づいて、前記消費電力と前記消費電力が測定された時間帯に実行されていた関数を特定し、関数ごとの実行に伴う前記プロセッサの消費電力を算出する、
消費電力算出方法。
【請求項２】
前記コンピュータは、異なるタイマによって時間を管理する複数のプロセッサを有し、
前記複数のプロセッサを用いて、前記計測関数を含む前記複数の関数を実行する、
請求項１記載の消費電力算出方法。
【請求項３】
前記実行履歴を記録する際に、実行された関数の識別情報に対応付けて当該関数を実行したプロセッサの識別子を記録し、
前記消費電力を計測する際に、前記計測関数の識別情報に対応付けて当該計測関数を実行した前記プロセッサの識別子を前記計測情報に記録する、
請求項２記載の消費電力算出方法。
【請求項４】
前記消費電力を算出する際に、前記実行履歴および前記識別情報に含まれる前記複数のプロセッサそれぞれの識別子に基づいて、関数ごとの実行に伴う前記複数のプロセッサそれぞれの消費電力を算出する、請求項３記載の消費電力算出方法。
【請求項５】
前記算出では、前記時間帯における前記プロセッサによる関数毎の実行時間に基づいて、前記消費電力を算出する、請求項１乃至４の何れか１項に記載の消費電力算出方法。
【請求項６】
前記計測関数を含む前記複数の関数それぞれの識別情報は、前記複数の関数それぞれに対してオペレーティングシステムが割り当てたプロセスの識別情報である、請求項１乃至５の何れか１項に記載の消費電力算出方法。
【請求項７】
複数の関数それぞれの識別情報を含む実行履歴を記録しながら、前記実行履歴の記録中にプロセッサの消費電力を計測する計測関数を所定時間単位に実行し、計測された前記消費電力と前記計測関数の識別情報とを対応付けた計測情報をメモリに格納する第１の装置と、
前記実行履歴および前記計測情報に含まれる識別情報に基づいて、前記消費電力と前記消費電力が測定された時間帯に実行されていた関数を特定し、関数ごとの実行に伴う前記プロセッサの消費電力を算出する第２の装置と、
を有する消費電力算出システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は消費電力算出方法および消費電力算出システムに関する。
【背景技術】
【０００２】
現在、情報処理装置の省電力化が図られている。例えば、ソフトウェアの開発や保守などの際に、情報処理装置によるソフトウェアの実行に応じたハードウェアの消費電力を計測し、消費電力の削減に役立てることがある。そこで、ソフトウェアに含まれる複数のメソッドの実行に伴うハードウェアの消費電力を算出する提案がある。この提案では、消費電力分析システムが、同じ期間の、各メソッドの実行履歴を示すトレースログとリソース消費量を示すリソースログとから各メソッドのリソース消費割合を算出する。消費電力分析システムは、リソース消費割合と、リソースログを基に算出されるハードウェアの消費電力とに基づいて、メソッドごとの消費電力を算出する。
【０００３】
また、コンピュータが、評価対象プログラム内の対象モジュールが外部へ及ぼす影響を示す第１のパラメータと、対象モジュールの実行による消費電力を示す第２のパラメータとに基づいて、対象モジュールの評価を行う提案もある。
【０００４】
さらに、ソースプログラムの命令ごとの消費電力を記憶するライブラリからファンクションレベルで実行プログラムの消費電力値を算出する提案もある。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０１２−１９０４４７号公報
【特許文献２】特開２００８−１８６１６３号公報
【特許文献３】特開平１１−２３２１４７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
ソフトウェアの関数の実行ログを記録しながら複数のタイミングで消費電力を計測し、計測結果と計測時刻とを計測ログとして記録することが考えられる。この場合、各計測時刻が単一の時計を基に適正に記録されていれば、関数の実行時刻と消費電力の計測時刻とを照合して、計測した消費電力と実行された関数とを対応付けることもできる。ところが、複数のプロセッサを有する情報処理装置において、複数のプロセッサそれぞれが各自のタイマによって時間を管理することがある。この場合、消費電力の計測用の関数が、各計測タイミングで別個のプロセッサによって実行され得る。すると、プロセッサごとのタイマによって別個に管理される時刻が、消費電力の計測時刻として計測ログに記録され得る。このとき、プロセッサごとのタイマに誤差があると、計測ログに記録される計測時刻の信頼性が低下する。このため、計測ログに含まれる消費電力が、実行ログで記録された何れのタイミングで計測されたものであるかを正しく把握できず、関数の実行に伴うプロセッサの消費電力の算出精度が悪化するおそれがある。
【０００７】
１つの側面では、本発明は、消費電力を適切に算出できる消費電力算出方法および消費電力算出システムを提供することを目的とする。
【課題を解決するための手段】
【０００８】
１つの態様では、消費電力算出方法が提供される。この消費電力算出方法は、コンピュータが、複数の関数それぞれの識別情報を含む実行履歴を記録しながら、実行履歴の記録中にプロセッサの消費電力を計測する計測関数を所定時間単位に実行し、計測された消費電力と計測関数の識別情報とを対応付けた計測情報をメモリに格納し、実行履歴および計測情報に含まれる識別情報に基づいて、消費電力と消費電力が測定された時間帯に実行されていた関数を特定し、関数ごとの実行に伴うプロセッサの消費電力を算出する。
【０００９】
また、１つの態様では、消費電力算出システムが提供される。この消費電力算出システムは、第１の装置と第２の装置とを有する。第１の装置は、複数の関数それぞれの識別情報を含む実行履歴を記録しながら、実行履歴の記録中にプロセッサの消費電力を計測する計測関数を所定時間単位に実行し、計測された消費電力と計測関数の識別情報とを対応付けた計測情報をメモリに格納する。第２の装置は、実行履歴および計測情報に含まれる識別情報に基づいて、消費電力と消費電力が測定された時間帯に実行されていた関数を特定し、関数ごとの実行に伴うプロセッサの消費電力を算出する。
【発明の効果】
【００１０】
１つの側面では、消費電力を適切に算出できる。
【図面の簡単な説明】
【００１１】
【図１】第１の実施の形態の情報処理装置を示す図である。
【図２】第２の実施の形態の情報処理システムを示す図である。
【図３】実行サーバのハードウェア例を示す図である。
【図４】各サーバの機能例を示す図である。
【図５】関数トレースログの例を示す図である。
【図６】消費電力トレースログの例を示す図である。
【図７】トレースログ組合せ結果の例を示す図である。
【図８】動作割合テーブルの例を示す図である。
【図９】消費電力テーブルの例を示す図である。
【図１０】各サーバの処理例を示すフローチャートである。
【図１１】関数トレースログ取得処理の例を示すフローチャートである。
【図１２】消費電力トレースログ取得処理の例を示すフローチャートである。
【図１３】ログ解析処理の例を示すフローチャートである。
【図１４】動作割合算出処理の例を示すフローチャートである。
【図１５】消費電力算出処理の例を示すフローチャートである。
【図１６】ログ解析の具体例を示す図である。
【図１７】消費電力の算出処理の具体例を示す図である。
【図１８】消費電力の算出結果の表示例（その１）を示す図である。
【図１９】消費電力の算出結果の表示例（その２）を示す図である。
【図２０】消費電力の算出結果の表示例（その３）を示す図である。
【図２１】ログ記録の比較例を示す図である。
【図２２】ログの対応付けの比較例を示す図である。
【発明を実施するための形態】
【００１２】
以下、本実施の形態を図面を参照して説明する。
［第１の実施の形態］
図１は、第１の実施の形態の情報処理装置を示す図である。情報処理装置１は、ソフトウェアの実行に伴うプロセッサの消費電力を算出する。ソフトウェアのプログラムは、複数の関数を含む。関数は、ソフトウェアにおける所定の処理を実現する命令群の一単位である。情報処理装置１は、関数ごとの実行に伴うプロセッサの消費電力を算出する機能を提供する。
【００１３】
情報処理装置１は、メモリ１ａおよびプロセッサ１ｂ，１ｃを有する。メモリ１ａは、ＲＡＭ（Random Access Memory）などの揮発性記憶装置でもよいし、ＨＤＤ（Hard Disk Drive）やフラッシュメモリなどの不揮発性記憶装置でもよい。プロセッサ１ｂ，１ｃは、ＣＰＵ（Central Processing Unit）、ＤＳＰ（Digital Signal Processor）、ＡＳＩＣ（Application Specific Integrated Circuit）、ＦＰＧＡ（Field Programmable Gate Array）などでもよい。プロセッサ１ｂ，１ｃは、マルチプロセッサでもよい。プロセッサ１ｂ，１ｃは、それぞれが別個のタイマにより時間を管理することができる。
【００１４】
プロセッサ１ｂ，１ｃは、ソフトウェアのプログラムを実行する。前述のようにソフトウェアのプログラムは複数の関数を含むので、プロセッサ１ｂ，１ｃは、複数の関数それぞれを実行するともいえる。
【００１５】
ここで、プロセッサ１ｂ，１ｃによる関数の実行は、例えば、情報処理装置１のオペレーティングシステム（ＯＳ：Operating System）により、プロセスと呼ばれる実行単位で管理され得る。例えば、ＯＳは、ある関数に対するプロセスを、プロセス名やプロセスＩＤ（IDentifier）により管理し、当該プロセスに対して割り当てるリソース（プロセッサ１ｂ，１ｃを含む）をスケジューリングする。例えば、ＯＳは、各関数に対応するプロセスの実行をプロセッサ１ｂ，１ｃに順次割り当てることで、ソフトウェアのプログラムを実行していく。
【００１６】
このとき、プロセッサ１ｂ，１ｃは、複数の関数それぞれの識別情報を含む実行履歴（トレースと呼ばれることもある）を記録することができる。例えば、ＯＳカーネルが、トレースの取得機能（トレーサ）を提供することもある。ここで、識別情報は、例えば、プロセスＩＤである。すると、ＯＳやトレーサの管理の下で、関数の実行履歴を取得できる。このとき、例えば、ＯＳで管理される時間に基づく時系列で、実行された複数の関数それぞれの識別情報が、実行履歴に記録される。
【００１７】
ソフトウェアの実行に伴う電力の消費状況を観測するため、情報処理装置１では、ソフトウェアを実行している際に、消費電力の計測も行う。具体的には、プロセッサ１ｂ，１ｃは、関数の実行履歴を記録しながら、実行履歴の記録中にプロセッサ１ｂ，１ｃの消費電力を計測する計測関数を所定時間単位に実行する。所定時間単位とは、例えば、数十マイクロ秒〜数ミリ秒程度の周期である。プロセッサ１ｂ，１ｃは、計測関数の実行により計測された消費電力と計測関数の識別情報とを対応付けた計測情報をメモリ１ａに格納する。計測される消費電力は、プロセッサ１ｂ，１ｃの両方による消費電力の合計でもよいし、プロセッサ１ｂ，１ｃ個別の消費電力でもよい。プロセッサ１ｂ，１ｃ個別の消費電力を計測すれば、後述するように関数の実行に伴うプロセッサごとの消費電力を算出することもできる。
【００１８】
ここで、計測関数の実行もＯＳによりプロセス単位に管理され得る。計測関数の識別情報は、例えばプロセスＩＤである。また、計測関数もＯＳによりプロセスとして管理され、プロセッサ１ｂ，１ｃの割り当てがスケジューリングされる。すなわち、あるタイミングでは計測関数がプロセッサ１ｂにより実行され、別のタイミングでは計測関数がプロセッサ１ｃにより実行されることもある。
【００１９】
より具体的には、上記の処理の結果、実行履歴２および計測情報３がメモリ１ａに格納される。実行履歴２には、関数名と関数の識別情報と関数の実行を開始した時刻とが対応付けて記録されている。例えば、実行履歴２は、計測関数の関数名“ｆｕｎｃＭ”、識別情報“Ｘ１”および時刻“ｔ１”の対応関係を示すレコードを含む。これは、計測関数“ｆｕｎｃＭ”が時刻ｔ１に実行開始され、当該実行が識別情報“Ｘ１”（例えばプロセスＩＤ）として管理されていることを示す。
【００２０】
また、実行履歴２は、ある関数（計測関数以外とする）の関数名“ｆｕｎｃ１”、識別情報“Ｘ２”および時刻“ｔ２”の対応関係を示すレコードを含む。これは、関数“ｆｕｎｃ１”が時刻ｔ２に実行開始され、当該実行が識別情報“Ｘ２”として管理されていることを示す。
【００２１】
また、実行履歴２は、ある関数（計測関数以外とする）の関数名“ｆｕｎｃ２”、識別情報“Ｘ３”および時刻“ｔ３”の対応関係を示すレコードを含む。これは、関数“ｆｕｎｃ２”が時刻ｔ３に実行開始され、当該実行が識別情報“Ｘ３”として管理されていることを示す。
【００２２】
更に、実行履歴２は、計測関数の関数名“ｆｕｎｃＭ”、識別情報“Ｘ４”および時刻“ｔ４”の対応関係を示すレコードを含む。これは、計測関数“ｆｕｎＭ”が時刻ｔ４に実行開始され、当該実行が識別情報“Ｘ４”として管理されていることを示す。
【００２３】
一方、計測情報３には、計測関数の識別情報と計測した消費電力とが対応付けて記録されている。ここで、計測される消費電力の一例として、プロセッサ１ｂ，１ｃの合計の消費電力を想定するが、前述のようにプロセッサ１ｂ，１ｃの個別の消費電力を、プロセッサ１ｂ，１ｃそれぞれの識別情報に対応づけて計測情報３に記録してもよい（その場合、実行履歴２のレコードにも、該当の関数を実行したプロセッサの識別情報を記録するようにする）。
【００２４】
例えば、計測情報３は、識別情報“Ｘ１”および消費電力“ａ１”の対応関係を示すレコードを含む。これは、計測関数（前述のように関数名は“ｆｕｎｃＭ”である）の実行時の識別情報“Ｘ１”に対して、消費電力“ａ１”（例えば、単位はワット（Ｗ）やワット時（Ｗｈ））が計測されたことを示す。
【００２５】
また、計測情報３は、識別情報“Ｘ４”および消費電力“ａ２”の対応関係を示すレコードを含む。これは、計測関数の実行時の識別情報“Ｘ４”に対して、消費電力“ａ２”が計測されたことを示す。
【００２６】
情報処理装置１は、このようにして取得した、実行履歴２および計測情報３に基づいて、関数ごとのプロセッサ１ｂ，１ｃによる消費電力を算出する。なお、以下の処理は、プロセッサ１ｂおよびプロセッサ１ｃの少なくとも一方によって実行される。一例として、プロセッサ１ｂが実行する場合を想定する。プロセッサ１ｂは、メモリ１ａに記憶された実行履歴２および計測情報３に含まれる識別情報に基づいて、計測された消費電力と当該消費電力が測定された時間帯に実行されていた関数を特定する。
【００２７】
例えば、プロセッサ１ｂは、計測情報３から識別情報“Ｘ１”、“Ｘ４”を抽出し、実行履歴２に含まれる識別情報と照合する。プロセッサ１ｂは、照合の結果、実行履歴２において、識別情報“Ｘ１”の直後から識別情報“Ｘ４”までの時間帯Ｔｘを取得する。時間帯Ｔｘは、時刻ｔ１の直後から時刻ｔ４までの期間である。例えば、プロセッサ１ｂは、計測情報３における識別情報“Ｘ４”および消費電力“ａ２”の計測結果を時間帯Ｔｘに対応付ける。すなわち、消費電力“ａ２”が測定された時間帯は、時間帯Ｔｘである。プロセッサ１ｂは、実行履歴２を参照して、時間帯Ｔｘに実行されていた関数“ｆｕｎｃ１”および関数“ｆｕｎｃ２”を特定する。ここでは、関数“ｆｕｎｃ１”、“ｆｕｎｃ２”が繰り返し実行されていたものとする。
【００２８】
そして、プロセッサ１ｂは、特定した関数ごとの実行に伴うプロセッサ１ｂ，１ｃの消費電力を算出する。上記の例でいえば、プロセッサ１ｂは、関数“ｆｕｎｃ１”の実行に伴う消費電力“ｑ１”および関数“ｆｕｎｃ２”の実行に伴う消費電力“ｑ２”を算出する。例えば、プロセッサ１ｂは、時間帯Ｔｘに対して計測された消費電力“ａ２”を、関数“ｆｕｎｃ１”および関数“ｆｕｎｃ２”それぞれの時間帯Ｔｘにおける総実行時間の比によって按分することで、関数ごとの消費電力を算出することが考えられる。より具体的には、時間帯Ｔｘのうち、関数“ｆｕｎｃ１”の総実行時間が３０％であり、関数“ｆｕｎｃ２”の総実行時間が７０％であるとする。すると、消費電力“ａ２”の３０％（０．３倍）が関数“ｆｕｎｃ１”の実行に伴う消費電力“ｑ１”であり、消費電力“ａ２”の７０％（０．７倍）が関数“ｆｕｎｃ２”の実行に伴う消費電力“ｑ２”となる。
【００２９】
なお、上記のようにして特定した時間帯の最後に計測された消費電力を、当該時間帯で実行された関数に配分する理由は、あるタイミングで計測される消費電力は、直前に実行された関数の実行に伴うものであると考えられるからである。
【００３０】
このように、情報処理装置１によれば、関数ごとの実行に伴うプロセッサの消費電力を適切に算出できる。
ところで、計測した消費電力に対し、プロセスＩＤなどの識別情報ではなく、消費電力の計測時刻（プロセッサが計測関数を実行した時刻）を計測用のスクリプトなどを用いて付与し、計測ログとして取得することも考えられる。この場合、実行履歴２に含まれる時刻に対して、計測時刻を対応付けることで、実行履歴２に記録された各時刻における消費電力を把握できるとも考えられる。しかし、情報処理装置１のように複数のプロセッサによって計測関数が実行され得る場合、計測ログに記録される計測時刻の信頼性が低い可能性がある。複数のプロセッサそれぞれが独自のタイマによって時刻を管理していることがあり、各タイマに誤差が生じていることがあるからである。すなわち、各プロセッサが独自で管理する時間により計測時刻を記録するため、記録される計測結果の時系列が不適切となる（例えば、実際の計測順とは異なる時刻順序で記録される）おそれがある。特に、上記のように数十マイクロ秒〜数ミリ秒程度の比較的短い周期で消費電力を計測する場合、タイマの比較的小さな誤差によって、本来の計測順序に対して記録される計測結果の時系列の順序が逆転する可能性が高まり、消費電力の計測精度が悪化し易い。
【００３１】
そこで、情報処理装置１は、計測した消費電力とともに、実行された計測関数に対して付与された識別情報を計測情報３に記録する。これにより、計測情報３に記録した消費電力が、実行履歴２に含まれる何れのタイミングで取得されたものであるかを適切に対応付けることができる。こうして、各時間帯における関数ごとの実行に伴うプロセッサの消費電力を適切に算出できる。
【００３２】
情報処理装置１は、各時間帯における消費電力の算出結果を含む消費電力情報４を出力する。例えば、ソフトウェアの開発者や保守員（情報処理装置１のユーザ）は、消費電力情報４の内容を確認することで、ある時間帯において、消費電力の比較的大きな関数を容易に把握できる。こうして、情報処理装置１は、ソフトウェアのプログラムにおける問題箇所の、ユーザによる適切かつ効率的な把握を支援できる。
【００３３】
［第２の実施の形態］
図２は、第２の実施の形態の情報処理システムを示す図である。第２の実施の形態の情報処理システムは、業務プログラムの開発や保守において、電力消費の比較的大きな関数の把握に用いられる。第２の実施の形態の情報処理システムは、実行サーバ１００および算出サーバ２００を含む。実行サーバ１００および算出サーバ２００は、ネットワーク１０を介して接続されている。ネットワーク１０は、ＬＡＮ（Local Area Network）である。ネットワーク１０は、ＷＡＮ（Wide Area Network）やインターネットなどでもよい。
【００３４】
実行サーバ１００は、業務プログラムを実行するサーバコンピュータである。業務プログラムは、複数の関数を含む。実行サーバ１００は、業務プログラムを実行しながら複数の関数それぞれの実行履歴であるトレースログを記録することができる。実行サーバ１００は、業務プログラムの実行に伴うハードウェアの消費電力の計測に用いられる。例えば、実行サーバ１００は、トレースログを記録しながら、消費電力計測用の関数を所定周期で実行することで、各計測タイミングにおける消費電力を計測ログとして記録する。実行サーバ１００は、トレースログおよび計測ログを算出サーバ２００に送信する。
【００３５】
算出サーバ２００は、実行サーバ１００から受信したトレースログおよび計測ログに基づいて、関数ごとの実行に要した実行サーバ１００の消費電力（具体的には、実行サーバ１００が備えるＣＰＵの消費電力）を算出する。
【００３６】
なお、後述するように、実行サーバ１００および算出サーバ２００の機能を１つのコンピュータ上に実現してもよい。
図３は、実行サーバのハードウェア例を示す図である。実行サーバ１００は、ＣＰＵ１０１，１０１ａ，１０１ｂ，１０１ｃ、ＲＡＭ１０２、ＨＤＤ１０３、画像信号処理部１０４、入力信号処理部１０５、読み取り装置１０６および通信インタフェース１０７を有する。各ユニットが実行サーバ１００のバスに接続されている。算出サーバ２００も実行サーバ１００と同様のハードウェアにより実現できる。
【００３７】
ＣＰＵ１０１，１０１ａ，１０１ｂ，１０１ｃは、実行サーバ１００の情報処理を制御する。ＣＰＵ１０１，１０１ａ，１０１ｂ，１０１ｃは、それぞれが独自にタイマを有し、時間を管理し得る。ＣＰＵ１０１，１０１ａ，１０１ｂ，１０１ｃは、複数のＣＰＵコアを含むマルチコアＣＰＵでもよい。
【００３８】
ここで、ＣＰＵ１０１，１０１ａ，１０１ｂ，１０１ｃそれぞれには、ＣＰＵごとの識別情報（ＣＰＵ番号）が割り振られている。ＣＰＵ番号は、プロセッサの識別子ということもできる。ＣＰＵ１０１のＣＰＵ番号は“ＣＰＵ１”である。ＣＰＵ１０１ａのＣＰＵ番号は“ＣＰＵ２”である。ＣＰＵ１０１ｂのＣＰＵ番号は“ＣＰＵ３”である。ＣＰＵ１０１ｃのＣＰＵ番号は“ＣＰＵ４”である。
【００３９】
ＲＡＭ１０２は、実行サーバ１００の主記憶装置である。ＲＡＭ１０２は、ＣＰＵ１０１，１０１ａ，・・・に実行させるＯＳのプログラムやアプリケーションプログラムの少なくとも一部を一時的に記憶する。また、ＲＡＭ１０２は、各ＣＰＵによる処理に用いる各種データを記憶する。
【００４０】
ＨＤＤ１０３は、実行サーバ１００の補助記憶装置である。ＨＤＤ１０３は、内蔵した磁気ディスクに対して、磁気的にデータの書き込みおよび読み出しを行う。ＨＤＤ１０３には、ＯＳのプログラム、アプリケーションプログラム、および各種データが格納される。実行サーバ１００は、フラッシュメモリやＳＳＤ（Solid State Drive）などの他の種類の補助記憶装置を備えてもよく、複数の補助記憶装置を備えてもよい。
【００４１】
画像信号処理部１０４は、各ＣＰＵからの命令に従って、実行サーバ１００に接続されたディスプレイ１１に画像を出力する。ディスプレイ１１としては、ＣＲＴ（Cathode Ray Tube）ディスプレイ、液晶ディスプレイ（ＬＣＤ：Liquid Crystal Display）、有機ＥＬ（Electro-Luminescence）ディスプレイなど各種のディスプレイを用いることができる。
【００４２】
入力信号処理部１０５は、実行サーバ１００に接続された入力デバイス１２から入力信号を取得し、各ＣＰＵに出力する。入力デバイス１２としては、マウスやタッチパネルなどのポインティングデバイスやキーボードなどの各種の入力デバイスを用いることができる。実行サーバ１００には、複数の種類の入力デバイスが接続されてもよい。
【００４３】
読み取り装置１０６は、記録媒体１３に記録されたプログラムやデータを読み取る装置である。記録媒体１３として、例えば、フレキシブルディスク（ＦＤ：Flexible Disk）やＨＤＤなどの磁気ディスク、ＣＤ（Compact Disc）やＤＶＤ（Digital Versatile Disc）などの光ディスク、光磁気ディスク（ＭＯ：Magneto-Optical disk）を使用できる。また、記録媒体１３として、例えば、フラッシュメモリカードなどの不揮発性の半導体メモリを使用することもできる。読み取り装置１０６は、例えば、各ＣＰＵからの命令に従って、記録媒体１３から読み取ったプログラムやデータをＲＡＭ１０２またはＨＤＤ１０３に格納する。
【００４４】
通信インタフェース１０７は、ネットワーク１０を介して他の装置と通信を行う。通信インタフェース１０７は、有線通信インタフェースでもよいし、無線通信インタフェースでもよい。
【００４５】
図４は、各サーバの機能例を示す図である。実行サーバ１００は、記憶部１１０、実行部１２０、関数遷移取得部１３０および消費電力取得部１４０を有する。
記憶部１１０は、例えば、ＲＡＭ１０２またはＨＤＤ１０３に確保した記憶領域として実装される。実行部１２０、関数遷移取得部１３０および消費電力取得部１４０は、例えば、ＲＡＭ１０２に記憶されたプログラムを各ＣＰＵが実行することで実現される。
【００４６】
記憶部１１０は、関数トレースログおよび消費電力トレースログを記憶する。関数トレースログは、実行された関数の識別情報と該当の関数を実行したＣＰＵのＣＰＵ番号と該当の関数を実行した時刻（実行時刻）とが記録されたログである。消費電力トレースログは、消費電力の計測用の関数（計測関数）の識別情報と、計測された各ＣＰＵの消費電力とが記録されたログである。ここで、関数（計測関数を含む）の実行は、プロセスと呼ばれる単位で管理される。関数の識別情報および計測関数の識別情報として、プロセスＩＤを用いることができる。なお、ＯＳによっては、プロセスを「タスク」と呼ぶこともある。その場合、プロセスＩＤは「タスクＩＤ」と呼ばれる。
【００４７】
実行部１２０は、業務プログラムを実行する。業務プログラムは複数の関数を含む。業務プログラムの機能は複数の関数に含まれる複数の命令によって実現される。実行部１２０は、各関数の実行をＣＰＵ１０１，１０１ａ，１０１ｂ，１０１ｃの何れかに割り当てることで、業務プログラムの処理を実行していく。
【００４８】
関数遷移取得部１３０は、業務プログラムの実行中に関数トレースログを作成する。例えば、関数遷移取得部１３０の機能は、所定のトレーサによって提供されてもよい。例えば、ＯＳとしてＬｉｎｕｘ（登録商標）を用いる場合、関数遷移取得部１３０は、ｆｔｒａｃｅの機能を用いて関数トレースログを取得することが考えられる。関数遷移取得部１３０は、消費電力取得部１４０により実行される計測関数の実行履歴も関数トレースログに記録する。関数遷移取得部１３０は、関数トレースログを算出サーバ２００に送信する。
【００４９】
消費電力取得部１４０は、業務プログラムの実行中に、消費電力を計測するための計測関数を所定時間単位に（所定の周期で）実行することで各ＣＰＵの消費電力を計測する。計測関数を実行して消費電力を計測するタイミングを計測タイミングと称する。例えば、計測周期は１００マイクロ秒である（ただし、計測周期は数十マイクロ秒〜数ミリ秒程度でもよい）。例えば、上記のようにＯＳとしてＬｉｎｕｘを用いる場合、消費電力取得部１４０は、ｉｐｍｉｔｏｏｌの機能が提供する計測関数を用いて消費電力を取得することが考えられる。消費電力取得部１４０は、計測関数を実行するために計測関数に付与されたプロセスＩＤと、計測されたＣＰＵごとの消費電力とを対応付けて、消費電力トレースログに記録する。ここで、消費電力取得部１４０は、計測タイミングにおいて計測関数の実行用のスクリプトを実行することで、消費電力を取得する。計測関数は、該当の計測タイミングで空いているプロセッサによって実行される。消費電力取得部１４０は、消費電力トレースログを算出サーバ２００に送信する。
【００５０】
算出サーバ２００は、記憶部２１０、ログ解析部２２０、動作割合算出部２３０、消費電力算出部２４０および表示部２５０を有する。
記憶部２１０は、例えば、算出サーバ２００が有するＲＡＭまたはＨＤＤに確保した記憶領域として実装される。ログ解析部２２０、動作割合算出部２３０、消費電力算出部２４０および表示部２５０は、例えば、算出サーバ２００が有するＲＡＭに記憶されたプログラムを、算出サーバ２００が有するＣＰＵが実行することで実現される。
【００５１】
記憶部２１０は、実行サーバ１００から受信した関数トレースログ、消費電力トレースログを記憶する。また、記憶部２１０は、トレースログ組合せ結果、動作割合テーブルおよび消費電力テーブルを記憶する。
【００５２】
トレースログ組合せ結果は、関数トレースログおよび消費電力トレースログに記録されているプロセスＩＤを基に、関数トレースログの計測関数の実行タイミングに対して、計測された消費電力を対応付けた情報である。動作割合テーブルは、ある時間帯における業務プログラム内の関数の動作割合を示す情報である。消費電力テーブルには、関数の実行に伴うＣＰＵごとの消費電力を示す情報が登録される。
【００５３】
ログ解析部２２０は、関数トレースログと消費電力トレースログとに含まれるプロセスＩＤに基づいて、関数トレースログに含まれる計測関数の実行記録と、消費電力トレースログに含まれる消費電力とを対応付けることで、トレースログ組合せ結果を作成する。
【００５４】
動作割合算出部２３０は、トレースログ組合せ結果に基づいて、順番に発生した２つの計測タイミングの間の時間範囲を、１つの区間（時間帯）として特定し、順番に発生した２つの計測タイミングのうち、後の方の計測タイミングで計測された消費電力に対応付ける。動作割合算出部２３０は、トレースログ組合せ結果に基づいて、特定した区間で実行されていた各関数の、当該区間における総実行時間の割合（動作割合）をＣＰＵごとに算出し、動作割合テーブルに記録する。
【００５５】
消費電力算出部２４０は、動作割合テーブルに基づいて、時間帯ごとに、関数の実行に伴うＣＰＵごとの消費電力を算出し、消費電力テーブルに記録する。例えば、消費電力算出部２４０は、ある時間帯について、当該時間帯に対して計測されたＣＰＵごとの消費電力を、関数ごとの動作割合によって按分することで、関数ごとに消費電力を算出する。
【００５６】
表示部２５０は、消費電力テーブルに基づいて、関数ごとの消費電力の算出結果を算出サーバ２００に接続されたディスプレイに表示させる。
図５は、関数トレースログの例を示す図である。関数トレースログ１１１は、記憶部１１０に格納される。関数トレースログ１１１は、プロセス名、プロセスＩＤ、ＣＰＵ番号、タイムスタンプおよび関数名の項目を含む。
【００５７】
プロセス名の項目には、プロセス名が記録される。プロセス名には、業務プログラムに応じた名称が付与される。プロセスＩＤの項目には、プロセスＩＤが記録される。ＣＰＵ番号の項目には、ＣＰＵ番号の情報が記録される。タイムスタンプの項目には、関数の実行開始時刻が記録される。関数トレースログ１１１に含まれる実行開始時刻として、例えば、ＯＳが管理する時計によって計測された時刻がｆｔｒａｃｅなどの機能により付与され得る。関数名の項目には、関数名が登録される。
【００５８】
例えば、関数トレースログ１１１には、プロセス名が“ｉｐｍｉｔｏｏｌ”、プロセスＩＤが“１０２０”、ＣＰＵ番号が“ＣＰＵ１”、タイムスタンプが“２６５１５２．５８５２９６”、関数名が“ｆｕｎｃＭ”という情報が記録される。これは、プロセスＩＤ“１０２０”で識別されるプロセスのプロセス名が“ｉｐｍｉｔｏｏｌ”であり、当該プロセスが関数“ｆｕｎｃＭ”を実行するものであることを示す。また、実行したＣＰＵがＣＰＵ１０１（ＣＰＵ番号“ＣＰＵ１”）であり、実行開始時刻がある基準時刻から２６５１５２．５８５２９６秒後であることを示す。
【００５９】
ここで、第２の実施の形態の例において、消費電力を計測する計測関数の関数名を“ｆｕｎｃＭ”とする。また、当該関数は、プロセス名“ｉｐｍｉｔｏｏｌ”のプロセスによって実行される。“ｆｕｎｃＭ”以外の関数名（例えば、“ｆｕｎｃＡ”、“ｆｕｎｃＢ”、“ｆｕｎｃＣ”など）は、業務プログラムの関数である。例えば、プロセス名“ＡＡＡ”のレコードは、プロセス名“ＡＡＡ”で識別される業務プログラムの関数を実行した際のレコードである。同様に、プロセス名“ＢＢＢ”のレコードは、プロセス名“ＢＢＢ”で識別される業務プログラムの関数を実行した際のレコードである。他のレコードについても同様に、プロセス名によって業務プログラムを識別できる。
【００６０】
図６は、消費電力トレースログの例を示す図である。消費電力トレースログ１１２は、記憶部１１０に格納される。消費電力取得機能のプロセスＩＤと、当該プロセスＩＤに対応するプロセスの実行（すなわち、計測関数の実行）によって計測された消費電力がＣＰＵ番号ごとに記録される。
【００６１】
例えば、消費電力トレースログ１１２には、プロセスＩＤ“１０２０”のプロセスが実行された際に計測されたＣＰＵごとの消費電力が記録されている。具体的には、ＣＰＵ１０１（ＣＰＵ番号“ＣＰＵ１”）の消費電力は“１８Ｗ”である。ＣＰＵ１０１ａ（ＣＰＵ番号“ＣＰＵ２”）の消費電力は“５５Ｗ”である。ＣＰＵ１０１ｂ（ＣＰＵ番号“ＣＰＵ３”）の消費電力は“５Ｗ”である。ＣＰＵ１０１ｃ（ＣＰＵ番号“ＣＰＵ４”）の消費電力は“２０Ｗ”である。
【００６２】
消費電力トレースログ１１２には、他のプロセスＩＤに対しても同様に、ＣＰＵごとに計測された消費電力が記録される。
図７は、トレースログ組合せ結果の例を示す図である。トレースログ組合せ結果２１１は、記憶部２１０に格納される。トレースログ組合せ結果２１１は、関数トレースログ１１１と消費電力トレースログ１１２とに記録されているプロセスＩＤを基に組合せたものである。トレースログ組合せ結果２１１は、プロセス名、プロセスＩＤ、ＣＰＵ番号、タイムスタンプ、関数名および消費電力の項目を含む。各項目に記録される内容は、関数トレースログ１１１および消費電力トレースログ１１２に含まれる各項目に記録される内容と同様であるため説明を省略する。
【００６３】
ここで、前述のように、１つの区間は順番に発生した２つの計測タイミングの間の時間帯として特定できる。トレースログ組合せ結果２１１の例では、プロセスＩＤ“１０２０”のタイムスタンプ“２６５１５２．５８５２９６”より大きくプロセスＩＤ“１１００”のタイムスタンプ“２６５１５２．５８５３９７”以下で表わされる時刻が、１つの区間に属する。
【００６４】
また、各プロセスに対して記録されたタイムスタンプによって、各関数の実行時間を計算できる。例えば、ある関数に着目した時に、当該着目する関数が動作しているＣＰＵと同じＣＰＵで次に動作した関数とのタイムスタンプの差分を、着目する関数の実行時間とする。該当の区間において、着目する関数が複数回実行されていれば、各回の実行時間の合計が当該着目する関数の実行時間である。例えば、トレースログ組合せ結果２１１の例では、プロセスＩＤ“１００２”のプロセスとプロセスＩＤ“１００４”のプロセスとは同じＣＰＵ１０１によって順番に実行されている。この場合、プロセスＩＤ“１００４”に対応するタイムスタンプ“２６５１５２．５８５３０７”とプロセスＩＤ“１００２”に対応するタイムスタンプ“２６５１５２．５８５３０１”との差（６マイクロ秒）がこのときの“ｆｕｎｃＡ”の実行時間である。同じ区間で同関数が他にもＣＰＵ１０１によって実行され、同様の計算により合計で他にも７９マイクロ秒実行されたとすれば、６＋７９＝８５マイクロ秒が当該着目する関数の、当該区間における実行時間である。
【００６５】
図８は、動作割合テーブルの例を示す図である。動作割合テーブル２１２は、記憶部２１０に格納される。動作割合テーブル２１２は、時系列に並ぶ区間“区間１”、“区間２”、・・・それぞれに対して各関数の動作割合がＣＰＵごとに登録される。動作割合テーブル２１２は、区間時間、ＣＰＵごとの消費電力、各関数の動作割合および業務ＩＤの項目を含む。
【００６６】
区間時間の項目には、１区間の時間が登録される。ＣＰＵごとの消費電力の項目には、ＣＰＵごとの消費電力が登録される。各関数の動作割合の項目には、ＣＰＵごとに各関数が実行された時間の割合を示す情報が登録される。業務ＩＤの項目には、業務プログラムを識別する情報が登録される。
【００６７】
例えば、動作割合テーブル２１２によれば、“区間１”について次のような情報が登録されている（他の区間についても同様の情報が登録される）。
“区間１”の区間時間は１００マイクロ秒である。ＣＰＵ１０１（ＣＰＵ番号“ＣＰＵ１”）の消費電力は“１０Ｗ”である。ＣＰＵ１０１ａ（ＣＰＵ番号“ＣＰＵ２”）の消費電力は“４０Ｗ”である。ＣＰＵ１０１ｂ（ＣＰＵ番号“ＣＰＵ３”）の消費電力は“５Ｗ”である。ＣＰＵ１０１ｃ（ＣＰＵ番号“ＣＰＵ４”）の消費電力は“１０Ｗ”である。
【００６８】
更に、ＣＰＵ１０１により、“区間１”において、関数名“ｆｕｎｃＡ”で識別される関数Ａ、関数名“ｆｕｎｃＢ”で識別される関数Ｂ、および、関数名“ｆｕｎｃＣ”で識別される関数Ｃが実行されている。当該“区間１”においてＣＰＵ１０１による関数Ａの動作割合は“０．７”である。同区間のＣＰＵ１０１による関数Ｂの動作割合は“０．１”である。同区間のＣＰＵ１０１による関数Ｃの動作割合は“０．２”である。
【００６９】
また、ＣＰＵ１０１ａにより、“区間１”において、関数名“ｆｕｎｃＥ”で識別される関数Ｅ、関数Ｂおよび関数Ｃが実行されている。当該“区間１”において、ＣＰＵ１０１ａによる関数Ｅの動作割合は“０．６”である。同区間のＣＰＵ１０１ａによる関数Ｂの動作割合は“０．１”である。同区間のＣＰＵ１０１ａによる関数Ｃの動作割合は“０．３”である。
【００７０】
また、ＣＰＵ１０１ｂにより、“区間１”において、関数名“ｆｕｎｃＤ”で識別される関数Ｄおよび関数Ｃが実行されている。当該“区間１”において、ＣＰＵ１０１ｂによる関数Ｄの動作割合は“０．８”である。同区間のＣＰＵ１０１ｂによる関数Ｃの動作割合は“０．２”である。
【００７１】
また、ＣＰＵ１０１ｃにより、“区間１”において、関数名“ｆｕｎｃＦ”で識別される関数Ｆが実行されている。当該“区間１”において、ＣＰＵ１０１ｃによる関数Ｆの動作割合は“１．０”である。
【００７２】
また、関数Ａ，Ｅ，Ｄは、業務ＩＤ（前述のプロセス名に相当）“ＡＡＡ”で識別される業務プログラムに属する関数である。関数Ｂは、業務ＩＤ“ＢＢＢ”で識別される業務プログラムに属する関数である。関数Ｃは、業務ＩＤ“ＣＣＣ”で識別される業務プログラムに属する関数である。関数Ｆは、業務ＩＤ“ＤＤＤ”で識別される業務プログラムに属する関数である。
【００７３】
ここで、動作割合テーブル２１２には、ＣＰＵ１０１ｃ（ＣＰＵ番号“ＣＰＵ４”）に対応する情報として、“関数Ｆ”が“１．０”という情報が登録されている。これは、“ＣＰＵ４”が１つの区間で“関数Ｆ”を継続して実行しており、他の関数を実行しなかったため、割合が“１．０”になっている。例えば、図７のトレースログ組合せ結果２１１では、プロセスＩＤ“１０２０”の消費電力取得機能（例えば、ｉｐｍｉｔｏｏｌ）が実行され、プロセスＩＤ“１１００”の消費電力取得機能が実行されるまでの区間に“ＣＰＵ４”の実行履歴がない。しかし、プロセスＩＤ“１０２０”の消費電力取得機能の前に“ＣＰＵ４”が“関数Ｆ”を実行し、プロセスＩＤ“１１００”の消費電力取得機能の後まで実行している場合は、当該区間で“ＣＰＵ４”が“関数Ｆ”を継続して実行していたとみなす。
【００７４】
図９は、消費電力テーブルの例を示す図である。消費電力テーブル２１３は、記憶部２１０に格納される。消費電力テーブル２１３は、時系列に並ぶ区間“区間１”、“区間２”、・・・それぞれに対して各関数の消費電力の算出結果がＣＰＵごとに登録される。消費電力テーブル２１３は、区間時間、ＣＰＵごとの消費電力、各関数の消費電力および業務ＩＤの項目を含む。
【００７５】
区間時間の項目には、１区間の時間が登録される。ＣＰＵごとの消費電力の項目には、ＣＰＵごとの消費電力が登録される。各関数の消費電力の項目には、関数ごとの実行に伴う消費電力の算出結果がＣＰＵごとに登録される。業務ＩＤの項目には、業務プログラムを識別する情報が登録される。
【００７６】
例えば、消費電力テーブル２１３によれば、“区間１”について次のような情報が登録されている（他の区間についても同様の情報が登録される）。
“区間１”の区間時間、ＣＰＵごとの消費電力および業務ＩＤについては、動作割合テーブル２１２に登録される内容と同じである。
【００７７】
“区間１”における関数Ａの実行に伴うＣＰＵ１０１の消費電力の算出結果は“７Ｗ”である。同区間における関数Ｂの実行に伴うＣＰＵ１０１の消費電力の算出結果は“１Ｗ”である。同区間における関数Ｃの実行に伴うＣＰＵ１０１の消費電力の算出結果は“２Ｗ”である。
【００７８】
“区間１”における関数Ｅの実行に伴うＣＰＵ１０１ａの消費電力の算出結果は“２４Ｗ”である。同区間における関数Ｂの実行に伴うＣＰＵ１０１ａの消費電力の算出結果は“４Ｗ”である。同区間における関数Ｃの実行に伴うＣＰＵ１０１ａの消費電力の算出結果は“１２Ｗ”である。
【００７９】
“区間１”における関数Ｄの実行に伴うＣＰＵ１０１ｂの消費電力の算出結果は“４Ｗ”である。同区間における関数Ｃの実行に伴うＣＰＵ１０１ｂの消費電力の算出結果は“１Ｗ”である。
【００８０】
“区間１”における関数Ｆの実行に伴うＣＰＵ１０１ｃの消費電力の算出結果は“１０Ｗ”である。
次に、以上のような構成の実行サーバ１００および算出サーバ２００による処理の手順を説明する。
【００８１】
図１０は、各サーバの処理例を示すフローチャートである。以下、図１０に示す処理をステップ番号に沿って説明する。
（Ｓ１１）実行部１２０は、消費電力の計測対象とする業務プログラムの実行を開始する。実行開始する業務プログラムは１つでもよいし、複数でもよい。
【００８２】
（Ｓ１２）関数遷移取得部１３０は、関数トレースログ取得処理を実行する。例えば、関数遷移取得部１３０は、ｆｔｒａｃｅの機能を用いて、関数トレースログ１１１を取得する。詳細は後述される。
【００８３】
（Ｓ１３）消費電力取得部１４０は、消費電力トレースログ取得処理を実行する。例えば、消費電力取得部１４０は、計測関数を定期的に実行することで、ＣＰＵごとの消費電力を計測し、消費電力トレースログ１１２を得る。例えば、消費電力取得部１４０は、ｉｐｍｉｔｏｏｌの機能を用いて、消費電力を計測する。ステップＳ１２，Ｓ１３の処理は並列に実行される。関数遷移取得部１３０は、消費電力取得部１４０による計測関数の実行についても関数トレースログ１１１に記録する。詳細は後述される。
【００８４】
（Ｓ１４）ログ解析部２２０は、ログ解析処理を実行する。ログ解析部２２０は、実行サーバ１００から関数トレースログ１１１および消費電力トレースログ１１２を取得し、記憶部２１０に格納する。ログ解析部２２０は、関数トレースログ１１１および消費電力トレースログ１１２に基づいて、トレースログ組合せ結果２１１を作成する。詳細は後述される。
【００８５】
（Ｓ１５）動作割合算出部２３０は、トレースログ組合せ結果２１１に基づいて、各区間における関数ごとの動作時間の割合をＣＰＵごとに算出し、動作割合テーブル２１２に登録する。詳細は後述される。
【００８６】
（Ｓ１６）消費電力算出部２４０は、動作割合テーブル２１２に基づいて、関数ごとの実行に伴うＣＰＵごとの消費電力を算出し、消費電力テーブル２１３に登録する。詳細は後述される。
【００８７】
（Ｓ１７）表示部２５０は、消費電力テーブル２１３に登録されている内容を算出サーバ２００に接続されたディスプレイに表示する。そして、処理を終了する。
図１１は、関数トレースログ取得処理の例を示すフローチャートである。以下、図１１に示す処理をステップ番号に沿って説明する。なお、図１１に示す手順はステップＳ１２に相当する。
【００８８】
（Ｓ２１）関数遷移取得部１３０は、実行部１２０による業務プログラムの関数の実行および消費電力取得部１４０による計測関数の実行に応じて、プロセス名、プロセスＩＤ、実行したＣＰＵのＣＰＵ番号、タイムスタンプおよび関数名を取得する。関数遷移取得部１３０は、取得した情報を関数トレースログ１１１に記録する。
【００８９】
（Ｓ２２）関数遷移取得部１３０は、消費電力の計測対象とする業務プログラムの実行が終了したか否かを判定する。終了している場合、処理を終了する。終了していない場合、処理をステップＳ２１に進める。
【００９０】
図１２は、消費電力トレースログ取得処理の例を示すフローチャートである。以下、図１２に示す処理をステップ番号に沿って説明する。なお、図１２に示す手順はステップＳ１３に相当する。
【００９１】
（Ｓ３１）消費電力取得部１４０は、計測関数を実行することでＣＰＵごとの消費電力を取得する。例えば、所定のｉｐｍｉｔｏｏｌコマンドを発行することで、当該計測関数を実行できる。例えば、消費電力取得部１４０は、当該コマンドを発行することで、計測関数の処理を起動し、ＣＰＵごとの消費電力を取得する。
【００９２】
（Ｓ３２）消費電力取得部１４０は、ステップＳ３１における計測関数の実行に用いられたプロセスのプロセスＩＤを取得する。
（Ｓ３３）消費電力取得部１４０は、ステップＳ３１で取得した消費電力とステップＳ３２で取得したプロセスＩＤとを対応付けて、消費電力トレースログ１１２に記録する。
【００９３】
（Ｓ３４）消費電力取得部１４０は、消費電力の計測対象とする業務プログラムの実行が終了したか否かを判定する。終了している場合、処理を終了する。終了していない場合、処理をステップＳ３５に進める。
【００９４】
（Ｓ３５）消費電力取得部１４０は、前回の消費電力の取得から所定時間を経過しているか否かを判定する。例えば、所定時間は、１００マイクロ秒である。所定時間を経過している場合、処理をステップＳ３１に進める。所定時間を経過していない場合、所定時間が経過するまで待機する（ステップＳ３５の判定を繰り返す）。
【００９５】
こうして、実行サーバ１００による消費電力算出用の情報採取が完了する。算出サーバ２００は、実行サーバ１００によって採取された情報を基に、関数ごとの消費電力を算出する。
【００９６】
図１３は、ログ解析処理の例を示すフローチャートである。以下、図１３に示す処理をステップ番号に沿って説明する。なお、図１３に示す手順はステップＳ１４に相当する。
（Ｓ４１）ログ解析部２２０は、関数トレースログ１１１と消費電力トレースログ１１２とを実行サーバ１００から取得する。
【００９７】
（Ｓ４２）ログ解析部２２０は、関数トレースログ１１１と消費電力トレースログ１１２に記録されている消費電力取得機能（例えば、ｉｐｍｉｔｏｏｌ）のプロセスＩＤに基づいて、関数トレースログ１１１の各レコードに、計測された消費電力を対応付ける。ログ解析部２２０は、当該対応付けの結果として、トレースログ組合せ結果２１１を作成する。
【００９８】
（Ｓ４３）ログ解析部２２０は、トレースログ組合せ結果２１１を記憶部２１０に格納する。そして、処理を終了する。
図１４は、動作割合算出処理の例を示すフローチャートである。以下、図１４に示す処理をステップ番号に沿って説明する。また、図１４に示す処理はステップＳ１５の処理に対応する。
【００９９】
（Ｓ５１）動作割合算出部２３０は、トレースログ組合せ結果２１１を参照する。動作割合算出部２３は、トレースログ組合せ結果２１１に含まれる複数の計測タイミングに基づいて、複数の区間を特定する。具体的には、動作割合算出部２３０は、トレースログ組合せ結果２１１に基づいて、順番に発生した２つの計測タイミングの間の時間範囲を、１つの区間（時間帯）として特定する。このとき、動作割合算出部２３０は、順番に発生した２つの計測タイミングのうち、後の方の計測タイミングで計測された消費電力を特定した区間に対応付ける。
【０１００】
（Ｓ５２）動作割合算出部２３０は、複数の区間のうち１つの区間を選択する（既に選択済みで以降のステップを実行済みの区間を選択対象外とする）。
（Ｓ５３）動作割合算出部２３０は、区間時間を算出する。例えば、トレースログ組合せ結果２１１の例によれば、プロセスＩＤ“１０２０”のタイムスタンプを起点とし、プロセスＩＤ“１１００”のタイムスタンプを終点とする時間の長さが区間時間である。動作割合算出部２３０は、算出した区間時間を動作割合テーブル２１２に登録する。
【０１０１】
（Ｓ５４）動作割合算出部２３０は、各関数の実行時間をＣＰＵごとに算出する。例えば、図７でも説明したように、動作割合算出部２３０は、ＣＰＵ１０１に関し、プロセスＩＤ“１００２”のタイムスタンプからプロセスＩＤ“１００４”のタイムスタンプの時刻までの時間を、関数ＡがＣＰＵ１０１で実行された時間として特定する。また、同区間内で他に関数ＡがＣＰＵ１０１で実行されている場合、動作割合算出部２３０は、実行時間を加算して合計実行時間を算出する。
【０１０２】
（Ｓ５５）動作割合算出部２３０は、ステップＳ５３で算出した区間時間とステップＳ５４で算出した合計実行時間を基に、ＣＰＵごとに実行された関数ごとの動作割合を算出する。動作割合算出部２３０は、算出した割合を動作割合テーブル２１２に登録する。
【０１０３】
（Ｓ５６）動作割合算出部２３０は、トレースログ組合せ結果２１１を参照して、該当区間に対応するＣＰＵごとの消費電力を取得し、動作割合テーブル２１２に登録する。
（Ｓ５７）動作割合算出部２３０は、全ての区間を処理済みであるか否かを判定する。処理済みの場合、処理を終了する。処理済みでない場合、処理をステップＳ５２に進める。
【０１０４】
図１５は、消費電力算出処理の例を示すフローチャートである。以下、図１５に示す処理をステップ番号に沿って説明する。また、図１５に示す手順はステップＳ１６に相当する。
【０１０５】
（Ｓ６１）消費電力算出部２４０は、動作割合テーブル２１２を参照する。
（Ｓ６２）消費電力算出部２４０は、１つの区間を選択する（既に選択済みで以降のステップを実行済みの区間を選択対象外とする）。消費電力算出部２４０は、動作割合テーブル２１２の区間時間およびＣＰＵごとの消費電力を消費電力テーブル２１３に登録する。
【０１０６】
（Ｓ６３）消費電力算出部２４０は、動作割合テーブル２１２の各関数の動作割合と消費電力テーブル２１３のＣＰＵごとの消費電力を基に、各関数の実行に伴うＣＰＵごとの消費電力を算出する。具体的には、消費電力算出部２４０は、計測された消費電力を、関数ごとの動作割合で按分する。より具体的には、動作割合テーブル２１２および消費電力テーブル２１３の例では、“区間１”において、ＣＰＵ１０１の消費電力は１０Ｗである。関数Ａの動作割合は０．７である。関数Ｂの動作割合は０．１である。関数Ｃの動作割合は０．２である。よって、消費電力算出部２４０は、“区間１”において、ＣＰＵ１０１の関数Ａの実行に伴う消費電力を、１０×０．７＝７Ｗと算出する。同区間において、ＣＰＵ１０１の関数Ｂの実行に伴う消費電力を１０×０．１＝１Ｗと算出する。同区間において、ＣＰＵ１０１の関数Ｃの実行に伴う消費電力を１０×０．２＝２Ｗと算出する。消費電力算出部２４０は、算出した各関数の消費電力を消費電力テーブル２１３に登録する。
【０１０７】
（Ｓ６４）消費電力算出部２４０は、全ての区間を処理済みであるか否かを判定する。処理済みの場合、処理を終了する。処理済みでない場合、処理をステップＳ６２に進める。
【０１０８】
次に、上記の一連の処理の具体例を説明する。まず、ログ解析の具体例を説明する。
図１６は、ログ解析の具体例を示す図である。例えば、実行サーバ１００は、スクリプト３００を実行し、業務プログラムの実行と並行して、ｉｐｍｉｔｏｏｌの機能により消費電力を１００マイクロ秒周期で計測する。その結果、実行サーバ１００は、関数トレースログ１１１ａおよび消費電力トレースログ１１２ａを得る。関数トレースログ１１１ａおよび消費電力トレースログ１１２ａそれぞれには、消費電力取得機能（例えば、ｉｐｍｉｔｏｏｌ）が提供する関数名“ｆｕｎｃＭ”の実行に伴うプロセスＩＤ“１１２０”および“１２００”が記録されている。このため、算出サーバ２００は、関数トレースログ１１１ａおよび消費電力トレースログ１１２ａに含まれるプロセスＩＤによって、関数トレースログ１１１ａに含まれる各計測タイミングでの消費電力を対応付ける。
【０１０９】
図１６の例によれば、プロセスＩＤ“１１２０”が実行されたタイミングで計測されたＣＰＵごとの消費電力は、ＣＰＵ１０１が“１８Ｗ”、ＣＰＵ１０１ａが“５５Ｗ”、ＣＰＵ１０１ｂが“５Ｗ”、ＣＰＵ１０１ｃが“２０Ｗ”ということになる。
【０１１０】
同様に、プロセスＩＤ“１２００”が実行されたタイミングで計測されたＣＰＵごとの消費電力は、ＣＰＵ１０１が“１０Ｗ”、ＣＰＵ１０１ａが“４０Ｗ”、ＣＰＵ１０１ｂが“５Ｗ”、ＣＰＵ１０１ｃが“１０Ｗ”ということになる。
【０１１１】
こうして、算出サーバ２００は、各区間におけるＣＰＵごとの消費電力を把握できる。
図１７は、消費電力の算出処理の具体例を示す図である。動作割合算出部２３０は、トレースログ組合せ結果２１１を参照し、各ＣＰＵで実行された関数ごとの実行時間の合計を算出する。実行時間情報２１４は、動作割合算出部２３０により算出された各ＣＰＵで実行された関数ごとの実行時間の合計を示す情報である。
【０１１２】
動作割合算出部２３０は、区間時間と各ＣＰＵで実行された関数ごとの合計実行時間を基に、動作割合を算出する。動作割合算出部２３０は、算出した割合を動作割合テーブル２１２ａに登録する。例えば、ＣＰＵ１０１について、区間時間１００マイクロ秒に対し、関数Ａの実行時間が８５マイクロ秒であり、関数Ｂの実行時間が１５マイクロ秒である場合を考える。この場合、該当の区間におけるＣＰＵ１０１の関数Ａの動作割合は、８５／１００＝０．８５である。他の関数についても同様にして動作割合を求めることができる。
【０１１３】
消費電力算出部２４０は、動作割合テーブル２１２ａを参照し、動作割合とＣＰＵごとの消費電力を基に、各関数の実行に伴う消費電力を算出する。消費電力算出部２４０は、算出した消費電力を消費電力テーブル２１３ａに登録する。例えば、該当の区間におけるＣＰＵ１０１の消費電力が１０Ｗであり、同区間におけるＣＰＵ１０１における関数Ａの動作割合が０．８５であれば、同区間において関数Ａの実行に伴うＣＰＵ１０１の消費電力は、１０×０．８５＝８．５Ｗである。
【０１１４】
次に、表示部２５０による消費電力の算出結果表示の具体例を説明する。表示部２５０は、消費電力の算出結果をディスプレイに表示させる際、各関数について消費電力をグラフ化して表示することが可能である。こうして、業務プログラムの改善点のユーザによる効率的な把握を支援する。
【０１１５】
図１８は、消費電力の算出結果の表示例（その１）を示す図である。例えば、表示部２５０は、消費電力テーブル２１３に登録されている内容を基に、図１８（Ａ），（Ｂ）のグラフを算出サーバ２００に接続されたディスプレイに表示させることができる。図１８（Ａ）は、区間Ｘ〜Ｘ＋３において合計消費電力が大きい上位３つの関数を棒グラフで表したものである。縦軸は消費電力を示している。横軸は、関数を示している。
【０１１６】
バーＭ１は、区間Ｘ〜Ｘ＋３における関数Ａの実行に伴う累積消費電力（複数の区間および複数のＣＰＵの消費電力の合計）を示している。バーＭ２は、区間Ｘ〜Ｘ＋３における関数Ｂの実行に伴う合計消費電力を示している。バーＭ３は、区間Ｘ〜Ｘ＋３における関数Ｃの実行に伴う合計消費電力を示している。例えば、図１８（Ａ）によれば、区間Ｘ〜Ｘ＋３における合計消費電力が最も大きいのは、関数Ａであることが分かる。
【０１１７】
図１８（Ｂ）は、区間Ｘ〜Ｘ＋３において累積消費電力が大きい上位３つの関数の各区間の消費電力（複数のＣＰＵの消費電力の合計）を線グラフで表したものである。縦軸は消費電力を示している。横軸は、区間を示している。
【０１１８】
系列Ｎ１は、区間Ｘ〜Ｘ＋３それぞれにおける関数Ａに対応する消費電力を示したものである。系列Ｎ２は、区間Ｘ〜Ｘ＋３それぞれにおける関数Ｂに対応する消費電力を示したものである。系列Ｎ３は、区間Ｘ〜Ｘ＋３それぞれにおける関数Ｃに対応する消費電力を示したものである。
【０１１９】
図１９は、消費電力の算出結果の表示例（その２）を示す図である。例えば、表示部２５０は、消費電力テーブル２１３に登録されている内容を基に、図１９（Ａ），（Ｂ）のグラフを算出サーバ２００に接続されたディスプレイに表示させることもできる。図１９（Ａ）は、区間Ｘ〜Ｘ＋２それぞれで消費電力（複数のＣＰＵの消費電力の合計）が最も大きい関数を表した棒グラフである。縦軸は消費電力（１区間に関する消費電力であり瞬間消費電力と称してもよい）を示している。横軸は、区間を示している。
【０１２０】
バーＭ１１は、区間Ｘにおける関数Ａに対応する消費電力を示している。バーＭ１２は、区間Ｘ＋１における関数Ｃに対応する消費電力を示している。バーＭ１３は、区間Ｘ＋２における関数Ｂに対応する消費電力を示している。図１９（Ａ）によれば、区間Ｘで消費電力が最も大きい関数は、関数Ａである。また、区間Ｘ＋１で消費電力が最も大きい関数は、関数Ｃである。区間Ｘ＋２で消費電力が最も大きい関数は、関数Ｂである。
【０１２１】
図１９（Ｂ）は、区間Ｘ〜Ｘ＋２それぞれで瞬間消費電力が最も大きい関数の各区間の消費電力を線グラフにしたものである。縦軸は消費電力（瞬間消費電力）を示している。横軸は、区間を示している。
【０１２２】
系列Ｎ１１は、区間Ｘ〜Ｘ＋２それぞれにおける関数Ａに対応する消費電力を示したものである。系列Ｎ１２は、区間Ｘ〜Ｘ＋２それぞれにおける関数Ｂに対応する消費電力を示したものである。系列Ｎ１３は、区間Ｘ〜Ｘ＋２それぞれにおける関数Ｃに対応する消費電力を示したものである。
【０１２３】
図２０は、消費電力の算出結果の表示例（その３）を示す図である。例えば、表示部２５０は、消費電力テーブル２１３に登録されている内容を基に、図２０のグラフを算出サーバ２００に接続されたディスプレイに表示させることもできる。図２０は、区間Ｘ〜Ｘ＋３における累積消費電力が大きい上位３つの関数の区間ごとの消費電力と当該関数のスループットとを線グラフで表したものである。左縦軸は消費電力を示している。右縦軸はスループットを示している。横軸は、区間を示している。ここで、スループットは、業務プログラムを実行することで単位時間当たりに処理されたデータ量を示す。スループットは、実行部１２０が業務プログラムの実行中に、実行サーバ１００が備える所定のスループット計測部により取得される。
【０１２４】
系列Ｎ２１は、区間Ｘ〜Ｘ＋３それぞれの関数Ａに対応する消費電力を示したものである。系列Ｎ２２は、区間Ｘ〜Ｘ＋３それぞれの関数Ｂに対応する消費電力を示したものである。系列Ｎ２３は、区間Ｘ〜Ｘ＋３それぞれの関数Ｃに対応する消費電力を示したものである。系列Ｎ２４は、区間Ｘ〜Ｘ＋３における業務プログラムのスループットを示したものである。
【０１２５】
例えば、図２０の表示を基に、ユーザは、業務プログラムの改善点を検討し得る。例えば、スループットが小さいにも関わらず消費電力が大きい関数を特定し、当該関数を改修することが考えられる。
【０１２６】
ところで、実行サーバ１００による計測ログの記録方法として、計測した消費電力を、計測を行った時刻（計測時刻）に対応づけて記録することも考えられる。
図２１は、ログ記録の比較例を示す図である。例えば、ＣＰＵ１０１（ＣＰＵ番号“ＣＰＵ１”）とＣＰＵ１０１ａ（ＣＰＵ番号“ＣＰＵ２”）に着目して考える。
【０１２７】
計測処理は、周期的に実行される。前述のように、周期は、例えば、数十マイクロ秒から数百マイクロ秒程度である。ここでは、一例として、計測処理を５０マイクロ秒とする。計測処理は、ＣＰＵ１０１，１０１ａの何れかによって実行される。例えば、ＣＰＵ１０１は、時刻Ｔ３，Ｔ５，Ｔ８に計測処理を実行する。また、ＣＰＵ１０１ａは、時刻Ｔ７に計測処理を実行する。時刻Ｔ３，Ｔ５，Ｔ７，Ｔ８は、この順で時系列となっている。関数トレースログには、当該計測の結果が記録される。消費電力の計測ログにも各ＣＰＵによって、計測を行った時刻と消費電力の計測結果が記録される。
【０１２８】
このとき、関数トレースログには、例えばＯＳが管理するタイマの時刻が記録される。また、計測ログには、ＣＰＵ１０１，１０１ａが有するタイマの計測時刻が記録される。このため、ＣＰＵ１０１，１０１ａがそれぞれ別個のタイマで時刻を管理し、両タイマに誤差があると、計測ログに記録される計測時刻の信頼性が低下する。
【０１２９】
具体的には、ＣＰＵ１０１，１０１ａの各タイマにおいて、ＣＰＵ１０１ａのタイマが、ＣＰＵ１０１のタイマよりも７０マイクロ秒遅延しているとする。この場合、ＣＰＵ１０１ａが関数トレースログにおける時刻Ｔ７で計測関数を実行したという事象が、計測ログでは、時刻Ｔ７，Ｔ８よりも遅い時刻Ｔ９として記録され得る。すると、時系列で発生した計測タイミングＴａ，Ｔｂ，Ｔｃ，Ｔｄに、計測ログに記録された各計測結果を対応付けるとき、各計測タイミングに対して、計測結果を適切に対応付けることができなくなる。例えば、時系列の順序によって、最初の計測タイミングＴａの計測結果を、関数トレースログの時刻Ｔ３に、２番目の計測タイミングＴｂの計測結果を、関数トレースログの時刻Ｔ５にそれぞれ対応付けることができる（この対応付けは正しい）。ところが、続く３番目の計測タイミングＴｃの計測結果を、関数トレースログの時刻Ｔ８に、４番目の計測タイミングＴｄの計測結果を、関数トレースログの時刻Ｔ７に対応付けてしまう（誤った対応付け）。より具体的には、下記の通りである。
【０１３０】
図２２は、ログの対応付けの比較例を示す図である。図２２では、説明の簡略化のために、各ログにおけるＣＰＵ番号を省略する。関数トレースログ１１１ｂは、ＣＰＵ１０１，１０１ａによる関数の実行履歴を含む。ここで、プロセスＩＤ“Ｐ１”、“Ｐ２”、“Ｐ３”、“Ｐ４”は、業務プログラムの関数に対応するプロセスのプロセスＩＤである。プロセスＩＤ“Ｆ１”、“Ｆ２”、“Ｆ３”、“Ｆ４”は、消費電力の計測関数に対応するプロセスのプロセスＩＤである。
【０１３１】
計測ログ４００には、消費電力の計測時刻、および、計測されたＣＰＵごとの消費電力（消費電力“Ｍ１”などと表記する）が記録されている。例えば、計測ログ４００には、計測時刻“Ｔ３ａ”に対応付けて消費電力“Ｍ１”が、計測時刻“Ｔ５ａ”に対応付けて消費電力“Ｍ２”が、計測時刻“Ｔ８ａ”に対応付けて消費電力“Ｍ４”が、計測時刻“Ｔ９”に対応付けて消費電力“Ｍ３”が、それぞれ記録されている。ここで、図２１で例示したように、時刻“Ｔ３ａ”、“Ｔ５ａ”、“Ｔ８ａ”のレコードは、ＣＰＵ１０１によって記録されたものである。一方、時刻“Ｔ９”のレコードは、ＣＰＵ１０１ａによって記録されたものである。ＣＰＵ１０１ａのタイマは、ＣＰＵ１０１のタイマよりも７０マイクロ秒遅延している。このため、本来の計測タイミングは、計測時刻“Ｔ９”のレコードの方が、計測時刻“Ｔ８ａ”のレコードより早いにも関わらず、計測ログ４００上は時系列の順序が逆転して記録されていることになる。
【０１３２】
ここで、関数トレースログ１１１ｂに含まれる計測関数のレコード（プロセスＩＤ“Ｆ１”、“Ｆ２”、“Ｆ３”、“Ｆ４”のレコード）に、計測ログ４００のレコードを対応付けることを考える。関数トレースログ１１１ｂにおいて、消費電力の計測関数は、タイムスタンプ“Ｔ３”、“Ｔ５”、“Ｔ７”、“Ｔ８”の時刻に時系列に記録されている。
【０１３３】
このため、関数トレースログ１１１ｂおよび計測ログ４００の記録内容を各ログに記録された時刻の時系列で対応づけると、次のような対応付けとなる。タイムスタンプ“Ｔ３”に対して消費電力“Ｍ１”が対応付けられる。タイムスタンプ“Ｔ５”に消費電力“Ｍ２”が対応付けられる。タイムスタンプ“Ｔ７”に消費電力“Ｍ４”が対応付けられる。タイムスタンプ“Ｔ８”に消費電力“Ｍ３”が対応付けられる。しかし、上記のように、計測ログ４００の時系列において、消費電力“Ｍ３”、“Ｍ４”の順序が逆転しているため、この対応付けでは、関数トレースログ１１１ｂのタイムスタンプ“Ｔ７”、“Ｔ８”における適切な対応付けとなっていない。したがって、このような対応付けを行った結果を用いて関数ごとの消費電力を算出すると、消費電力の算出精度が悪化する。
【０１３４】
特に、上記のように数十マイクロ秒〜数ミリ秒程度の比較的短い周期で消費電力を計測する場合、タイマの比較的小さな誤差によって、本来の計測順序に対して記録される計測結果の時系列の順序が逆転する可能性が高まり、消費電力の計測精度が悪化し易い。
【０１３５】
なお、上記の問題に対し、ＣＰＵごとのタイマの時間のずれを予め計測し、ずれた時間を補正しておくことも考えられる。ところが、ＣＰＵごとのタイマの時間のずれは流動的であり、時間経過とともに変化する可能性があるため、最初に１回ずれ幅を測定し、補正する方法で対処することはできない。
【０１３６】
そこで、第２の実施の形態では、消費電力トレースログ１１２ｂで示されるように、消費電力を計測する際に、計測関数に対応するプロセスＩＤに対応付けて、消費電力を記録する。例えば、消費電力トレースログ１１２ｂでは、プロセスＩＤ“Ｆ１”に対応付けて消費電力“Ｍ１”が、プロセスＩＤ“Ｆ２”に対応付けて消費電力“Ｍ２”が、プロセスＩＤ“Ｆ３”に対応付けて消費電力“Ｍ３”が、プロセスＩＤ“Ｆ４”に対応付けて消費電力“Ｍ４”が、それぞれ記録されている。
【０１３７】
ここで、関数トレースログ１１１ｂに含まれる計測関数のレコードに、消費電力トレースログ１１２ｂのレコードを、プロセスＩＤに基づいて対応付けることを考える。この場合、関数トレースログ１１１ｂのプロセスＩＤ“Ｆ１”に消費電力“Ｍ１”が対応付けられる。関数トレースログ１１１ｂのプロセスＩＤ“Ｆ２”に消費電力“Ｍ２”が対応付けられる。そして、関数トレースログ１１１ｂのプロセスＩＤ“Ｆ３”に消費電力“Ｍ３”が対応付けられる。関数トレースログ１１１ｂのプロセスＩＤ“Ｆ４”に消費電力“Ｍ４”が対応付けられる。このように、プロセスＩＤを基に対応付けを行うことで、本来の計測タイミングに合致するよう消費電力の計測結果を対応付けることが可能となる。このようにして適切に対応付けを行った結果を用いて関数ごとの消費電力を算出することで、消費電力を適切に算出することができる。
【０１３８】
なお、消費電力取得部１４０は、消費電力取得機能の実行により、ＣＰＵごとの消費電力を取得するものとした。取得される消費電力は、消費電力取得機能が実行されたタイミングのものである。一方、消費電力取得部１４０は、ＣＰＵごとの１区間における消費電力量を取得してもよい。この場合、消費電力算出部２４０は、上記の方法と同様にして、区間ごとの各関数の実行に伴うＣＰＵごとの消費電力量を算出することもできる。
【０１３９】
また、第２の実施の形態の例では、算出サーバ２００がログ解析部２２０、動作割合算出部２３０、消費電力算出部２４０および表示部２５０を有するものとしたが、これらの機能を実行サーバ１００が有してもよい。更に、実行サーバ１００および算出サーバ２００それぞれに相当する仮想マシンを、単一のコンピュータ上で実現してもよい。
【０１４０】
なお、第１の実施の形態の情報処理は、プロセッサ１ｂ，１ｃに、プログラムを実行させることで実現できる。第２の実施の形態の情報処理は、ＣＰＵ１０１，１０１ａ，１０１ｂ，１０１ｃおよび算出サーバ２００が有するＣＰＵにプログラムを実行させることで実現できる。プログラムは、コンピュータ読み取り可能な記録媒体に記録できる。
【０１４１】
例えば、プログラムを記録した記録媒体１３を配布することで、プログラムを流通させることができる。また、プログラムを他のコンピュータに格納しておき、ネットワーク経由でプログラムを配布してもよい。コンピュータは、例えば、記録媒体１３に記録されたプログラムまたは他のコンピュータから受信したプログラムを、ＲＡＭやＨＤＤなどの記憶装置に格納し（インストールし）、当該記憶装置からプログラムを読み込んで実行してもよい。
【符号の説明】
【０１４２】
１  情報処理装置
１ａ  メモリ
１ｂ，１ｃ  プロセッサ
２  実行履歴
３  計測情報
４  消費電力情報
【図１】
2017111642.tif 000003
【図２】
2017111642.tif 000004
【図３】
2017111642.tif 000005
【図４】
2017111642.tif 000006
【図５】
2017111642.tif 000007
【図６】
2017111642.tif 000008
【図７】
2017111642.tif 000009
【図８】
2017111642.tif 000010
【図９】
2017111642.tif 000011
【図１０】
2017111642.tif 000012
【図１１】
2017111642.tif 000013
【図１２】
2017111642.tif 000014
【図１３】
2017111642.tif 000015
【図１４】
2017111642.tif 000016
【図１５】
2017111642.tif 000017
【図１６】
2017111642.tif 000018
【図１７】
2017111642.tif 000019
【図１８】
2017111642.tif 000020
【図１９】
2017111642.tif 000021
【図２０】
2017111642.tif 000022
【図２１】
2017111642.tif 000023
【図２２】
2017111642.tif 000024