troushoo

xperf:パフォーマンスのトラブル時の調査に役立つフリーのツール

xperf
xperfはパフォーマンスのトラブル時の調査に役に立つフリーのツールで、マイクロソフトより公開されています。
今回は、カーネルメモリのリークが疑われているシステムを例にとり、xperfのインストールから使い方までを見ていきます。

【xperfの入手方法】
xperfを入手するには、マイクロソフトの「Windows アセスメント & デプロイメント キット」のページよりダウンロードします。
Windows アセスメント & デプロイメント キット

【xperfのインストール方法】
xperfのインストール方法も簡単で、上記のサイトからダウンロードしたexeファイル(= adksetup.exe)を実行するだけです。ウィザードに従ってインストールをすれば2, 3分程度でインストールできます。
途中の「インストールを行う機能を選択してください」のところで、「Windows パフォーマンス ツールキット」に選択が入っていることを確認してください。
xperfインストール

【xperfでカーネルメモリのリークの調査】
0. 準備
64bitのWindows 7とWindows Server 2008 R2では、情報を正しく取得するため、以下のレジストリを設定し、再起動する必要があります。
キー: HKEY_LOCALMACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management
名前: DisablePagingExecutive
値: dword で 1
DisablePagingExecutiveを1に

1. 管理者権限のコマンドプロンプトを起動します。

2. 以下の引数でxperfの実行を開始します。
xperf -on Base+CSwitch+POOL -stackwalk PoolAlloc+PoolAllocSession -BufferSize 1024 -MaxBuffers 1024 -MaxFile 1024 -FileMode Circular

引数 意味
-on Base+CSwitch+POOL Base(= 基本情報), CSwitch(= コンテキストスイッチ情報), POOL(= プール情報)を取得する
-stackwalk PoolAlloc+PoolAllocSession PoolAllock, PoolAllocSessionを有効にしてコールスタック情報を取得する
-BufferSize 1024 使用するバッファのサイズを1024KBにする
-MaxBuffers 1024 使用する最大バッファのサイズを1024KBにする
-MaxFile 1024 使用するファイルの最大値を1024MBにする
-FileMode Circular ファイルモードをCircular(=循環)にする

xperfの実行を開始


3. メモリリークを発生させます。
今回は、「NotMyFault」を使用しました。ダウンロード・使用方法は後述します。

4. 以下の引数を実行し、xperfを停止させます。
xperf –d c:\Test\pool.etl

引数 意味
-d c:\Test\pool.etl c:\Test\pool.etl 取得した情報を書き出します。

xperfの実行を終了


【xperfで取得した情報の見方】
1. xperfで取得した情報(=上記のpool.etl)をダブルクリックします。
すると、Windows Performance Analyzerが起動します。
etlファイルをダブルクリック

2. “Trace” –> “Configure Symbol Paths”をクリックします。
シンボルの設定

3. シンボルの設定を確認します。
今回は、C:\bin\NotMyFault\symbols\x64 にNotMyFault (=メモリリークを発生させるのに使用したツール)のシンボルがありますので、その設定も行いました。
シンボルの設定

4. “Trace” –> “Load Symbols”をクリックします。
シンボルがロードされるので、しばらく待ちます。
シンボルのロード

5. 左の”Graph Explorer”の”Memory”を展開し、”Pool Total Allocation Size”をダブルクリックします。
すると、右の”Analysis”の部分にグラフが追加されます。
グラフの表示

6. “Display graph and table”をクリックします。
すると、下にテーブルが表示されます。
テーブルの表示

7. “Size”でソートをすると、”Pool Tag”が”Leak”となっているものが、大量にメモリを食っていることがわかります。
すなわち、Pool Tagが”Leak”であるものが、メモリリークを起こしている可能性を示唆しています。
大量にメモリを消費しているものがわかる

8. テーブルのヘッダ部分を右クリックして、”Stack”にチェックを入れます。
Stackにチェックを入れる
“Stack”を、黄色の左に移動し、展開すると、myfault.sysがメモリを割り当てていることがわかります。
myfault.sysがメモリリークを起こしている可能性

すなわち、myfault.sysがメモリリークを起こしている可能性を示唆しています。
このように、xperfを用いると、メモリリークを起こしているモジュールを特定することも可能です。

【補足】
【xperfの後継ツールWindows Performance Recorderについて】
xperfの後継ツールとしてWindows パフォーマンス レコーダー(=WPR)が公開されております。
(後継ツールではありますが、今回紹介したCircular(=循環)ログはWPRではサポートされていない等一部WPRではできないことがあります。)
WPRの使用方法については以前のブログ「WPR/WPAでパフォーマンス調査」をご参照ください。
WPR

[メモリリークの発生が疑われるデモ環境の構築方法]

今回はメモリリークを発生させるために、マイクロソフトがフリーで公開している「NotMyFault」を使用しました。ダウンロード・実行方法は以下です。
1. マイクロソフトのサイトより、「NotMyFault」をダウンロード
NotMyFaultのダウンロード
2. ダウンロードしたNotMyFault.zipを解凍の後、「x64\NotMyfault.exe」を実行
3. “Leak”のタブの”Leak Nonpaged”をクリック
NotMyFault

リンク
・Troubleshooting Pool Leaks Part 7 – Windows Performance Toolkit (英語)
本記事の元ネタです。
http://blogs.msdn.com/b/ntdebugging/archive/2012/11/30/troubleshooting-pool-leaks-part-7-windows-performance-toolkit.aspx
・WPT: WPR/Xperf: Capture high cpu, disk i/o, file, registry, networking, Private bytes, Virtual bytes, Paged Pool/Nonpaged pool and/or application slowness. (英語)
Xperfの説明です。
http://blogs.technet.com/b/yongrhee/archive/2012/11/23/wpr-xperf-capture-high-cpu-disk-i-o-file-registry-networking-private-bytes-virtual-bytes-paged-pool-nonpaged-pool-and-or-application-slowness.aspx


  1. 2013/04/07(日) 22:10:17|
  2. ツール
  3. | トラックバック:0
  4. | コメント:0
<<WiresharkのパケットキャプチャからSMBで通信されたファイルを取り出す方法 | ホーム | 無料で使えるHolaを利用して、海外でしか見れないサイトを見る方法>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://troushoo.blog.fc2.com/tb.php/106-2c82eaad
この記事にトラックバックする(FC2ブログユーザー)

スポンサーリンク

最新記事

月別アーカイブ

カテゴリ

ツール (92)
ネットワーク (76)
Visual Studio (56)
SOS・Psscor2/Psscor4 (25)
WinDbg (25)
Linux (24)
Azure (17)
Tips (20)
英語 (1)
About Me (1)
未分類 (0)

全記事表示リンク

全ての記事を表示する

検索フォーム

RSSリンクの表示

リンク

このブログをリンクに追加する