アプリケーションのギアを上げよう
― Visual Studio 2010でアプリケーションのパフォーマンス・チューニング ―

第1回 OS機能によるアプリのパフォーマンス測定

亀川 和史
2011/04/08
Page1 Page2 Page3

 Windows OSでは、Windowsイベントのトレース・データがEvent Tracing for Windows(以下、ETW)によって収集・管理されている。

Event Tracing for Windows(ETW)の仕組み

 そのETWの仕組みは、以下のようになっている。

Event Tracing for Windows(ETW)の仕組み
Windowsイベントのトレース・データがETWによって収集・管理されている。
  ETWイベント・プロバイダ。Windowsのカーネルを始めとして多数のイベント・トレース・データのプロバイダ(=提供者)がある。
  ETWに、ログの開始/停止などを指示するコントローラ(コマンドライン・ツール「xperf.exe」など)。
  バッファからイベント・トレース・データをリアルタイムに読み出す。
  ETWバッファ(=)から出力されるETLファイル(=.etlファイル)。
  ETWイベント・プロバイダの出力を一時的に格納するバッファ。ETWコントローラからバッファ・サイズを指定することもできる。
  ETLファイルを見やすく整形して表示する(Performance Analyzer(=GUIツール「xperfview.exe」)など)。

OSに登録済みのETWイベント・プロバイダ

 まず、OSにどんなETWイベント・プロバイダが登録されているか見てみよう。

 コマンドライン・ツール「xperf.exe」(=Xperfコマンド)に「-providers」オプションを指定すれば、プロバイダの一覧が表示される。すべて表示すると、数がとても多いので(コマンド・プロンプトの表示領域が300行でも足りない)、「KG」(=KernelGroups)を指定してカーネル・プロバイダの中からグループとして定義されているものに限って表示させると、以下のようになる。なお、xperf.exeファイルはWindows SDKがインストールされたフォルダ(=標準では「C:\Program Files\Microsoft Windows Performance Toolkit」)にある。コマンド・プロンプトは管理者として実行する。具体的には、[スタート]メニューの[すべてのプログラム]−[アクセサリ]−[コマンド プロンプト]の右クリック・メニューから[管理者として実行]を選択する。

Windows 7 SP1 x64におけるカーネル・グループでの登録済みETWイベント・プロバイダの一覧
「xperf -providers KG」というコマンドを実行した結果、「Base」「Diag」「DiagEasy」「Latency」「FileIO」「IOTrace」「ResumeTrace」「SysProf」「Network」という9種類のETWイベント・プロバイダが、カーネル・グループに登録済みであることが分かる。「DiagEasy」プロバイダで示されているカーネル・フラグの意味を、以下に示す。なお、各カーネル・フラグの説明(英語)を調べたいときは、「xperf -providers KF」というコマンドでその説明を表示できる。
PROC_THREAD:プロセスおよび、スレッドの生成/終了。
LOADER:カーネルおよびユーザー・モード・イメージのロード/アンロード・イベント。
DISK_IO:ディスクI/O。
HARD_FAULTS:物理ページ・フォルト。
DPC:DPCイベント。
INTERRUPT:割り込みイベント。
CSWITCH:コンテキスト・スイッチ。
PERF_COUNTER:プロセスのパフォーマンス・カウンタ。

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イベント・トレース・データを解析してくれる。

 この一連の流れを以下の画面に示す。

[はい]ボタンをクリック

Performance Analyzer(=xperfview.exe)が起動する
Xperfコマンドを用いたETWイベント・トレース・データ採取の一連の流れ
DiagEasyプロバイダによりETWイベント・トレース・データを採取し、続けてPerformance Analyzerを起動してそのデータを解析している。
  DiagEasyプロバイダでETWイベント・トレース・データの採取を開始する。Xperfコマンド実行後、性能評価を行いたい処理(=自作のプログラムとか、「重い」と思っていた処理)を行う。
  必要な処理が終わった後、ファイル名を指定して、ETWのバッファ・データをETLファイルに出力し、ETWイベント・トレース・データの採取を終了する。出力までに少し時間がかかる。コンソール出力された「Merged Etl:」の後のメッセージは、「このファイルにはプロセス名やレジストリ・パスといった、センシティブな情報も入っているから適切なセキュリティが設定されていて、ほかの人がアクセスできないような場所に置くこと」という趣旨の注意書きである。
  ビューア「Performance Analyzer」を起動して、ETWイベント・トレース・データを確認・分析する(ただし、Windows XPでは残念ながらPerformance Analyzerは起動しない)。
  ビューア起動前に、このような警告が表示される。特権昇格済みの(=管理者として実行している)コマンド・プロンプトからビューアを起動しようとしているため、「ビューアは昇格する必要がないので、昇格しないモードで起動するか?」ということをこの警告で問い合わせている。[はい]ボタンを押して起動すれば問題ない。ちなみに、特権昇格していないコマンド・プロンプトから「xperf <.etlファイル名>」というコマンドを実行しても、問題なくビューアが起動する。

ETWイベント・トレース・データ採取結果の確認

 ビューア「Performance Analyzer」が起動すると、以下のような画面が表示される。前述のパフォーマンス・モニタを解析した結果とは異なり、非常に多くの情報が表示されていることが分かる。

Performance AnalyzerによるETWイベント・トレース・データの表示
なお、このデータはVisual Studio 2010 SP1を起動して、ソリューションを読み込ませ、ソリューションを全コンパイルしたときのETWイベント・トレース・データだ。下の[CPU Usage by Process]ビューの青い折れ線がVisual Studioのプロセス名「devenv.exe」になっている。最もCPUを使ったところに合わせている。
  Visual StudioのIDEプロセス名(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」環境変数に例えば下記のように指定すればよい。

srv*F:\SymCache*http://msdl.microsoft.com/download/symbols/

 シンボル・サーバの設定については、以下のKB(ナレッジ・ベース)が参考になる。

 注意点として、シンボル・サーバの設定を行っている場合、インターネットに接続していない状態ではデバッガの起動が遅くなる。そういった現象が起きた場合は、シンボル・サーバの設定を見直してほしい。

 また、ETWおよびPerformance Analyzerでは、さらに詳細に分析するために、スタック情報を渡り歩く(stack walk)機能も提供されている。この機能について、次のページで説明する。


 INDEX
  アプリケーションのギアを上げよう ― Visual Studio 2010でアプリケーションのパフォーマンス・チューニング
  第1回 OS機能によるアプリのパフォーマンス測定
    1.パフォーマンス・モニタとWindows Performance Toolkitによる性能問題の分析
  2.Event Tracing for Windows(ETW)によるイベント・トレース・データの採取/分析
    3.スタック情報による詳細なイベント・トレース・データの採取/分析

インデックス・ページヘ 「アプリケーションのギアを上げよう」


Insider.NET フォーラム 新着記事
  • 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH