(57)【要約】      （修正有）【課題】所定プログラムの負荷を、より簡便に把握する。【解決手段】ホストＯＳ２０１に設けられた収集ドライバ７０１は、タイマ７０７のハードウエア割り込みのタイミングで、仮想スイッチ４０１が専有しているＣＰＵのプログラムカウンタ値（つまり、実行アドレス）をサンプリングする。実行アドレスは、ログテーブルとして走行データ記憶部７０３に記憶される。分析エージェント７０５は、予め用意されたアプリケーションのＣＰＵ使用率と、実行アドレス範囲ごとの占有率の分布とを対応させた走行パターンテーブルに基づいて、ログテーブルを分析し、仮想スイッチ４０１の負荷を推測する。【選択図】図７
2018005688.tif 000002
【特許請求の範囲】
【請求項１】
プロセッサで実行される所定プログラムの負荷のレベルと、当該負荷の状態における当該プロセッサの走行パターンとを対応付けて記憶するコンピュータに、
前記所定プログラムを実行中の前記プロセッサにおける走行データを収集する処理と、
前記走行データに基づいて前記プロセッサの走行状況を集計する処理と、
前記走行状況と前記走行パターンとの比較結果に基づいて、前記所定プログラムの負荷を推定する推定処理と
を実行させる負荷推定プログラム。
【請求項２】
前記走行状況及び前記走行パターンは、前記プロセッサにおける実行アドレスの度数分布に基づく特徴を含む
請求項１記載の負荷推定プログラム。
【請求項３】
前記度数分布における階級の範囲は、所定の上限幅内に含まれる前記実行アドレスの広がりに応じて設定される
請求項２記載の負荷推定プログラム。
【請求項４】
前記走行状況及び前記走行パターンは、前記所定の上限幅の異なる２種類の前記度数分布の各々に基づく前記特徴を含む
請求項３記載の負荷推定プログラム。
【請求項５】
前記推定処理において、前記走行状況に近似する前記走行パターンに対応する前記負荷のレベルを特定する
請求項１乃至４のいずれか１つ記載の負荷推定プログラム。
【請求項６】
前記推定処理において、前記走行状況に含まれる指標と、２つの前記走行パターンの各々に含まれる同種の指標との各差の比に基づき、当該２つの前記走行パターンに対応する前記負荷のレベルの内分点に相当する負荷の程度を算出する
請求項１乃至４のいずれか１つ記載の負荷推定プログラム。
【請求項７】
プロセッサで実行される所定プログラムの負荷のレベルと、当該負荷の状態における前記所定プログラムのルーチンの実行パターンとを対応付けて記憶するコンピュータに、
前記所定プログラムを実行中の前記プロセッサにおける走行データを収集する処理と、
前記走行データに基づいて前記ルーチンの実行状況を集計する処理と、
前記実行状況と前記実行パターンとの比較結果に基づいて、前記所定プログラムの負荷を推定する推定処理と
を実行させる負荷推定プログラム。
【請求項８】
前記実行状況と前記実行パターンは、前記プロセッサにおける実行アドレスが前記ルーチンに該当した頻度を含む
請求項７記載の負荷推定プログラム。
【請求項９】
前記実行状況と前記実行パターンは、前記プロセッサにおける実行アドレスが前記ルーチンのグループに該当した頻度を含む
請求項７記載の負荷推定プログラム。
【請求項１０】
前記推定処理において、前記実行状況に含まれる指標と、２つの前記実行パターンの各々に含まれる同種の指標との各差の比に基づき、当該２つの前記実行パターンに対応する前記負荷のレベルの内分点に相当する負荷の程度を算出する
請求項７乃至９のいずれか１つ記載の負荷推定プログラム。
【請求項１１】
前記推定処理において、複数種類の指標の各々について算出した前記負荷の程度の加重平均を算出する
請求項１０記載の負荷推定プログラム。
【請求項１２】
前記推定処理において、前記所定プログラムの負荷の限界に対する現状の負荷の割合を算出する
請求項７乃至１１のいずれか１つ記載の負荷推定プログラム。
【請求項１３】
プロセッサで実行される所定プログラムの負荷のレベルと、当該負荷の状態における当該プロセッサの走行パターンとを対応付けて記憶するコンピュータにより実行される負荷推定方法であって、
前記所定プログラムを実行中の前記プロセッサにおける走行データを収集する処理と、
前記走行データに基づいて前記プロセッサの走行状況を集計する処理と、
前記走行状況と前記走行パターンとの比較結果に基づいて、前記所定プログラムの負荷を推定する推定処理と
を含む負荷推定方法。
【請求項１４】
プロセッサで実行される所定プログラムの負荷のレベルと、当該負荷の状態における前記所定プログラムのルーチンの実行パターンとを対応付けて記憶するコンピュータにより実行される負荷推定方法であって、
前記所定プログラムを実行中の前記プロセッサにおける走行データを収集する処理と、
前記走行データに基づいて前記ルーチンの実行状況を集計する処理と、
前記実行状況と前記実行パターンとの比較結果に基づいて、前記所定プログラムの負荷を推定する推定処理と
を含む負荷推定方法。
【請求項１５】
プロセッサで実行される所定プログラムの負荷のレベルと、当該負荷の状態における当該プロセッサの走行パターンとを対応付けて記憶する記憶部と、
前記所定プログラムを実行中の前記プロセッサにおける走行データを収集する収集部と、
前記走行データに基づいて前記プロセッサの走行状況を集計する集計部と、
前記走行状況と前記走行パターンとの比較結果に基づいて、前記所定プログラムの負荷を推定する推定部と
を有する負荷推定装置。
【請求項１６】
プロセッサで実行される所定プログラムの負荷のレベルと、当該負荷の状態における前記所定プログラムのルーチンの実行パターンとを対応付けて記憶する記憶部と、
前記所定プログラムを実行中の前記プロセッサにおける走行データを収集する収集部と、
前記走行データに基づいて前記ルーチンの実行状況を集計する集計部と、
前記実行状況と前記実行パターンとの比較結果に基づいて、前記所定プログラムの負荷を推定する推定部と
を有する負荷推定装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、動作中のプログラムの負荷を計測する技術に関する。
【背景技術】
【０００２】
例えば、サーバ装置で動作しているアプリケーションの負荷を特定できれば、当該アプリケーションに割り当てられている資源が足りているか否かを判断することに役立つ。
【０００３】
一般的には、オペレーティングシステムにおいて計測されたアプリケーションのＣＰＵ（Central Processing Unit）使用率によって、負荷の程度を把握できる。但し、オペレーティングシステムにおいてＣＰＵ使用率を計測できないタイプのアプリケーションの負荷を把握するためには、オペレーティングシステムによる計測以外の手段が求められる。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】国際公開第２０１４／０５０２５４号
【特許文献２】特開２００８−３１０４７０号公報
【特許文献３】特開２０１４−１７０４８２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
本発明の目的は、一側面では、所定プログラムの負荷を、より簡便に把握することである。
【課題を解決するための手段】
【０００６】
一態様に係る負荷推定方法は、プロセッサで実行される所定プログラムの負荷のレベルと、当該負荷の状態における当該プロセッサの走行パターンとを対応付けて記憶するコンピュータに、（Ａ）所定プログラムを実行中のプロセッサにおける走行データを収集する処理と、（Ｂ）走行データに基づいてプロセッサの走行状況を集計する処理と、（Ｃ）走行状況と走行パターンとの比較結果に基づいて、所定プログラムの負荷を推定する推定処理とを実行させる。
【０００７】
更に、一態様に係る負荷推定方法は、プロセッサで実行される所定プログラムの負荷のレベルと、当該負荷の状態における所定プログラムのルーチンの実行パターンとを対応付けて記憶するコンピュータに、（Ｄ）所定プログラムを実行中のプロセッサにおける走行データを収集する処理と、（Ｅ）走行データに基づいてルーチンの実行状況を集計する処理と、（Ｆ）実行状況と実行パターンとの比較結果に基づいて、所定プログラムの負荷を推定する推定処理とを実行させる。
【発明の効果】
【０００８】
一側面としては、所定プログラムの負荷を、より簡便に把握することができる。
【図面の簡単な説明】
【０００９】
【図１】図１は、システム構成の例を示す図である。
【図２】図２は、サーバ装置のモジュール構成例を示す図である。
【図３】図３は、ＣＰＵ使用率の例を示す図である。
【図４】図４は、サーバ装置のモジュール構成例を示す図である。
【図５】図５は、ＣＰＵ使用率の例を示す図である。
【図６】図６は、実行アドレスの度数分布の例を示す図である。
【図７】図７は、サーバ装置のモジュール構成例を示す図である。
【図８】図８は、シーケンスの例を示す図である。
【図９】図９は、ログテーブルの例を示す図である。
【図１０】図１０は、開始処理フローを示す図である。
【図１１】図１１は、ハンドラ処理フローを示す図である。
【図１２】図１２は、分析エージェントのモジュール構成例を示す図である。
【図１３】図１３は、度数分布テーブルの例を示す図である。
【図１４】図１４は、走行状況データの例を示す図である。
【図１５】図１５は、走行パターンテーブルの例を示す図である。
【図１６】図１６は、分析処理フローを示す図である。
【図１７】図１７は、集計処理（Ａ）フローを示す図である。
【図１８】図１８は、推定処理（Ａ）フローを示す図である。
【図１９】図１９は、類似度算出処理フローを示す図である。
【図２０】図２０は、推定処理（Ｂ）フローを示す図である。
【図２１】図２１は、実施の形態３におけるブロックの例を示す図である。
【図２２】図２２は、実施の形態３における度数分布テーブルの例を示す図である。
【図２３Ａ】図２３Ａは、集計処理（Ｂ）フローを示す図である。
【図２３Ｂ】図２３Ｂは、集計処理（Ｂ）フローを示す図である。
【図２３Ｃ】図２３Ｃは、集計処理（Ｂ）フローを示す図である。
【図２３Ｄ】図２３Ｄは、集計処理（Ｂ）フローを示す図である。
【図２４】図２４は、実施の形態４における走行パターンテーブルの例を示す図である。
【図２５】図２５は、実施の形態４における分析エージェントのモジュール構成例を示す図である。
【図２６】図２６は、関数テーブルの例を示す図である。
【図２７】図２７は、実行状況テーブルの例を示す図である。
【図２８】図２８は、集計処理（Ｃ）フローを示す図である。
【図２９】図２９は、実行パターンテーブルの例を示す図である。
【図３０】図３０は、重みデータの例を示す図である。
【図３１】図３１は、推定処理（Ｃ）フローを示す図である。
【図３２】図３２は、グループテーブルの例を示す図である。
【図３３】図３３は、実施の形態５における実行状況テーブルの例を示す図である。
【図３４】図３４は、集計処理（Ｄ）フローを示す図である。
【図３５】図３５は、実施の形態５における実行パターンテーブルの例を示す図である。
【図３６】図３６は、実施の形態５における重みデータの例を示す図である。
【図３７】図３７は、推定処理（Ｄ）フローを示す図である。
【図３８】図３８は、コンピュータの機能ブロック図である。
【発明を実施するための形態】
【００１０】
［実施の形態１］
例えば、図１に示したシステム構成を想定する。この例におけるシステムのＬＡＮ（ローカルエリアネットワーク）には、複数のサーバ装置１０１ａ乃至１０１ｃ及び管理装置１０３が接続されている。複数のサーバ装置１０１ａ乃至１０１ｃは、連携して所定のサービスを提供する。管理装置１０３は、サーバ装置１０１ａ乃至１０１ｃの状況を監視する。
【００１１】
図２に、サーバ装置１０１のモジュール構成例を示す。この例では、ホストＯＳ（オペレーティングシステム）２０１の環境において、複数のアプリケーション２０３ａ，２０３ｂが動作している。また、複数の仮想マシン２０５ａ，２０５ｂが設けられ、各仮想マシン２０５ａ，２０５ｂにおいてアプリケーション２０３ｃ，２０３ｄが動作している。
【００１２】
ホストＯＳ２０１において計測されるＣＰＵ使用率の例を図３に示す。システムモードによるＣＰＵ使用率及びユーザモードによるＣＰＵ使用率が計測される。そして、システムモードによるＣＰＵ使用率及びユーザモードによるＣＰＵ使用率の残余が、アイドル状態の割合に相当する。
【００１３】
上段にアプリケーション２０３の負荷が高い場合の計測結果を示す。システムモードによるＣＰＵ使用率及びユーザモードによるＣＰＵ使用率が大きく、アイドル状態の割合は小さい。
【００１４】
一方、下段に示すように、アプリケーション２０３の負荷が低い場合には、システムモードによるＣＰＵ使用率及びユーザモードによるＣＰＵ使用率が小さく、アイドル状態の割合は大きい。
【００１５】
このように計測されるＣＰＵ使用率を監視すれば、例えば資源配分の調整に役立てることができる。尚、サーバ装置１０１において、ホストＯＳ２０１に代えてハイパーバイザーを動作させる場合も同様である。
【００１６】
上述した通常のアプリケーション２０３は、例えばホストＯＳ２０１のカーネルを介してドライバとデータをやり取りする。従って、ホストＯＳ２０１においてシステムモードの動作時間とユーザモードの動作時間と区別することができる。
【００１７】
一方、ホストＯＳ２０１のカーネルを介さずにドライバとデータをやり取りするアプリケーション２０３の場合には、ホストＯＳ２０１においてシステムモードの動作時間とユーザモードの動作時間と区別することができない。
【００１８】
図４に、別のモジュール構成例を示す。仮想スイッチ４０１は、例えばＤＰＤＫ（Data Plane Development Kit）ライブラリ及びＤＰＤＫドライバを用いて、仮想化基盤において仮想マシン２０５及びＮＩＣ（ネットワークインターフェースカード）４０３の間で伝送されるパケットを中継する。ＤＰＤＫライブラリは、主にパケット処理の高速化を図る目的で使用される。そのため、ＤＰＤＫドライバは、ポーリング方式を採用し、ネットワークインターフェース及び仮想マシンインターフェースを提供している。
【００１９】
ここでは、サーバ装置１０１が有する複数のＣＰＵのうち一部のＣＰＵが、仮想スイッチ４０１に独占的に割り当てられるものとする。従って、仮想スイッチ４０１が一部のＣＰＵを専有する。仮想スイッチ４０１によって専有されるＣＰＵの使用率をホストＯＳ２０１で計測した例を図５に示す。このような動作態様では、常にユーザモードによってＣＰＵが１００％使用しているように見える。つまり、仮想スイッチ４０１に係る負荷が高い場合と低い場合とを区別できない。
【００２０】
本実施の形態では、ホストＯＳ２０１でアプリケーション２０３によるＣＰＵ使用率を正しく計測できない場合にも、アプリケーション２０３の負荷をより正しく推測できるようにする。尚、仮想スイッチ４０１は、アプリケーション２０３の一態様である。他のアプリケーション２０３に、本実施の形態を適用するようにしてもよい。
【００２１】
本実施の形態では、ＣＰＵにおける実行アドレスの度数分布に着目する。図６に、実行アドレスの度数分布の例を示す。仮想スイッチ４０１の負荷が低い場合には、処理待ちに係るルーチンの実行がメインになる。従って、下段に示すように、実行アドレスが一箇所に集中する。一方、仮想スイッチ４０１の負荷が高い場合には、処理待ちに係るルーチンの他に、パケットの転送処理に係るルーチンが実行される割合が多くなる。従って、上段に示すように、実行アドレスが複数の箇所に分散する。このように、負荷に応じてＣＰＵの走行状況が異なるという特性を活かす。
【００２２】
図７に、本実施の形態に係るサーバ装置１０１のモジュール構成例を示す。ホストＯＳ２０１に設けられた収集ドライバ７０１は、仮想スイッチ４０１が専有しているＣＰＵのプログラムカウンタ値（つまり、実行アドレス）をサンプリングする。実行アドレスは、ログテーブルとして走行データ記憶部７０３に記憶される。分析エージェント７０５は、ログテーブルを分析して、仮想スイッチ４０１の負荷を推測する。尚、収集ドライバ７０１は、タイマ７０７のハードウエア割り込みのタイミングで実行アドレス値を取得する。
【００２３】
図８に、シーケンスの例を示す。この例では、２つのログテーブルを交互に使用して、絶え間なくサンプリング及び分析を行うようにする。
【００２４】
まず、分析エージェント７０５は、収集ドライバ７０１へサンプリング開始の指示を送る（Ｓ８０１）。収集ドライバ７０１が書き込むログテーブルは、当該指示において指定されているものとする。例えば、テーブルＩＤ：１が指定されているものとする。
【００２５】
収集ドライバ７０１は、サンプリング開始の指示を受けると、実行アドレス値のサンプリングを行う（Ｓ８０３）。１回のサンプリング期間は、例えば１秒である。この例で、収集ドライバ７０１は、その間に１０００個のサンプルを採取するものとする。そのため、タイマ７０７は、１ミリ秒の周期でハードウエア割り込みを発生させる。
【００２６】
サンプリング終了のタイミングに至ると、収集ドライバ７０１は、分析エージェント７０５へサンプリング終了の通知を送る（Ｓ８０５）。尚、サンプリングを終える時点で、ログテーブルへの書き込みは完了している。
【００２７】
分析エージェント７０５は、サンプリング終了の通知を受けると、２回目のサンプリング開始の指示を収集ドライバ７０１へ送る（Ｓ８０７）。このときの指示に、別のログテーブルが指定されている。この例では、テーブルＩＤ：２が指定されているものとする。
【００２８】
続いて、分析エージェント７０５は、テーブルＩＤ：１に係るログテーブルの分析を行う（Ｓ８０９）。このとき、複数の負荷レベルの各々に対応するＣＰＵ走行パターンに基づいて、現状における負荷レベルを特定する。ＣＰＵ走行パターンのデータは、予め用意されているものとする。
【００２９】
ログテーブルの分析を終えると、分析エージェント７０５は、管理装置１０３へ分析結果（例えば、現状の負荷レベル）の通知を送る（Ｓ８１１）。
【００３０】
一方、収集ドライバ７０１は、この間２回目のサンプリングを行う（Ｓ８１３）。２回目のサンプリングの結果は、テーブルＩＤ：２のログテーブルに書き込まれる。そして、２回目のサンプリングを終えると、収集ドライバ７０１は、分析エージェント７０５へサンプリング終了の通知を送る（Ｓ８１５）。
【００３１】
分析エージェント７０５は、２回目のサンプリング終了の通知を受けると、３回目のサンプリング開始の指示を収集ドライバ７０１へ送る（Ｓ８１７）。このときの指示で、テーブルＩＤ：１が指定される。
【００３２】
続いて、分析エージェント７０５は、テーブルＩＤ：２に係るログテーブルの分析を行う（Ｓ８１９）。そして、ログテーブルの分析を終えると、分析エージェント７０５は、管理装置１０３へ分析結果の通知を送る（Ｓ８２１）。以降、同様の処理を繰り返す。尚、分析エージェント７０５は、複数回の分析結果をまとめて、管理装置１０３へ送るようにしてもよい。
【００３３】
図９に、ログテーブルの例を示す。この例におけるログテーブルは、サンプルに対応するレコードを有している。ログテーブルのレコードは、サンプル番号が格納されるフィールドと、実行アドレス値が格納されるフィールドとを有している。
【００３４】
サンプル番号は、サンプル採取の順番を示し、サンプルを識別する。実行アドレス値は、このサンプリングにおけるサンプルに相当する。この例では、１０００個のサンプルが格納されている。
【００３５】
続いて、収集ドライバ７０１における処理について説明する。収集ドライバ７０１は、開始処理及びハンドラ処理を行う。開始処理において、サンプリングが開始する。ハンドラ処理において、サンプリングが行われる。
【００３６】
図１０に、開始処理フローを示す。収集ドライバ７０１は、待機して、分析エージェント７０５からサンプリング開始の指示を受け付ける（Ｓ１００１）。収集ドライバ７０１は、サンプリング開始の指示に含まれるテーブルＩＤで指定されるログテーブルを初期化する。更に、収集ドライバ７０１は、ログテーブルの書き込み先レコードを指すポインタとサンプル数とを初期化する（Ｓ１００３）。具体的には、初期状態のポインタは１であり、同じくサンプル数は０である。ポインタ及びサンプル数は、内部パラメータである。
【００３７】
収集ドライバ７０１は、タイマ割り込みの周期を設定する（Ｓ１００５）。この例におけるタイマ割り込みの周期は、１ミリ秒である。そして、収集ドライバ７０１は、タイマ割り込みを起動する（Ｓ１００７）。その後、Ｓ１００１の処理に戻る。
【００３８】
次に、ハンドラ処理について説明する。ハンドラ処理は、タイマ割り込みが発生した時に起動される。図１１に、ハンドラ処理フローを示す。まず、収集ドライバ７０１は、タイマ割り込み発生時点におけるレジスタ値を退避させる（Ｓ１１０１）。
【００３９】
次に、収集ドライバ７０１は、タイマ割り込み発生時点における実行アドレス値を取得し（Ｓ１１０３）、ポインタが指すレコードに当該実行アドレス値を格納する（Ｓ１１０５）。そして、収集ドライバ７０１は、ポインタ及びサンプル数を更新する（Ｓ１１０７）。具体的には、収集ドライバ７０１は、ポインタに１を加え、サンプル数に１を加える。
【００４０】
収集ドライバ７０１は、サンプリング期間を終えたか否かを判定する（Ｓ１１０９）。具体的には、収集ドライバ７０１は、Ｓ１００１においてサンプリング開始の指示を受け付けた時点から所定時間（この例では、１秒）が経過したか否かを判定する。或いは、収集ドライバ７０１は、サンプル数が所定数（この例では、１０００）に至ったか否かを判定するようにしてもい。
【００４１】
サンプリング期間を終えていないと判定した場合には、収集ドライバ７０１は、レジスタ値を元に戻し（Ｓ１１１５）、ハンドラ処理を終える。
【００４２】
一方、サンプリング期間を終えたと判定した場合には、収集ドライバ７０１は、タイマ割り込みを停止させ（Ｓ１１１１）、分析エージェント７０５へサンプリング終了の通知を送る（Ｓ１１１３）。収集ドライバ７０１は、レジスタ値を元に戻し（Ｓ１１１５）、ハンドラ処理を終える。以上で、収集ドライバ７０１についての説明を終える。
【００４３】
続いて、分析エージェント７０５について説明する。図１２に、分析エージェント７０５のモジュール構成例を示す。分析エージェント７０５は、指示部１２０１、集計部１２０３、推定部１２０５、送信部１２０７、度数分布記憶部１２２１、走行状況記憶部１２２３及び走行パターン記憶部１２２５を有する。
【００４４】
指示部１２０１は、収集ドライバ７０１へサンプリングの開始を指示する。集計部１２０３は、走行データ（この例では、ログテーブル）に基づいてＣＰＵの走行状況を集計する。つまり、集計結果として、ＣＰＵの走行状況が特定される。推定部１２０５は、アプリケーション２０３の負荷を推定する。送信部１２０７は、分析結果を管理装置１０３へ送信する。
【００４５】
度数分布記憶部１２２１は、度数分布テーブルを記憶する。度数分布テーブルについては、図１３を用いて後述する。走行状況記憶部１２２３は、走行状況データを記憶する。走行状況データについては、図１４を用いて後述する。走行パターン記憶部１２２５は、走行パターンテーブルを記憶する。走行パターンテーブルについては、図１５を用いて後述する。
【００４６】
上述した指示部１２０１、集計部１２０３、推定部１２０５及び送信部１２０７は、ハードウエア資源（例えば、図３８）と、以下で述べる処理をプロセッサに実行させるプログラムとを用いて実現される。
【００４７】
上述した度数分布記憶部１２２１、走行状況記憶部１２２３及び走行パターン記憶部１２２５は、ハードウエア資源（例えば、図３８）を用いて実現される。
【００４８】
図１３に、度数分布テーブルの例を示す。この度数分布における階級は、実行アドレスの範囲に相当する。以下では、この実行アドレスの範囲をブロックという。この例における度数分布テーブルは、ブロックに対応するレコードを有している。度数分布テーブルのレコードは、ブロック範囲が格納されるフィールドと、サンプル数が格納されるフィールドと、占有率が格納されるフィールドとを有している。
【００４９】
この例では、ブロックを指定するデータとしてブロック範囲（つまり、開始アドレスと終了アドレス）を示しているが、本実施の形態におけるブロックは固定サイズであるので、ブロックを指定するデータとして、ブロックの開始アドレス或いは終了アドレスのいずれか一方のみを用いるようにしてもよい。サンプル数は、当該ブロック範囲に含まれる実行アドレス値の数である。占有率は、総サンプル数に対する当該ブロックのサンプル数の割合である。
【００５０】
例えば、図示した１番目のレコードは、アドレス「０ｘ００４０６２ｃ０〜０ｘ００４０６２ｆｆ」に相当するブロックに含まれる実行アドレス値の数が「１６０」あることを示している。また、当該サンプルの割合は「１６％」である。
【００５１】
図１４に、走行状況データの例を示す。走行状況データは、上述した度数分布に基づいて生成される。図１４の例では、サンプル数が最も多いブロック、サンプル数が２番目に多いブロック及びサンプル数が３番目に多いブロックにおける各占有率が抽出されている。また、サンプル数が基準を超えるブロックの数がカウントされている。これらの占有率やブロック数は、度数分布に関する特徴の例である。尚、度数分布に関する他の特徴を走行状況データとして用いるようにしてもよい。
【００５２】
図１５に、走行パターンテーブルの例を示す。走行パターンテーブルは、事前に用意されているものとする。走行パターンテーブルの内容は、例えば管理装置１０３が既知の負荷に係る要求をアプリケーション２０３に送った場合のＣＰＵの走行状況などを参考に設定される。
【００５３】
この例における走行パターンテーブルは、走行パターンに対応するレコードを有している。走行パターンテーブルのレコードは、負荷レベルが格納されるフィールドと、アプリケーション２０３のＣＰＵ使用率が格納されるフィールドと、第１特徴ブロック乃至第３特徴ブロックについて、ブロック範囲が格納されるフィールド及び占有率が格納されるフィールドとを有している。当該レコードは、更に、サンプル数が基準を超えるブロックの数が格納されるフィールドも有している。
【００５４】
負荷レベルは、当該走行パターンにおける負荷の程度を「１」乃至「７」の段階で表す。この例では、昇順に負荷が大きいものとする。また、各負荷レベルは、図示したアプリケーション２０３のＣＰＵ使用率に相当する。例えば、負荷レベル「３」は、アプリケーション２０３のＣＰＵ使用率「４０％」に相当する。尚、負荷レベル「７」は、アプリケーション２０３の負荷が限界を超えた状態に相当する。
【００５５】
続いて、分析エージェント７０５における分析処理について説明する。図１６に、分析処理フローを示す。指示部１２０１は、最初に使用するログテーブルを選択する（Ｓ１６０１）。指示部１２０１は、収集ドライバ７０１へサンプリング開始の指示（選択されたログテーブルのＩＤを含む。）を送る（Ｓ１６０３）。
【００５６】
その後、指示部１２０１は、待機して、収集ドライバ７０１からサンプリング終了の通知を受ける（Ｓ１６０５）。そして、指示部１２０１は、ログテーブルを切り替えて（Ｓ１６０７）、収集ドライバ７０１へサンプリング開始の指示（切り替えられたログテーブルのＩＤを含む。）を送る（Ｓ１６０９）。
【００５７】
続いて、集計部１２０３は、集計処理を実行する（Ｓ１６１１）。本実施の形態では、集計処理（Ａ）を実行する。図１７に、集計処理（Ａ）フローを示す。集計部１２０３は、サンプリングによって記録されたログテーブルにおけるサンプルを１つ選択する（Ｓ１７０１）。例えば、集計部１２０３は、採取された順番に従ってサンプルを選択する。
【００５８】
集計部１２０３は、当該サンプルの実行アドレス値が属するブロックを選択する（Ｓ１７０３）。例えば、実行アドレス値における所定の下位ビットをマスクすることによって、属するブロックの開始アドレスを特定する。
【００５９】
集計部１２０３は、度数分布テーブルに、特定されたブロックのレコードがあるか否かを判定する（Ｓ１７０５）。度数分布テーブルに当該ブロックのレコードがないと判定した場合には、集計部１２０３は、度数分布テーブルに、当該ブロックのレコードを新たに設ける（Ｓ１７０７）。そして、集計部１２０３は、当該レコードのサンプル数を格納するためのフィールドに１を設定する（Ｓ１７０９）。
【００６０】
一方、度数分布テーブルに当該ブロックのレコードがあると判定した場合には、集計部１２０３は、当該レコードにおけるサンプル数に１を加える（Ｓ１７１１）。
【００６１】
そして、集計部１２０３は、Ｓ１７０１において未だ集計されていないサンプルが残っているか否かを判定する（Ｓ１７１３）。未選択のサンプルが残っていると判定した場合には、Ｓ１７０１に示した処理に戻って、上述した処理を繰り返す。
【００６２】
一方、未集計のサンプルがないと判定した場合には、集計部１２０３は、各ブロックにおける占有率を算出する（Ｓ１７１５）。具体的には、当該ブロックにおけるサンプル数を総サンプル数で除することによって、占有率が求められる。占有率は、度数分布テーブルのレコードに設定される。
【００６３】
集計部１２０３は、占有率が高い順にブロックを３つ抽出する（Ｓ１７１７）。そして、集計部１２０３は、これらのブロックの範囲及び占有率を、走行状況記憶部１２２３で記憶する走行状況データに設定する。更に、集計部１２０３は、占有率が基準を超えるブロックを数える（Ｓ１７１９）。占有率が基準を超えるブロックの数も、走行状況記憶部１２２３で記憶する走行状況データに設定される。集計処理（Ａ）を終えると、呼び出し元の分析処理に復帰する。
【００６４】
図１６の説明に戻る。推定部１２０５は、推定処理を実行する（Ｓ１６１３）。本実施の形態では、推定処理（Ａ）を実行する。図１８に、推定処理（Ａ）フローを示す。推定部１２０５は、走行パターンテーブルにおける負荷レベルパターンについて順次比較処理を行う（Ｓ１８０１）。例えば、推定部１２０５は、昇順に負荷レベルパターンを処理する。
【００６５】
推定部１２０５は、走行状況データに対し、比較対象として選択した負荷レベルとの類似度算出処理を実行する（Ｓ１８０３）。類似度算出処理では、走行状況と当該走行パターンとの類似度を算出する。
【００６６】
図１９に、類似度算出処理フローを示す。推定部１２０５は、各指標の差を求める（Ｓ１９０１）。この例では、サンプル数が最も多いブロックにおける占有率、サンプル数が２番目に多いブロックにおける占有率、サンプル数が３番目に多いブロックにおける占有率及び占有率が基準を超えるブロック数が、指標に相当する。各指標について、走行状況における指標と走行パターンにおける同種の指標の差を算出する。但し、ブロック数を除き、各占有率のみを指標として用いるようにしてもよい。
【００６７】
推定部１２０５は、各指標の差に基づいて全体的な差を求める（Ｓ１９０３）。各指標の差に基づいて全体的な差を算出する方法は、従来技術であってもよい。例えば、各差の二乗和を求め、当該二乗和の平方根を算出するようにしてもよい。全体的な差が小さい場合に、類似度が高くなることを意味する。類似度算出処理を終えると、呼び出し元の推定処理（Ａ）に復帰する。
【００６８】
図１８の説明に戻る。推定部１２０５は、未処理の負荷レベルがあるか否かを判定する（Ｓ１８０５）。未処理の負荷レベルがあると判定した場合には、Ｓ１８０１に示した処理に戻って、上述した処理を繰り返す。
【００６９】
一方、未処理の負荷レベルがないと判定した場合には、推定部１２０５は、類似度が最も高い負荷レベルを選択する（Ｓ１８０７）。推定処理（Ａ）を終えると、呼び出し元の分析処理に復帰する。
【００７０】
図１６の説明に戻る。送信部１２０７は、分析結果の通知を送信する（Ｓ１６１５）。具体的には、負荷レベル（或いは負荷レベルに対応するアプリケーションＣＰＵ使用率）が通知される。そして、Ｓ１６０５に示した処理に戻る。
【００７１】
本実施の形態によれば、所定プログラムの負荷を、より簡便に把握できる。
【００７２】
また、負荷の大小によって実行箇所が異なるという特性に基づき、より正しく負荷を推測できる面もある。
【００７３】
［実施の形態２］
上述した実施の形態では、最も近似する負荷レベルを推定する例について説明したが、本実施の形態では、２つの負荷レベルの内分点に相当する負荷の程度（アプリケーションＣＰＵ使用率）を推定する例について説明する。
【００７４】
本実施の形態では、推定処理（Ａ）に代えて、推定処理（Ｂ）を実行する。図２０に、推定処理（Ｂ）フローを示す。また、推定処理（Ａ）の場合、走行パターンテーブルのパターンの順序は必ずしも図１５の昇順に並んでいる必要はないが、推定処理（Ｂ）では、昇順（あるいは降順）に並んでいる必要がある。推定部１２０５は、走行状況データに対し、比較対象として選択した負荷レベルとの類似度算出処理を実行する（Ｓ２００１，Ｓ２００３）。この類似度算出処理は、前記推定処理（Ａ）の場合と同様である。
【００７５】
推定部１２０５は、パターンテーブルの負荷レベルすべてに対し類似度算出処理を終えたか否かを判定する（Ｓ２００５）。未処理の指標があると判定した場合には、Ｓ２００１に示した処理に戻って、上述した処理を繰り返す。一方、未処理の指標がないと判定した場合には、推定部１２０５は、類似度がもっとも高いレベルのひとつ前のレベルとひとつ後のレベルの類似度を比較する（Ｓ２００７）。たとえば、レベル４の類似度がもっとも高かった場合、レベル３とレベル５の類似度を比較する。比較の結果、前のレベルが高かったら類似度がもっとも高かったレベルと、その前のレベルを選択する（Ｓ２００９）。また、後のレベルが高かったら類似度がもっとも高かったレベルと、その次のレベルを選択する（Ｓ２０１１）。
【００７６】
次に推定部１２０５は、選択した２つのレベルの走行パターンが示すＣＰＵ使用率を、それぞれのレベルに対する類似度で内分した値を走行状況データに対するＣＰＵ使用率として算出する。たとえば、もっとも類似度が高かったレベルが４でそのＣＰＵ使用率がＳで類似度がＸ、またＳ２００７の比較で選択されたレベルが５でそのＣＰＵ使用率がＴで類似度がＹとすると、走行状況におけるアプリケーションＣＰＵ使用率Ｔは、Ｘ×Ｓ＋Ｙ×Ｕを（Ｘ＋Ｙ）で除することによって求められる。
【００７７】
推定処理（Ｂ）を終えると、呼び出し元の分析処理に復帰する。
【００７８】
本実施の形態によれば、より細かい精度でアプリケーション２０３の負荷を把握できる。
【００７９】
［実施の形態３］
上述した実施の形態では、ブロックが均等に分割された範囲とした例について説明したが、本実施の形態では、ブロックが所定の上限幅内に含まれる実行アドレスの広がりに応じて設定される例について説明する。
【００８０】
図２１に、実施の形態３におけるブロックの例を示す。矢印２１０１は、実行アドレスを示している。この例では、ブロックの上限幅を、第１基準サイズ及び第２基準サイズで表す。
【００８１】
第１基準サイズは、例えばコードサイズが比較的小さい関数の大きさを基準として設定される。そして、第１基準サイズを超えない距離に納まる実行アドレス群の広がりをブロックと看做す。このブロックを小タイプのブロックという。この例で、矢印２１０１ａ乃至矢印２１０１ｄの範囲を１番目の小タイプのブロックとする。同じく矢印２１０１ｅ乃至矢印２１０１ｉの範囲を２番目の小タイプのブロックとする。同じく矢印２１０１ｊ乃至矢印２１０１ｍの範囲を３番目の小タイプのブロックとする。
【００８２】
第２基準サイズは、例えばコードサイズが比較的大きい関数の大きさを基準として設定される。そして、第２基準サイズを超えない距離に納まる実行アドレス群の広がりを大タイプのブロックと看做す。この例で、矢印２１０１ａ乃至矢印２１０１ｇの範囲を１番目の大タイプのブロックとする。同じく矢印２１０１ｈ乃至矢印２１０１ｍの範囲を２番目の大タイプのブロックとする。
【００８３】
図２２に、実施の形態３における度数分布テーブルの例を示す。この例における度数分布テーブルは、小タイプのブロック及び大タイプのブロックに対応するレコードを有している。度数分布テーブルのレコードは、タイプを示すコード値が格納されるフィールドと、開始アドレスが格納されるフィールドと、サイズが格納されるフィールドと、サンプル数が格納されるフィールドと、占有率が格納されるフィールドとを有している。
【００８４】
タイプを示すコード値によって、ブロックのタイプが区別される。開始アドレスは、ブロックの開始位置を示す。サイズの代わりに、終了アドレスを格納するようにしてもよい。サンプル数は、当該ブロック範囲に含まれる実行アドレス値の数である。占有率は、総サンプル数に対する当該ブロックのサンプル数の割合である。
【００８５】
本実施の形態では、集計処理（Ａ）に代えて、集計処理（Ｂ）を実行する。図２３Ａ乃至図２３Ｄに、集計処理（Ｂ）フローを示す。集計部１２０３は、ログテーブルのレコードを実行アドレス値の昇順にソートする（Ｓ２３０１）。
【００８６】
集計部１２０３は、ソート結果における先頭の実行アドレス値から処理を開始する（Ｓ２３０３）。集計部１２０３は、度数分布テーブルに新たなレコードを生成し、当該レコードにおけるタイプのフィールドに「小」を設定する（Ｓ２３０５）。集計部１２０３は、先頭の実行アドレス値を、当該レコードにおける開始アドレスのフィールドに設定する（Ｓ２３０７）。また、集計部１２０３は、当該レコードにおけるサンプル数のフィールドに１を設定する（Ｓ２３０９）。端子Ａを介して、図２３Ｂに示したＳ２３１１の処理に移る。
【００８７】
図２３Ｂの説明に移る。集計部１２０３は、末尾の実行アドレス値であるかどうかを判定する（Ｓ２３１１）。
【００８８】
末尾の実行アドレス値でない場合には、集計部１２０３は、次の実行アドレス値を選択し（Ｓ２３１３）、当該実行アドレス値と開始アドレスとの差を求める（Ｓ２３１５）。そして、集計部１２０３は、当該差が第１基準サイズを超えたか否かを判定する（Ｓ２３１７）。
【００８９】
Ｓ２３１３で選択した実行アドレス値と開始アドレスとの差が第１基準サイズを超えていないと判定した場合には、集計部１２０３は、生成中のレコード（図２３ＡのＳ２３０５で設定されたレコード又は後述するＳ２３２５で設定されたレコード）におけるサンプル数に１を加える（Ｓ２３１９）。その後、Ｓ２３１１に示した処理に戻って、上述した処理を繰り返す。
【００９０】
一方、Ｓ２３１３で選択した実行アドレス値と開始アドレスとの差が第１基準サイズを超えたと判定した場合には、集計部１２０３は、その実行アドレス値を当該ブロックの終了アドレスとする（Ｓ２３２１）。当該ブロックの終了アドレスは、直近のＳ２３１３の処理で選択した実行アドレス値より１つ遡った実行アドレス値である。集計部１２０３は、終了アドレスと開始アドレスとの差を、生成中のレコードにおけるサイズのフィールドに設定する（Ｓ２３２３）。
【００９１】
集計部１２０３は、度数分布テーブルに新たなレコードを設け、当該レコードにおけるタイプのフィールドに「小」を設定する（Ｓ２３２５）。集計部１２０３は、直近のＳ２３１３の処理で選択した実行アドレス値を、新たなレコードにおける開始アドレスのフィールドに設定する（Ｓ２３２７）。集計部１２０３は、当該レコードにおけるサンプル数のフィールドに１を設定する（Ｓ２３２９）。その後、Ｓ２３１１に示した処理に戻って、上述した処理を繰り返す。
【００９２】
Ｓ２３１１の説明に戻る。Ｓ２３１１において、次の実行アドレス値がないと判定した場合、つまり最大の実行アドレス値に関する処理を終えた場合には、集計部１２０３は、最大の実行アドレス値と開始アドレスとの差を、生成中のレコードにおけるサイズのフィールドに設定する（Ｓ２３３１）。
【００９３】
そして、集計部１２０３は、小タイプの各ブロックにおける占有率を算出する（Ｓ２３３３）。具体的には、当該ブロックにおけるサンプル数を総サンプル数で除することによって、当該ブロックにおける占有率が求められる。占有率は、度数分布テーブルのレコードに設定される。
【００９４】
集計部１２０３は、占有率が高い順に小タイプのブロックを３つ抽出する（Ｓ２３３５）。そして、集計部１２０３は、これらのブロックの範囲及び占有率を、走行状況記憶部１２２３で記憶する走行状況データに設定する。以上で、小タイプのブロックに関する処理を終える。そして、端子Ｂを介して、図２３Ｃに示したＳ２３３７の処理に移る。尚、この例における走行状況データは、占有率が高い小タイプのブロック３個分のデータと、占有率が高い大タイプのブロック３個分のデータとを抽出している。この走行状況データの例は、図示していない。
【００９５】
図２３Ｃの説明に移る。以下では、大タイプのブロックに関する処理を行う。集計部１２０３は、再度ソート結果における先頭の実行アドレス値から順に選択し処理を行う（Ｓ２３３７）。集計部１２０３は、度数分布テーブルに新たなレコードを設け、当該レコードにおけるタイプのフィールドに「大」を設定する（Ｓ２３３９）。集計部１２０３は、先頭の実行アドレス値を、当該レコードにおける開始アドレスのフィールドに設定する（Ｓ２３４１）。集計部１２０３は、当該レコードにおけるサンプル数のフィールドに１を設定する（Ｓ２３４３）。端子Ｃを介して、図２３Ｄに示したＳ２３４５の処理に移る。
【００９６】
図２３Ｄの説明に移る。Ｓ２３４５乃至Ｓ２３４９の処理は、図２３Ｂに示したＳ２３１１乃至Ｓ２３１５の処理の場合と同様である。
【００９７】
集計部１２０３は、Ｓ２３４７で選択した実行アドレス値と開始アドレスとの差が第２基準サイズを超えたか否かを判定する（Ｓ２３５１）。当該差が第２基準サイズを超えていないと判定した場合には、集計部１２０３は、生成中のレコード（図２３ＣのＳ２３３９で設定されたレコード又は後述するＳ２３５９で設定されたレコード）におけるサンプル数に１を加える（Ｓ２３５３）。そして、Ｓ２３４５に示した処理に戻って、上述した処理を繰り返す。
【００９８】
一方、当該差が第２基準サイズを超えたと判定した場合におけるＳ２３５５及びＳ２３５７の処理は、図２３Ｂに示したＳ２３２１及びＳ２３２３の処理の場合と同様である。
【００９９】
集計部１２０３は、度数分布テーブルに新たなレコードを設け、当該レコードにおけるタイプのフィールドに「大」を設定する（Ｓ２３５９）。集計部１２０３は、直近のＳ２３４７の処理で選択した実行アドレス値を、新たなレコードにおける開始アドレスのフィールドに設定する（Ｓ２３６１）。Ｓ２３６３の処理は、図２３Ｂに示したＳ２３２９の処理の場合と同様である。その後、Ｓ２３４５に示した処理に戻って、上述した処理を繰り返す。
【０１００】
Ｓ２３４５において、次の実行アドレス値がないと判定した場合、つまり最大の実行アドレス値に関する処理を終えた場合には、集計部１２０３は、最大の実行アドレス値と開始アドレスとの差を、生成中のレコードにおけるサイズのフィールドに設定する（Ｓ２３６５）。
【０１０１】
集計部１２０３は、大タイプの各ブロックにおける占有率を算出する（Ｓ２３６７）。具体的には、当該ブロックにおけるサンプル数を総サンプル数で除することによって、占有率が求められる。当該ブロックにおける占有率は、度数分布テーブルのレコードに設定される。
【０１０２】
集計部１２０３は、占有率が高い順に大タイプのブロックを３つ抽出する（Ｓ２３６９）。そして、集計部１２０３は、これらのブロックの範囲及び占有率を、走行状況記憶部１２２３で記憶する走行状況データに設定する。集計処理（Ｂ）を終えると、呼び出し元の分析処理に復帰する。
【０１０３】
図２４に、実施の形態３における走行パターンテーブルの例を示す。この例における走行パターンテーブルは、走行パターンに対応するレコードを有している。走行パターンテーブルのレコードは、負荷レベルが格納されるフィールドと、アプリケーション２０３のＣＰＵ使用率が格納されるフィールドと、第１特徴ブロック乃至第３特徴ブロックについてタイプが格納されるフィールド、開始アドレスが格納されるフィールド、サイズが格納されるフィールド及び占有率が格納されるフィールドを有している。各占有率が、指標に相当する。
【０１０４】
本実施の形態では、推定処理（Ａ）又は推定処理（Ｂ）のいずれを適用するようにしてもよい。いずれの場合であっても、同種の指標、つまり共通のブロックにおける占有率を比較対象とする。
【０１０５】
本実施の形態によれば、アプリケーション２０３の関数と見込まれる箇所の実行頻度に基づいて、負荷状態を判別し易くなる。
【０１０６】
また、コードサイズが大きい関数と見込まれる箇所及び小さい関数と見込まれる箇所における実行頻度に基づいて、負荷状態を判別し易くなる。
【０１０７】
［実施の形態４］
上述した実施の形態では、実行アドレスの度数分布に基づいて分析を行う例について説明したが、本実施の形態では、関数の実行頻度に基づいて分析を行う例について説明する。
【０１０８】
図２５に、実施の形態４における分析エージェント７０５のモジュール構成例を示す。分析エージェント７０５は、指示部１２０１、集計部１２０３、推定部１２０５、送信部１２０７、関数テーブル記憶部２５５１、実行状況記憶部２５５３、重み記憶部２５５５、実行パターン記憶部２５５７及びグループテーブル記憶部２５５９を有する。
【０１０９】
関数テーブル記憶部２５５１は、関数テーブルを記憶する。関数テーブルについては、図２６を用いて後述する。実行状況記憶部２５５３は、実行状況テーブルを記憶する。実行状況テーブルについては、図２７を用いて後述する。重み記憶部２５５５は、重みデータを記憶する。重みデータについては、図３０を用いて後述する。実行パターン記憶部２５５７は、実行パターンテーブルを記憶する。実行パターンテーブルについては、図２９を用いて後述する。グループテーブル記憶部２５５９は、グループテーブルを記憶する。グループテーブルについては、実施の形態５において図３２を用いて後述する。
【０１１０】
上述した関数テーブル記憶部２５５１、実行状況記憶部２５５３、重み記憶部２５５５、実行パターン記憶部２５５７及びグループテーブル記憶部２５５９は、ハードウエア資源（例えば、図３８）を用いて実現される。
【０１１１】
図２６に、関数テーブルの例を示す。この例における関数テーブルは、関数に対応するレコードを有している。関数テーブルのレコードは、関数名が格納されるフィールドと、先頭アドレスが格納されるフィールドと、サイズが格納されるフィールドとを有している。
【０１１２】
先頭アドレスは、当該関数のプログラムが始まる位置を示す。サイズは、当該関数のプログラムの大きさである。関数テーブルに代えて、アプリケーション２０３に含まれるプログラム配置のデータを用いるようにしてもよい。
【０１１３】
図２７に、実行状況テーブルの例を示す。この例における実行状況テーブルは、実行された関数に対応するレコードを有している。実行状況テーブルのレコードは、関数名が格納されるフィールドと、サンプル数が格納されるフィールドと、占有率が格納されるフィールドとを有している。
【０１１４】
関数名は、実行された関数を識別する。サンプル数は、当該関数のプログラム範囲に含まれる実行アドレス値の数である。占有率は、総サンプル数に対する当該関数のサンプル数の割合である。
【０１１５】
本実施の形態では、図１６に示したＳ１６１１において集計処理（Ｃ）を実行する。図２８に、集計処理（Ｃ）フローを示す。集計部１２０３は、先頭から順次サンプルを選択し（Ｓ２８０１）、関数テーブルに基づいて、当該サンプルの実行アドレス値が属する関数を特定する（Ｓ２８０３）。
【０１１６】
集計部１２０３は、実行状況テーブルに当該関数のレコードがあるか否かを判定する（Ｓ２８０５）。実行状況テーブルに当該関数のレコードがないと判定した場合には、集計部１２０３は、実行状況テーブルに、当該関数のレコードを追加する（Ｓ２８０７）。集計部１２０３は、当該レコードのサンプル数を格納するためのフィールドに１を設定する（Ｓ２８０９）。
【０１１７】
一方、実行状況テーブルに当該関数のレコードがあると判定した場合には、集計部１２０３は、当該レコードにおけるサンプル数に１を加える（Ｓ２８１１）。
【０１１８】
そして、集計部１２０３は、Ｓ２８０１において処理対象のサンプルの末尾まで終えたかを判定する（Ｓ２８１３）。処理対象のサンプルの末尾まで終わっていない場合には、Ｓ２８０１に示した処理に戻って、上述した処理を繰り返す。
【０１１９】
一方、処理対象のサンプルの末尾まで終えたと判定した場合には、集計部１２０３は、各関数における占有率を算出する（Ｓ２８１５）。具体的には、当該関数におけるサンプル数を総サンプル数で除することによって、占有率が求められる。占有率は、実行状況テーブルのレコードに設定される。集計処理（Ｃ）を終えると、呼び出し元の分析処理に復帰する。
【０１２０】
図２９に、実行パターンテーブルの例を示す。この例における実行パターンテーブルのレコードは、負荷レベルが格納されるフィールドと、アプリケーション２０３のＣＰＵ使用率が格納されるフィールドと、着目する関数の占有率が格納されるフィールドとを有している。
【０１２１】
負荷レベルは、当該実行パターンにおける負荷の程度を「１」乃至「６」の段階で示す。各負荷レベルは、図示したアプリケーション２０３のＣＰＵ使用率に相当する。アプリケーション２０３の負荷が限界を超えた状態に相当する負荷レベル「７」を設けるようにしてもよい。
【０１２２】
図３０に、重みデータの例を示す。重みデータには、着目する関数に対する重みが設定されている。
【０１２３】
本実施の形態では、図１６に示したＳ１６１３において、推定処理（Ｃ）を実行する。図３１に、推定処理（Ｃ）フローを示す。推定部１２０５は、着目する関数、つまり実行パターンテーブルで占有率が設定されている関数を順次選択する（Ｓ３１０１）。
【０１２４】
推定部１２０５は、当該関数の占有率に基づき推定されるアプリケーションＣＰＵ使用率を算出する（Ｓ３１０３）。
【０１２５】
ここでは、実行状況テーブルにおける当該関数の占有率Ｙが、アプリケーションＣＰＵ使用率Ｓに相当する実行パターンＡにおける当該関数の占有率Ｘと、アプリケーションＣＰＵ使用率Ｕに相当する別の実行パターンＢにおける当該関数の占有率Ｚとの中間であるものとする。２つの占有率ＸとＹの内分点に当たる占有率Ｚに関して、占有率の差に関する比をアプリケーションＣＰＵ使用率の差に適用して、内分点に該当するアプリケーションＣＰＵ使用率Ｔを求めるようにする。具体的には、推定部１２０５は、実行状況テーブルにおける当該関数の占有率と実行パターンＡにおける当該関数の占有率との差（Ｙ−Ｘ）を求める。また、推定部１２０５は、実行パターンＢにおける当該関数の占有率と走行状況における当該関数の占有率との差（Ｚ−Ｙ）を求める。そして、実行状況におけるアプリケーションＣＰＵ使用率Ｔは、（Ｙ−Ｘ）Ｕ＋（Ｚ−Ｙ）Ｓを（Ｚ−Ｘ）で除することによって求められる。
【０１２６】
推定部１２０５は、未処理の関数があるか否かを判定する（Ｓ３１０５）。未処理の関数があると判定した場合には、Ｓ３１０１に示した処理に戻って、上述した処理を繰り返す。
【０１２７】
一方、未処理の関数がないと判定した場合には、推定部１２０５は、重みデータに基づいて、アプリケーション２０３のＣＰＵ使用率の加重平均を算出する（Ｓ３１０７）。
【０１２８】
更に、推定部１２０５は、アプリケーション２０３のＣＰＵ使用率の上限に対する現状のＣＰＵ使用率の割合を算出する（Ｓ３１０９）。アプリケーション２０３のＣＰＵ使用率の上限は、予め設定されているものとする。当該上限は、例えば資源不足や動作不良などの異常事態に至る恐れがある負荷のレベルに相当する。当該上限は、１００％より低いＣＰＵ使用率に相当することもある。推定処理（Ｃ）を終えると、呼び出し元の分析処理に復帰する。
【０１２９】
本実施の形態によれば、アプリケーション２０３の負荷を、より簡便に把握できる。特に、機能的な単位で実行頻度を比較できるという面がある。
【０１３０】
また、内分点に相当するアプリケーションＣＰＵ使用率を使用するので、実行パターンテーブルのレコード数が少なくても推定の精度が高まる。
【０１３１】
また、アプリケーションＣＰＵ使用率の加重平均を求めるので、各関数の重要性に応じて、より正しく負荷を把握できる。
【０１３２】
また、負荷の限界に相当するアプリケーションＣＰＵ使用率に対する現状のアプリケーションＣＰＵ使用率の割合を算出するので、異常事態に関する切迫の度合いを把握し易くなる。
【０１３３】
［実施の形態５］
本実施の形態では、関数のグループにおける実行頻度に基づいて分析を行う例について説明する。
【０１３４】
図３２に、グループテーブルの例を示す。グループテーブルは、グループに属する関数を定義する。この例におけるグループテーブルは、グループに対応するレコードを有している。グループテーブルのレコードは、グループ名が格納されるフィールドと、関数名が格納される複数のフィールドとを有している。グループ名は、グループを識別する。関数名は、その関数が当該グループのメンバーであることを示す。
【０１３５】
図３３に、実施の形態５における実行状況テーブルの例を示す。この例における実行状況テーブルは、実行された関数のグループに対応するレコードを有している。実行状況テーブルのレコードは、グループ名が格納されるフィールドと、サンプル数が格納されるフィールドと、占有率が格納されるフィールドとを有している。
【０１３６】
グループ名は、実行された関数が属するグループを示す。サンプル数は、当該グループに属するいずれかの関数について、当該関数のプログラム範囲に含まれる実行アドレス値の数である。占有率は、総サンプル数に対する当該グループのサンプル数の割合である。
【０１３７】
本実施の形態では、図１６に示したＳ１６１１において、集計処理（Ｄ）を実行する。図３４に、集計処理（Ｄ）フローを示す。集計部１２０３は、サンプルを順次選択し（Ｓ３４０１）、集計部１２０３は、関数テーブルに基づいて、当該サンプルの実行アドレス値が属する関数を特定する（Ｓ３４０３）。更に、集計部１２０３は、グループテーブルに基づいて、当該関数のグループを特定する（Ｓ３４０５）。
【０１３８】
集計部１２０３は、実行状況テーブルに当該グループのレコードがあるか否かを判定する（Ｓ３４０７）。実行状況テーブルに当該グループのレコードがないと判定した場合には、集計部１２０３は、実行状況テーブルに、当該グループのレコードを新たに設ける（Ｓ３４０９）。集計部１２０３は、当該レコードのサンプル数を格納するためのフィールドに１を設定する（Ｓ３４１１）。
【０１３９】
一方、実行状況テーブルに当該関数のレコードがあると判定した場合には、集計部１２０３は、当該レコードにおけるサンプル数に１を加える（Ｓ３４１３）。
【０１４０】
そして、集計部１２０３は、Ｓ３４０１において未処理のサンプルがあるか否かを判定する（Ｓ３４１５）。未処理のサンプルがあると判定した場合には、Ｓ３４０１に示した処理に戻って、上述した処理を繰り返す。
【０１４１】
一方、すべてのサンプルについて処理を終えた場合には、集計部１２０３は、各グループにおける占有率を算出する（Ｓ３４１７）。具体的には、当該グループにおけるサンプル数を総サンプル数で除することによって、占有率が求められる。占有率は、実行状況テーブルのレコードに設定される。集計処理（Ｄ）を終えると、呼び出し元の分析処理に復帰する。
【０１４２】
図３５に、実施の形態５における実行パターンテーブルの例を示す。この例における実行パターンテーブルのレコードは、負荷レベルが格納されるフィールドと、アプリケーション２０３のＣＰＵ使用率が格納されるフィールドと、着目するグループの占有率が格納されるフィールドとを有している。
【０１４３】
負荷レベルは、当該実行パターンにおける負荷の程度を「１」乃至「６」の段階で示す。各負荷レベルは、図示したアプリケーション２０３のＣＰＵ使用率に相当する。アプリケーション２０３の負荷が限界を超えた状態に相当する負荷レベル「７」を設けるようにしてもよい。
【０１４４】
図３６に、実施の形態５における重みデータの例を示す。重みデータには、着目するグループに対する重みが設定されている。
【０１４５】
本実施の形態では、図１６に示したＳ１６１３において、推定処理（Ｄ）を実行する。図３７に、推定処理（Ｄ）フローを示す。推定部１２０５は、着目するグループ、つまり実行パターンテーブルで占有率が設定されているグループを順次選択する（Ｓ３７０１）。
【０１４６】
推定部１２０５は、当該グループの占有率に基づき推定されるアプリケーションＣＰＵ使用率を算出する（Ｓ３７０３）。
【０１４７】
ここでは、実行状況テーブルにおける当該グループの占有率Ｙが、アプリケーションＣＰＵ使用率Ｓに相当する実行パターンＡにおける当該グループの占有率Ｘと、アプリケーションＣＰＵ使用率Ｕに相当する別の実行パターンＢにおける当該グループの占有率Ｚとの中間であるものとする。２つの占有率ＸとＹの内分点に当たる占有率Ｚに関して、占有率の差に関する比をアプリケーションＣＰＵ使用率の差に適用して、内分点に該当するアプリケーションＣＰＵ使用率Ｔを求めるようにする。具体的には、推定部１２０５は、実行状況テーブルにおける当該グループの占有率と実行パターンＡにおける当該グループの占有率との差（Ｙ−Ｘ）を求める。また、推定部１２０５は、実行パターンＢにおける当該グループの占有率と走行状況における当該グループの占有率との差（Ｚ−Ｙ）を求める。そして、実行状況におけるアプリケーションＣＰＵ使用率Ｔは、（Ｙ−Ｘ）Ｕ＋（Ｚ−Ｙ）Ｓを（Ｚ−Ｘ）で除することによって求められる。
【０１４８】
推定部１２０５は、未処理のグループがあるか否かを判定する（Ｓ３７０５）。未処理のグループがあると判定した場合には、Ｓ３７０１に示した処理に戻って、上述した処理を繰り返す。
【０１４９】
一方、未処理のグループがないと判定した場合には、推定部１２０５は、重みデータに基づいて、アプリケーション２０３のＣＰＵ使用率の加重平均を算出する（Ｓ３７０７）。
【０１５０】
更に、推定部１２０５は、アプリケーション２０３のＣＰＵ使用率の上限に対する現状のＣＰＵ使用率の割合を算出する（Ｓ３７０９）。アプリケーション２０３のＣＰＵ使用率の上限は、予め設定されているものとする。推定処理（Ｄ）を終えると、呼び出し元の分析処理に復帰する。
【０１５１】
本実施の形態によれば、上位機能の単位で実行頻度を比較できる。
【０１５２】
尚、図１１に示したＳ１１０３の処理において、収集ドライバ７０１は、タイマ割り込み発生時点における実行アドレス値と共に付属データを取得し、Ｓ１１０５において、ポインタが指すレコードに当該実行アドレス値と共に付属データを格納するようにしてもよい。
【０１５３】
付属データは、例えばシステムモードとユーザモードとを区別するための情報である。この場合には、各集計処理において集計対象とするサンプルとして、ユーザモードに係るサンプルのみを選ぶようにしてもよい。
【０１５４】
また、付属データは、例えばセグメントを特定するレジスタ又はセレクタであってもよい。この場合には、各集計処理においてサンプルのアドレスや関数を、セグメントによって別々に集計するようにしてもよい。
【０１５５】
以上本発明の実施の形態を説明したが、本発明はこれに限定されるものではない。例えば、上述の機能ブロック構成はプログラムモジュール構成に一致しない場合もある。
【０１５６】
また、上で説明した各記憶領域の構成は一例であって、上記のような構成でなければならないわけではない。さらに、処理フローにおいても、処理結果が変わらなければ、処理の順番を入れ替えることや複数の処理を並列に実行させるようにしても良い。
【０１５７】
なお、上で述べたサーバ装置１０１は、コンピュータ装置であって、図３８に示すように、メモリ２５０１とＣＰＵ２５０３とハードディスク・ドライブ（ＨＤＤ：Hard Disk Drive）２５０５と表示装置２５０９に接続される表示制御部２５０７とリムーバブル・ディスク２５１１用のドライブ装置２５１３と入力装置２５１５とネットワークに接続するための通信制御部２５１７とがバス２５１９で接続されている。オペレーティングシステム（ＯＳ：Operating System）及び本実施例における処理を実施するためのアプリケーション・プログラムは、ＨＤＤ２５０５に格納されており、ＣＰＵ２５０３により実行される際にはＨＤＤ２５０５からメモリ２５０１に読み出される。ＣＰＵ２５０３は、アプリケーション・プログラムの処理内容に応じて表示制御部２５０７、通信制御部２５１７、ドライブ装置２５１３を制御して、所定の動作を行わせる。また、処理途中のデータについては、主としてメモリ２５０１に格納されるが、ＨＤＤ２５０５に格納されるようにしてもよい。本発明の実施例では、上で述べた処理を実施するためのアプリケーション・プログラムはコンピュータ読み取り可能なリムーバブル・ディスク２５１１に格納されて頒布され、ドライブ装置２５１３からＨＤＤ２５０５にインストールされる。インターネットなどのネットワーク及び通信制御部２５１７を経由して、ＨＤＤ２５０５にインストールされる場合もある。このようなコンピュータ装置は、上で述べたＣＰＵ２５０３、メモリ２５０１などのハードウエアとＯＳ及びアプリケーション・プログラムなどのプログラムとが有機的に協働することにより、上で述べたような各種機能を実現する。
【０１５８】
以上述べた本発明の実施の形態をまとめると、以下のようになる。
【０１５９】
本実施の形態に係る負荷推定方法は、プロセッサで実行される所定プログラムの負荷のレベルと、当該負荷の状態における当該プロセッサの走行パターンとを対応付けて記憶するコンピュータに、（Ａ）所定プログラムを実行中のプロセッサにおける走行データを収集する処理と、（Ｂ）走行データに基づいてプロセッサの走行状況を集計する処理と、（Ｃ）走行状況と走行パターンとの比較結果に基づいて、所定プログラムの負荷を推定する推定処理とを実行させる。
【０１６０】
このようにすれば、所定プログラムの負荷を、より簡便に把握できる。
【０１６１】
更に、走行状況及び走行パターンは、プロセッサにおける実行アドレスの度数分布に基づく特徴を含むようにしてもよい。
【０１６２】
このようにすれば、負荷の大小によって実行箇所が異なるという特性に基づき、より正しく負荷を推測できる。
【０１６３】
更に、度数分布における階級の範囲は、所定の上限幅内に含まれる実行アドレスの広がりに応じて設定されるようにしてもよい。
【０１６４】
このようにすれば、所定プログラムのルーチンと見込まれる箇所の実行頻度に基づいて、負荷状態を判別し易くなる。
【０１６５】
更に、走行状況及び走行パターンは、所定の上限幅の異なる２種類の度数分布の各々に基づく特徴を含むようにしてもよい。
【０１６６】
このようにすれば、大きいルーチンと見込まれる箇所及び小さいルーチンと見込まれる箇所における実行頻度に基づいて、負荷状態を判別し易くなる。
【０１６７】
更に、推定処理において、走行状況に近似する走行パターンに対応する負荷のレベルを特定するようにしてもよい。
【０１６８】
このようにすれば、所定の段階に分けて負荷を捉えることができる。
【０１６９】
更に、推定処理において、走行状況に含まれる指標と、２つの走行パターンの各々に含まれる同種の指標との各差の比に基づき、当該２つの走行パターンに対応する負荷のレベルの内分点に相当する負荷の程度を特定するようにしてもよい。
【０１７０】
このようにすれば、より細かい精度で負荷を把握できる。
【０１７１】
本実施の形態に係る負荷推定方法は、プロセッサで実行される所定プログラムの負荷のレベルと、当該負荷の状態における所定プログラムのルーチンの実行パターンとを対応付けて記憶するコンピュータに、（Ｄ）所定プログラムを実行中のプロセッサにおける走行データを収集する処理と、（Ｅ）走行データに基づいてルーチンの実行状況を集計する処理と、（Ｆ）実行状況と実行パターンとの比較結果に基づいて、所定プログラムの負荷を推定する推定処理とを実行させる。
【０１７２】
このようにすれば、所定プログラムの負荷を、より簡便に把握できる。
【０１７３】
更に、実行状況と実行パターンは、プロセッサにおける実行アドレスがルーチンに該当した頻度を含むようにしてもよい。
【０１７４】
このようにすれば、機能的な単位で実行頻度を比較できる。
【０１７５】
更に、実行状況と実行パターンは、プロセッサにおける実行アドレスがルーチンのグループに該当した頻度を含むようにしてもよい。
【０１７６】
このようにすれば、上位機能の単位で実行頻度を比較できる。
【０１７７】
更に、推定処理において、実行状況に含まれる指標と、２つの実行パターンの各々に含まれる同種の指標との各差の比に基づき、当該２つの実行パターンに対応する負荷のレベルの内分点に相当する負荷の程度を算出するようにしてもよい。
【０１７８】
このようにすれば、より細かい精度で負荷を把握できる。
【０１７９】
更に、推定処理において、複数種類の指標の各々について算出した負荷の程度の加重平均を算出するようにしてもよい。
【０１８０】
このようにすれば、各指標の重要性に応じて、より正しく負荷を把握できる。
【０１８１】
更に、推定処理において、所定プログラムの負荷の限界に対する現状の負荷の割合を算出するようにしてもよい。
【０１８２】
このようにすれば、例えば資源不足や動作不良などの異常事態に関する切迫の度合いを把握し易くなる。
【０１８３】
なお、上記方法による処理をコンピュータに行わせるためのプログラムを作成することができ、当該プログラムは、例えばフレキシブルディスク、ＣＤ−ＲＯＭ、光磁気ディスク、半導体メモリ、ハードディスク等のコンピュータ読み取り可能な記憶媒体又は記憶装置に格納されるようにしてもよい。尚、中間的な処理結果は、一般的にメインメモリ等の記憶装置に一時保管される。
【０１８４】
以上の実施例を含む実施形態に関し、さらに以下の付記を開示する。
【０１８５】
（付記１）
プロセッサで実行される所定プログラムの負荷のレベルと、当該負荷の状態における当該プロセッサの走行パターンとを対応付けて記憶するコンピュータに、
前記所定プログラムを実行中の前記プロセッサにおける走行データを収集する処理と、
前記走行データに基づいて前記プロセッサの走行状況を集計する処理と、
前記走行状況と前記走行パターンとの比較結果に基づいて、前記所定プログラムの負荷を推定する推定処理と
を実行させる負荷推定プログラム。
【０１８６】
（付記２）
前記走行状況及び前記走行パターンは、前記プロセッサにおける実行アドレスの度数分布に基づく特徴を含む
付記１記載の負荷推定プログラム。
【０１８７】
（付記３）
前記度数分布における階級の範囲は、所定の上限幅内に含まれる前記実行アドレスの広がりに応じて設定される
付記２記載の負荷推定プログラム。
【０１８８】
（付記４）
前記走行状況及び前記走行パターンは、前記所定の上限幅の異なる２種類の前記度数分布の各々に基づく前記特徴を含む
付記３記載の負荷推定プログラム。
【０１８９】
（付記５）
前記推定処理において、前記走行状況に近似する前記走行パターンに対応する前記負荷のレベルを特定する
付記１乃至４のいずれか１つ記載の負荷推定プログラム。
【０１９０】
（付記６）
前記推定処理において、前記走行状況に含まれる指標と、２つの前記走行パターンの各々に含まれる同種の指標との各差の比に基づき、当該２つの前記走行パターンに対応する前記負荷のレベルの内分点に相当する負荷の程度を算出する
付記１乃至４のいずれか１つ記載の負荷推定プログラム。
【０１９１】
（付記７）
プロセッサで実行される所定プログラムの負荷のレベルと、当該負荷の状態における前記所定プログラムのルーチンの実行パターンとを対応付けて記憶するコンピュータに、
前記所定プログラムを実行中の前記プロセッサにおける走行データを収集する処理と、
前記走行データに基づいて前記ルーチンの実行状況を集計する処理と、
前記実行状況と前記実行パターンとの比較結果に基づいて、前記所定プログラムの負荷を推定する推定処理と
を実行させる負荷推定プログラム。
【０１９２】
（付記８）
前記実行状況と前記実行パターンは、前記プロセッサにおける実行アドレスが前記ルーチンに該当した頻度を含む
付記７記載の負荷推定プログラム。
【０１９３】
（付記９）
前記実行状況と前記実行パターンは、前記プロセッサにおける実行アドレスが前記ルーチンのグループに該当した頻度を含む
付記７記載の負荷推定プログラム。
【０１９４】
（付記１０）
前記推定処理において、前記実行状況に含まれる指標と、２つの前記実行パターンの各々に含まれる同種の指標との各差の比に基づき、当該２つの前記実行パターンに対応する前記負荷のレベルの内分点に相当する負荷の程度を算出する
付記７乃至９のいずれか１つ記載の負荷推定プログラム。
【０１９５】
（付記１１）
前記推定処理において、複数種類の指標の各々について算出した前記負荷の程度の加重平均を算出する
付記１０記載の負荷推定プログラム。
【０１９６】
（付記１２）
前記推定処理において、前記所定プログラムの負荷の限界に対する現状の負荷の割合を算出する
付記７乃至１１のいずれか１つ記載の負荷推定プログラム。
【０１９７】
（付記１３）
プロセッサで実行される所定プログラムの負荷のレベルと、当該負荷の状態における当該プロセッサの走行パターンとを対応付けて記憶するコンピュータにより実行される負荷推定方法であって、
前記所定プログラムを実行中の前記プロセッサにおける走行データを収集する処理と、
前記走行データに基づいて前記プロセッサの走行状況を集計する処理と、
前記走行状況と前記走行パターンとの比較結果に基づいて、前記所定プログラムの負荷を推定する推定処理と
を含む負荷推定方法。
【０１９８】
（付記１４）
プロセッサで実行される所定プログラムの負荷のレベルと、当該負荷の状態における前記所定プログラムのルーチンの実行パターンとを対応付けて記憶するコンピュータにより実行される負荷推定方法であって、
前記所定プログラムを実行中の前記プロセッサにおける走行データを収集する処理と、
前記走行データに基づいて前記ルーチンの実行状況を集計する処理と、
前記実行状況と前記実行パターンとの比較結果に基づいて、前記所定プログラムの負荷を推定する推定処理と
を含む負荷推定方法。
【０１９９】
（付記１５）
プロセッサで実行される所定プログラムの負荷のレベルと、当該負荷の状態における当該プロセッサの走行パターンとを対応付けて記憶する記憶部と、
前記所定プログラムを実行中の前記プロセッサにおける走行データを収集する収集部と、
前記走行データに基づいて前記プロセッサの走行状況を集計する集計部と、
前記走行状況と前記走行パターンとの比較結果に基づいて、前記所定プログラムの負荷を推定する推定部と
を有する負荷推定装置。
【０２００】
（付記１６）
プロセッサで実行される所定プログラムの負荷のレベルと、当該負荷の状態における前記所定プログラムのルーチンの実行パターンとを対応付けて記憶する記憶部と、
前記所定プログラムを実行中の前記プロセッサにおける走行データを収集する収集部と、
前記走行データに基づいて前記ルーチンの実行状況を集計する集計部と、
前記実行状況と前記実行パターンとの比較結果に基づいて、前記所定プログラムの負荷を推定する推定部と
を有する負荷推定装置。
【符号の説明】
【０２０１】
１０１  サーバ装置    １０３  管理装置
２０１  ホストＯＳ    ２０３  アプリケーション
２０５  仮想マシン    ４０１  仮想スイッチ
４０３  ＮＩＣ    ７０１  収集ドライバ
７０３  走行データ記憶部    ７０５  分析エージェント
７０７  タイマ    １２０１  指示部
１２０３  集計部    １２０５  推定部
１２０７  送信部    １２２１  度数分布記憶部
１２２３  走行状況記憶部    １２２５  走行パターン記憶部
２１０１  矢印    ２５５１  関数テーブル記憶部
２５５３  実行状況記憶部    ２５５５  重み記憶部
２５５７  実行パターン記憶部    ２５５９  グループテーブル記憶部
【図１】
2018005688.tif 000003
【図２】
2018005688.tif 000004
【図３】
2018005688.tif 000005
【図４】
2018005688.tif 000006
【図５】
2018005688.tif 000007
【図６】
2018005688.tif 000008
【図７】
2018005688.tif 000009
【図８】
2018005688.tif 000010
【図９】
2018005688.tif 000011
【図１０】
2018005688.tif 000012
【図１１】
2018005688.tif 000013
【図１２】
2018005688.tif 000014
【図１３】
2018005688.tif 000015
【図１４】
2018005688.tif 000016
【図１５】
2018005688.tif 000017
【図１６】
2018005688.tif 000018
【図１７】
2018005688.tif 000019
【図１８】
2018005688.tif 000020
【図１９】
2018005688.tif 000021
【図２０】
2018005688.tif 000022
【図２１】
2018005688.tif 000023
【図２２】
2018005688.tif 000024
【図２３Ａ】
2018005688.tif 000025
【図２３Ｂ】
2018005688.tif 000026
【図２３Ｃ】
2018005688.tif 000027
【図２３Ｄ】
2018005688.tif 000028
【図２４】
2018005688.tif 000029
【図２５】
2018005688.tif 000030
【図２６】
2018005688.tif 000031
【図２７】
2018005688.tif 000032
【図２８】
2018005688.tif 000033
【図２９】
2018005688.tif 000034
【図３０】
2018005688.tif 000035
【図３１】
2018005688.tif 000036
【図３２】
2018005688.tif 000037
【図３３】
2018005688.tif 000038
【図３４】
2018005688.tif 000039
【図３５】
2018005688.tif 000040
【図３６】
2018005688.tif 000041
【図３７】
2018005688.tif 000042
【図３８】
2018005688.tif 000043