WPA とか XPerf とか

こんにちは、K 里です。今回は WPA (Windows Performance Analyzer) をご紹介します。

 

※ 2009/12/25 に情報を追加しました。この記事の最後に追加しましたのでご確認いただけると幸いです。

WPA (ひょっとしたら Xperf という名前の方が有名かもしれません) は、Windows OS やその中で動作するアプリケーション、サービス、ドライバを含むシステム全体のパフォーマンスを詳細に測定するためのプログラムです。このプログラムは、システムビルダー、ハードウェアメーカー、アプリケーション&ドライバ デベロッパーの方々を対象としています。用途としては、開発時に発生する問題の一次的な切り分けやシステム全体のパフォーマンス検証などが主です。WPA は、見るべき個所が多岐にわたるパフォーマンス関連の調査ならびに検証に対して非常に優れた効果を発揮します。是非ご活用くださいませ。

 

インストールしよう

まずは下記 URL の Downloads のセクションから WPA のツールキット (Windows Performance Toolkit) をダウンロードしましょう。

Windows Performance Analysis

https://msdn.microsoft.com/en-us/performance/

インストールフォルダには、以下の実行ファイルがあります。

Ø xperf.exe: カーネルイベントを含む各種トレースデータを採取するための実行ファイル

Ø xperfview.exe: xperf.exe で採取したトレースデータをグラフィカルに表示してくれるビューアー (CUI からだと xperf xxx.etl でも可)

Ø xbootmgr.exe: システムの状態遷移時にトレースするための実行ファイル

WPA は、Windows XP SP2, Vista SP1, Server 2003 SP1, Server 2008 以降の OS で動作します。しかし、Windows XP と Server 2003 では、キットのインストールができないため、一度 Vista もしくは Server 2008 にインストールし、インストールフォルダ (デフォルトだと \Program Files\Microsoft Windows Performance Toolkit) から xperf.exe と perfctrl.dll を XP, Server 2003 環境にコピーすることになります。また、XP, Server 2003 でトレースデータの取得は可能ですが、ビューアーからの確認は残念ながらできません。XP, Server 2003 で採取したトレースデータは、Vista もしくは Server 2008 環境で確認することになります。

使ってみよう

モノは試しです。まずは使ってみましょう。コマンドプロンプトを管理者権限で起動し、下記コマンドを実行します。(1) のコマンドで、トレースが開始されます。次に、システム上でファイル操作やアプリケーション操作、デバイス接続などシステムに負荷を与えるようなことを色々やってみてください。適当なタイミングで (2) のコマンドを実行します。これで、トレースが終了し、そのデータを trace.etl に保存することになります。早速 (3) のコマンドを実行してデータを見てみましょう。なお “インストールしよう” での説明通り、コマンド (1), (2) は、トレースデータを採取するためのコマンドですので Windows XP, Server 2003 でも実行できます。ただ、コマンド (3) は、ビューアーを起動するためのコマンド (xperf と入力しても実際に起動するのは xperfview.exe となります) ですので、Windows XP, Server 2003 では使用できません。

C:\Program Files\Microsoft Windows Performance Toolkit>xperf -on DiagEasy ----- (1)

C:\Program Files\Microsoft Windows Performance Toolkit>xperf -d trace.etl ----- (2)

Merged Etl: trace.etl

C:\Program Files\Microsoft Windows Performance Toolkit>xperf trace.etl ----- (3)

C:\Program Files\Microsoft Windows Performance Toolkit>

以下のようなグラフが表示されたらバッチリです。

さて、グラフの各項目については、見て触ってなんとなくの感触をつかめると思いますので、トレース開始時に指定した “DiagEasy” について少々補足します。WPA は、ETW (Event Tracing for Windows) をベースに動作し、ETW と同様に Event Provider からイベント情報を取得することになります。Kernel のイベント情報も数多くあり、それらをキャプチャする際の最小単位を Kernel Flag と呼びます。プロセスやスレッドの情報、割込み、File I/O、Disk I/O、電源管理などのイベント情報に分類されます。先に使用した DiagEasy とは、様々な用途に応じてこれら Kernel Flag をまとめたものであり、Kernel Group と呼ばれています。Kernel Flag, Kernel Group に関しては下記コマンドで確認することができます。赤字で示しているのが DiagEasy に関する Kernel Flag, Kernel Group の説明となります。

C:\Program Files\Microsoft Windows Performance Toolkit>xperf -providers k

Kernel Flags:

PROC_THREAD : Process and Thread create/delete

LOADER : Kernel and user mode Image Load/Unload events

PROFILE : CPU Sample profile

CSWITCH : Context Switch

COMPACT_CSWITCH: Compact Context Switch

DISPATCHER : CPU Scheduler

DPC : DPC Events

INTERRUPT : Interrupt events

SYSCALL : System calls

PRIORITY : Priority change events

ALPC : Advanced Local Procedure Call

PERF_COUNTER : Process Perf Counters

DISK_IO : Disk I/O

DISK_IO_INIT : Disk I/O Initiation

FILE_IO : File system operation end times and results

FILE_IO_INIT : File system operation (create/open/close/read/write)

HARD_FAULTS : Hard Page Faults

FILENAME : FileName (e.g., FileName create/delete/rundown)

SPLIT_IO : Split I/O

REGISTRY : Registry tracing

DRIVERS : Driver events

POWER : Power management events

NETWORKTRACE : Network events (e.g., tcp/udp send/receive)

VIRT_ALLOC : Virtual allocation reserve and release

MEMINFO : Memory List Info

ALL_FAULTS : All page faults including hard, Copy on write, demand zero faults, etc.

Kernel Groups:

Base : PROC_THREAD+LOADER+DISK_IO+HARD_FAULTS+PROFILE+MEMINFO

Diag : PROC_THREAD+LOADER+DISK_IO+HARD_FAULTS+DPC+INTERRUPT+CSWITCH+PERF_COUNTER+COMPACT_CSWITCH

DiagEasy : PROC_THREAD+LOADER+DISK_IO+HARD_FAULTS+DPC+INTERRUPT+CSWITCH+PERF_COUNTER

Latency : PROC_THREAD+LOADER+DISK_IO+HARD_FAULTS+DPC+INTERRUPT+CSWITCH+PROFILE

FileIO : PROC_THREAD+LOADER+DISK_IO+HARD_FAULTS+FILE_IO+FILE_IO_INIT

IOTrace : PROC_THREAD+LOADER+DISK_IO+HARD_FAULTS+CSWITCH

ResumeTrace : PROC_THREAD+LOADER+DISK_IO+HARD_FAULTS+PROFILE+POWER

SysProf : PROC_THREAD+LOADER+PROFILE

Network : PROC_THREAD+LOADER+NETWORKTRACE

歩いてみよう

ETW や WPA には Stack Walking (もしくは Stack Tracing) と呼ばれる機能があります。Stack Walking はトレース期間の Kernel イベントに対するコールスタック情報を網羅します。スタック情報と併せて各関数の処理にかかった時間を表示できますので、パフォーマンスの調査を行う際に、どのプロセスで、どのスレッドで、どの関数で処理に時間がかかっているのかを特定することができます。なおコールスタックを表示するためには、おなじみシンボルファイルが必要となります。

まずは、シンボルファイルを使用するためのシンボルパスを設定しましょう。WPA には、Windbg でいうところの .sympath コマンドはないので、環境変数でシンボルパスを設定することになります。例えば以下の通りです。

変数名: _NT_SYMBOL_PATH

変数値: srv*C:\SrvSymbols*https://msdl.microsoft.com/download/symbols

以下のコマンドを実行してデータを採取します。適当なタイミングでトレースを終了し、先ほどと同様にトレースデータをロードします。

C:\Program Files\Microsoft Windows Performance Toolkit>xperf -on Latency –stackwalk Profile

C:\Program Files\Microsoft Windows Performance Toolkit>xperf -d stackwalk.etl

Merged Etl: stackwalk.etl

C:\Program Files\Microsoft Windows Performance Toolkit>xperf stackwalk.etl

C:\Program Files\Microsoft Windows Performance Toolkit>

[Trace] メニューの [Load Symbols]、または Window 内で右クリックメニューの [Load Symbols] をクリックします。Microsoft Internet Symbols Store というライセンス規約に関するダイアログ画面が表示されたら [YES] をクリックします。環境変数で設定したシンボルパスにシンボルファイルがロードされますので少々お待ちください。シンボルパスのフォルダに xxxxx.pdb というフォルダがポコポコ作成されると思います。

[CPU Sampling by CPU] のエリアにて、左クリックで範囲を設定し (全範囲は右クリックで [Select View] をクリック)、右クリックメニューの [Summary Table] をクリックします。

Selector tab をクリックして、Column Chooser を開きます。Process name, Process stack, Weight, %Weight にチェックします。

stack 列に表示される [Root] の '+' をクリックしていくと順次コールスタックが展開されます。なお公開されているシンボルファイルは、パブリックなシンボルですので、全てのモジュール情報が含まれているわけではなく場合によっては表示されない関数もあります。

システム状態遷移時のトレースについて

パフォーマンスの検証では、システムの起動、シャットダウンにかかる時間やスリープ、休止状態からの復帰にかかる時間などが重要になってくると思います。Windows Vista や Server 2008 環境では以下のコマンドを実行してデータを採取します。なおコマンド実行後に自動的に再起動、スリープ、休止状態に移行しますのでご注意ください。システム起動 or 復帰後、自動的にトレースデータが採取されます (Delaying for boot trace x of xダイアログ画面が表示されます。トレースデータのファイル名は、boot_xxxxx.etl などになります)。

C:\Program Files\Microsoft Windows Performance Toolkit>xbootmgr –trace boot –stackwalk Profile

/*** 実行後に、-trace で指定されたオプション通りに状態遷移が行われます ***/

Trouble Shooting

どのような状況において WPA を使用すると効果的か、具体的な例を挙げて説明します。例として、外付け USB HDD を接続すると、デバイスの認識に時間がかかるという問題が発生したと仮定します (仮想的に問題を発生させたので、若干不自然な箇所があるかもしれませんがご容赦ください)。この問題に対して、デバイスを接続してからエクスプローラがデバイスを認識するまでの時間をトレースしてみました。

Disk I/O エリアを確認すると、どうやらデバイス接続時に Read Access が頻繁に起きているようです。

Read Access が頻繁に起きている期間を選択し、右クリックメニューの [Summary Table] をクリックします。Service Time から System プロセスの処理に時間を要していることがわかります。

次に Interrupt CPU Usage エリア上で、先ほどと同様の期間を選択し、右クリックメニューの [Summary Table] をクリックします。内容を確認すると、USB のハードウェア割り込みが多く発生しています。DPC CPU Usage についても同様の結果になっています。

ここから以下のような要因を推測することができます。

Ø USB ハードウェア割り込みが発生しているので、PC と USB 外付け HDD でなんか通信しているみたい

Ø 外付け USB HDD に対して Read アクセスが発生しているので、システム内の誰かが I/O Read 要求を出しているみたい

Ø System プロセスの処理で時間がかかっているようなので、System プロセスが原因かも

ハードウェア割り込みや外付け USB HDD に対する Read は、デバイスの調査や USB のプロトコルアナライザーが必要になるのでここでは割愛します。残るは、システムの誰かが、I/O Read をしているか、System プロセスのパフォーマンスの問題のどちらかです。そこで、Stack Walking でどのスタックで時間が掛っているかがわかりますが、今回は仮想的に問題を発生させて不自然な状態になってしまったので、図解は割愛させてください。もし、同じような問題が発生したら試してみてください。

最後になりますが、アプリケーションやドライバでパフォーマンスを低下させる要因としては、同期/非同期処理の実装があります。適切に同期処理を実装しないと Race Condition につながり、適切に非同期処理を実装しないとパフォーマンス低下につながります。開発者にとっては永遠の課題です。このようなパフォーマンス問題は、切り分けとして、まずはシステム上で何が起きているのかを WPA から確認するのは如何でしょうか? WPA は Kernel Event をグラフィカルに表示してくれるので、容易に全容を把握でき、一次次切り分けの検証工数を減らすことに役立つと思いますので、興味があったら試してみてください。

★★★★★ [2009/12/25] 追加情報 ★★★★★

MSDN サイト情報の更新に伴い補足情報を追記します。これまでの XPerf は単体でダウンロード可能でしたが、Windows 7 対応に伴い、SDK に含まれるようになりました。また、Windows XP や Windows Server 2003 で XPerf を使用するにあたり、上記記事でトレースデータの取得は可能と記載しましたが、カーネルの構造上 Stackwalk 機能を使用することはできませんのでご了承ください。前述を踏まえ、Windows XP での XPerf の使用例 (boot trace) を以下に追記します。参考になりましたら幸いです。

Windows Vista or later バージョンの OS で以下を実施します

1. 下記サイトから Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1 をダウンロード & インストールします

Download Windows Performance Analysis

https://msdn.microsoft.com/en-us/performance/cc752957.aspx

2. 下記 SDK インストールフォルダ Bin フォルダ上にある wpt_xxx.msi (xxx は各 architecture) をダブルクリックし、WPA(Windows Performance Analysis) をインストールします

例: C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin

3. 下記 WPA インストールフォルダより xbootmgr.exe、perfctrl.dll をコピーします

例: C:\Program Files\Microsoft Windows Performance Toolkit

Windows XP (Target PC) 上で以下を実施します

4. 任意の作業用フォルダを作成し、3 でコピーしたファイルを格納します

5. コマンドプロンプト上で以下のコマンドを実施します (自動的にシステムが再起動されます)

xbootmgr.exe -trace boot

6. 再起動後、コマンドプロンプト上で以下のコマンドを実施します (etl ファイルが生成されます)

xbootmgr.exe -remove

7. 4 の作業用フォルダに生成された etl ファイルをコピーします

Windows Vista or later バージョンの OS で以下を実施します

8. 7 でコピーした etl ファイルを任意の作業用フォルダに格納します

9. [スタート] -> [すべてのプログラム] -> [Microsoft Windows Performace Tool Kit] -> Performace Analyzer をクリックします

10. [File] -> [Open] をクリックし、対象 etl ファイルを選択します

ではまた。