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

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

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

スタック情報を有効にしてETWを実行する方法

 スタック情報を有効にしてETWを実行するには、コマンド・プロンプトから以下の画面のように(「xperf -on Latency -stackwalk profile」コマンドを)実行する。注意点として、64bit OSではレジストリを修正する必要がある(Xperfコマンド実行時に警告が出る)ので注意してほしい(詳しくは、次の画面の説明欄を参照してほしい)。ただし、レジストリを修正して、起動しなくなった場合、最悪、OSから再インストールしなければならない可能性がある。

スタック情報を有効にしたETWの実行
スタック情報を含めたETWイベント・トレース・データの採取を開始しているところ。
  スタック情報を含めたETWイベント・トレース情報の記録を開始する。
  64bitシステムでは完全なスタック追跡情報が取得できないという警告。それでも取得する場合、以下のレジストリを修正する必要がある。
「HKEY_LOCAL_MACHINE\CurrentControlSet\Control\Session Manager\Memory Management」キーの中に、REG_DOWRD型の「DisablePagingExecutive」という値を作り、「1」を設定し、最後にOSの再起動を行う。
ただし、トレース自身は開始しているので、これは単なる警告である。
このレジストリ設定の効果の説明は、「KB184419:NT Executive ページングからディスクを停止する方法」として解説されている。

 先ほどと同様に性能測定したいプログラムを実行し、「-d」オプションを付けてETLファイルに保存し(コマンド例:「xperf -d stackwalk.etl」)、XperfコマンドでETLファイルを指定して読み込ませると(コマンド例:「xperf stackwalk.etl」)、今度はPerformance Analyzerの一番上に[CPU Sampling By CPU]ビューが追加される。その中からプログラムが実行していた対象範囲を選択する。次の画面はその例だ。

スタック情報を有効にしたETW実行結果のPerformance Analyzerによる表示
Performance Analyzerの[CPU Sampling By CPU]ビューを表示しているところ。
  これをクリックすると[Frame List]というチェックボックスの一覧が表示されるので、表示したいトレース情報のビューのみにチェックを入れる。例えば[CPU Sampling By CPU]チェックボックスのみにチェックを入れれば、ほかのビューは非表示になる。

 「選択すべき時間範囲」と「プロセスの起動から終了までの時間範囲」の関連付けが分かりづらいという場合は、同じ右クリック・メニューの中にある[Overlay Graph]から[Process Lifetimes]−[All]を実行して、両者のレイヤを重ね合わせれば、2つの表示が重なって見づらくなるものの、選択すべき時間範囲は分かりやすくなる。あるいはから表示される[Frame List]一覧から[Process Lifetime]と[CPU Sampling By CPU]のみをチェックすれば、2つのビューだけが上下に並ぶので比較しやすくなる。

シンボルの読み込み

 スタック情報を含めた詳細な解析を行う前に、シンボルの読み込みに関する設定を行う必要がある。(メニューバーの)[Trace]メニューの中にある[Configure Symbol Paths]をクリックすると表示される[Configure Symbol Paths]ダイアログで、その設定を行える。なお、すでに環境変数「_NT_SYMBOL_PATH」にシンボル・パスを設定している場合は、あらためて設定を行う必要はない。

[Configure Symbol Paths]をクリック
シンボルの読み込みに関する設定
スタック情報を含めた詳細な解析を行う前に、シンボルの読み込みに関する設定を行う必要がある。
  クリックして左にチェック・マークが付くと、シンボルの読み込みが行われるようになる。実際にチェック・マークを付ける前に、シンボル・パスをのダイアログか、環境変数「_NT_SYMBOL_PATH」に設定しておく必要がある。
  [Configure Symbol Paths](シンボル・パス設定)ダイアログ。[_NT_SYMBOL_PATH]欄に、下記のように設定すればよい。
・ 「srv*」の直後に、ローカルHDDの十分な空き容量があるフォルダを指定する
・ その次の「*」以降に、Microsoftのシンボル・サーバ「http://msdl.microsoft.com/download/symbols/」を指定する
 例:「srv*F:\SymCache*http://msdl.microsoft.com/download/symbols/

また、自作プログラムのシンボルを読み込みたい場合には、.exe/.dllファイルと同じフォルダに.pdbファイルが配置されていれば、自動的に探される。同じフォルダに配置すると製品リリースや管理上の問題があるような場合には、別のフォルダに.pdfファイルを配置し、そのフォルダへのパス(例:「C:\MyApplicationsSymbols」)を、例えば下記のような指定で「_NT_SYMBOL_PATH」欄に指定することもできる。
 例:「srv*F:\SymCache*http://msdl.microsoft.com/download/symbols/;C:\MyApplicationsSymbols
このように指定すれば、「キャッシュ」「マイクロソフトが公開しているシンボル・サーバ」「ローカルで作った.pdbファイル」を別々に管理することができる。

 以上の設定を行ったうえで、同じ[Trace]メニューの中にある[Load Symbols]をクリックする。これにより、[Load Symbols]メニューの左にチェックが入った状態になり、マイクロソフトのシンボル・サーバおよび、ローカルのキャッシュからシンボルが読み込まれるようになる。

スタック情報を有効にしたETWイベント・トレース・データ採取結果の確認

 それでは、スタック情報を有効にしたETWイベント・トレース・データ採取結果の詳細を確認してみよう。

 先ほど選択した範囲の右クリック・メニューから[Summary Table]を選択する。[CPU Sampling Summary Table]ウィンドウが表示されるので、次の画面のように(メニューバーから)[Columns]メニューの[Stack]を選択すると、一覧表に[Stack]列が表示される。

一覧表に[Stack]列を表示する手順
スタック情報を調べるには、[Summary Table]ウィンドウ内の一覧表で[Stack]列を表示する。
  [Stack]をクリックすると、[Stack]列が表示される。

 この状態から、[Summary Table]ウィンドウ内の一覧表でプロセスの右にある[+]をクリックすると、[Stack]列に「[Root]」が表示される(次の画面を参照)。さらにその右側の[+]をクリックしていくと、(マイクロソフトのシンボル・サーバなどで)公開されているシンボルの範囲で、処理の階層構造を追跡できる。これで右側に表示されている[Weight]列/[% Weight]列および[Count]列で各行を比較すれば、実際のDLLのどの関数の呼び出しで時間がかかっているか、ある程度めぼしを付けることが可能だ。

範囲選択された時間帯で動作していた各プロセスのCPU使用率(スタック情報込みの情報)の表示
[Stack]列にスタック情報が表示されるので、より詳細に各処理でのCPU使用率を分析できる。
  [Process]列:対象プロセス名。
  [Stack]列:スタック。プログラムの呼び出し階層。(マイクロソフトのシンボル・サーバなどで)シンボルが公開されているものであれば、WindowsのAPIも確認できる。
  [Module]列:.exe/.dllファイルに含まれるモジュール名。
  [Function]列:.exe/.dllファイル内のモジュールに含まれる関数名。シンボルとして公開されていない場合は「Unknown」で表示される。
  [% Weight]列:処理全体での重み(100%中で何%を占める)。
  [Count]列:関数の呼び出し回数。

 こうやって性能問題の原因個所に当たりを付けていけば、少なくとも最も呼び出し回数が多い処理は分かるだろう。

 本稿で示したOS機能を活用したパフォーマンス測定は、Visual Studioのインストールができない環境で役に立つ。そのためにもリリースしたモジュールのシンボル・ファイル(=.pdbファイル)は大切に保持しておく必要がある(自作プログラムの性能解析や障害解析をする場合、.pdbファイルと(アンマネージドの場合).mapファイルは必須である。詳しくは、「Tech Fielders:Visual Studio を利用したアンマネージ DLL 開発のイ・ロ・ハ」を参照してほしい)。

 本稿ではVisual Studioを使わない方法を説明したが、Visual Studioで開発している場合(Visual Studio Premium以上のエディションであれば)、ソース・コードから、より詳細な性能測定/分析を行える。次回はその方法を紹介する。end of article


 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