アプリケーションのギアを上げよう ― Visual Studio 2010でアプリケーションのパフォーマンス・チューニング ― 第1回 OS機能によるアプリのパフォーマンス測定 亀川 和史2011/04/08 |
|
|
Windows OSでは、Windowsイベントのトレース・データがEvent Tracing for Windows(以下、ETW)によって収集・管理されている。
●Event Tracing for Windows(ETW)の仕組み
そのETWの仕組みは、以下のようになっている。
Event Tracing for Windows(ETW)の仕組み | ||||||||||||||||||
Windowsイベントのトレース・データがETWによって収集・管理されている。 | ||||||||||||||||||
|
●OSに登録済みのETWイベント・プロバイダ
まず、OSにどんなETWイベント・プロバイダが登録されているか見てみよう。
コマンドライン・ツール「xperf.exe」(=Xperfコマンド)に「-providers」オプションを指定すれば、プロバイダの一覧が表示される。すべて表示すると、数がとても多いので(コマンド・プロンプトの表示領域が300行でも足りない)、「KG」(=KernelGroups)を指定してカーネル・プロバイダの中からグループとして定義されているものに限って表示させると、以下のようになる。なお、xperf.exeファイルはWindows SDKがインストールされたフォルダ(=標準では「C:\Program Files\Microsoft Windows Performance Toolkit」)にある。※コマンド・プロンプトは管理者として実行する。具体的には、[スタート]メニューの[すべてのプログラム]−[アクセサリ]−[コマンド プロンプト]の右クリック・メニューから[管理者として実行]を選択する。
●XperfコマンドによるETWイベント・トレース・データの採取
カーネル・フラグが最も多いETWイベント・プロバイダは「Diag」だが、通常のカーネル・イベントのトレース・データの採取では「DiagEasy」で十分だろう。
まずは、管理者としてコマンド・プロンプトを起動したうえで、Xperfコマンドに「-on」オプションを指定して、DiagEasyプロバイダによるETWイベント・トレース・データの採取を開始する(コマンド例:「xperf -on DiagEasy」)。このXperfコマンドの実行後、性能評価したいプログラムを実行すればよい。
プログラム上での操作の終了後、Xperfコマンドに「-d」オプションでファイル名(拡張子「.etl」)を指定する(コマンド例:「xperf -d vs2010wakeup.etl」)。これにより、採取していたETWイベント・トレース・データが指定されたファイルに記録される(※この際、ETWイベント・トレース・データの採取も終了する)。
最後に、.etlファイルを指定してXperfコマンドを実行する(コマンド例:「xperf vs2010wakeup.etl」)。これによって、ビューア「Performance Analyzer」(=xperfview.exe)が起動して.etlファイルを読み込み、ETWイベント・トレース・データを解析してくれる。
この一連の流れを以下の画面に示す。
●ETWイベント・トレース・データ採取結果の確認
ビューア「Performance Analyzer」が起動すると、以下のような画面が表示される。前述のパフォーマンス・モニタを解析した結果とは異なり、非常に多くの情報が表示されていることが分かる。
Performance AnalyzerによるETWイベント・トレース・データの表示 | |||
なお、このデータはVisual Studio 2010 SP1を起動して、ソリューションを読み込ませ、ソリューションを全コンパイルしたときのETWイベント・トレース・データだ。下の[CPU Usage by Process]ビューの青い折れ線がVisual Studioのプロセス名「devenv.exe」になっている。最もCPUを使ったところに合わせている。 | |||
|
Performance Analyzerは、このようにグラフを表示するだけではない。プログラム・ビルド時にシンボル(=.pdbファイル)が生成されており、マイクロソフトが提供しているシンボル・サーバ(http://msdl.microsoft.com/download/symbols)をインターネット経由で参照できる場合、「ソース・コードのどの位置から呼び出されている、どんなAPIで時間がかかっているか」を追跡できる。
上の画面のの部分(=Visual Studioのプロセスが突出してCPUを消費している前後の部分)をマウスで範囲選択して、その選択範囲の右クリック・メニューから[Summary Table]を選択する(次の画面を参照)。
Performance Analyzerの[CPU Usage by Process]ビューにおける範囲選択の右クリック・メニュー |
すると、以下のようにこの時間帯で動作していた各プロセスのCPU使用率が細かく表示される。
「devenv.exe」の[+]部分をクリック |
範囲選択された時間帯で動作していた各プロセスのCPU使用率の表示 |
シンボル・サーバの設定が行われており(詳しくは下記のコラムを参照)、対象のシンボルがマイクロソフトから提供されているものである場合、[Process]列にある[+]部分をクリックしてドリルダウンしていけば(上の画面の例では、「devenv.exe」の[+]部分をクリックしている)、「どのDLL(=.dllファイル)でCPUを消費しているか」などの情報を詳しく表示できる。
【コラム】シンボル・サーバの設定 |
Windowsではデバッグ時に必要となる情報(=シンボル)をインターネット経由でダウンロードできるようになっている。製品リリースおよび、Service Packのレベルでは、MSDNおよび、Webサイトから一括でダウンロードすることもできるが、毎月公開されているパッチはMicrosoftのサイトからインターネット経由でダウンロードする必要がある。 シンボルのダウンロード先は.NET Frameworkの場合と同じだが、Performance AnalyzerではWindowsの環境変数か、ダイアログでシンボル・パスを設定する必要がある(ダイアログで設定する方法は後述)。例えばWindowsの環境変数に設定する場合には、Windowsの環境変数「_NT_SYMBOL_PATH」(システム環境変数でもユーザー環境変数でもどちらでもよい)にローカル・キャッシュ用のフォルダ(例:「F:\localsymbols」)および、マイクロソフトのシンボル・サーバのURL(例:「http://msdl.microsoft.com/download/symbols」)を設定する必要がある(参考:「Windows TIPS:環境変数を変更する」)。なお、Visual Studio内の(メニューバーの)[デバッグ]メニューにある[オプションと設定]から行えるシンボル・サーバの設定は、Visual Studioでしか有効ではない(参考:「Visual Studio 2008で見る.NET Frameworkのソース・コード」)。 詳しくは、後述の「シンボルの読み込みに関する設定」という図版の説明部分を参照してほしいが、「_NT_SYMBOL_PATH」環境変数に例えば下記のように指定すればよい。
シンボル・サーバの設定については、以下のKB(ナレッジ・ベース)が参考になる。 注意点として、シンボル・サーバの設定を行っている場合、インターネットに接続していない状態ではデバッガの起動が遅くなる。そういった現象が起きた場合は、シンボル・サーバの設定を見直してほしい。 |
また、ETWおよびPerformance Analyzerでは、さらに詳細に分析するために、スタック情報を渡り歩く(stack walk)機能も提供されている。この機能について、次のページで説明する。
INDEX | ||
アプリケーションのギアを上げよう ― Visual Studio 2010でアプリケーションのパフォーマンス・チューニング | ||
第1回 OS機能によるアプリのパフォーマンス測定 | ||
1.パフォーマンス・モニタとWindows Performance Toolkitによる性能問題の分析 | ||
2.Event Tracing for Windows(ETW)によるイベント・トレース・データの採取/分析 | ||
3.スタック情報による詳細なイベント・トレース・データの採取/分析 | ||
「アプリケーションのギアを上げよう」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|
- - PR -