Windows Performance Analysis Toolkit (WPT) に含まれている XPerf を使用するとトレースデータを取得することができます。
このツールを使用して SQL Server のトレースを取得するための手順を勉強しながら少しまとめてみました。
XPerf に関しては以下の情報が参考になります。
Xperf Command-Line Reference
Troubleshooting SQL Server High CPU usage using Xperf
Identifying the cause of SQL Server IO bottlenecks using XPerf
Diagnose High CPU on Windows with XPerf
Stack Walking in Xperf
WPA とか XPerf とか
第1回 OS機能によるアプリのパフォーマンス測定
起動時の情報を取得する Xbootmgr というツールもあるようですがこれは別の機会に触れればなと思います。
Dipping My Toe Into the Xbootmgr Water
WPA とか XPerf とか
# XPerf だけでなく Xbootmgr も紹介されています。
Windowsの起動が遅いならWindows Performance Toolkitで確認
Contents
■XPerf のインストール
まずは XPerf をインストールする必要があります。
XPerf は以下からダウンロードすることができます。
Windows Software Development Kit (SDK) for Windows 8
XPerf は [Windows Performance Toolkit] (WPT) に含まれていますので、このツールをインストールします。
インストールが完了すると、[C:Program Files (x86)Windows Kits8.0Windows Performance Toolkit] に PATH が通っていれば、コマンドプロンプトから [XPerf] を実行することができるようになります。
■XPerf を使用した情報の取得
基本的なコマンドの形式としては以下のようになります。
開始 | XPerf -on <カーネルフラグ> -stackwall <Stack Walking フラグ> |
終了 | XPerf -d <ファイルの出力先パス> |
カーネルフラグに関しては [xperf -providers]、Stack Walking (スタック情報) フラグに関しては [xperf -help stackwalk] どのような種類があるかを確認することができます。
カーネルフラグの情報だけを取得するる場合には [xperf -providers KF] を実行することで取得することができます。
カーネルフラグを [+] でつなぐことで (PROC_THREAD+LOADER) 複数のカーネルフラグの情報を指定することができるようになりますがデフォルトでカーネルグループとしてグルーピングされたものがいくつか要されています。
[xperf -providers KG] を実行することでカーネルグループを表示することができます。
Base | PROC_THREAD+LOADER+DISK_IO+HARD_FAULTS+PROFILE+MEMINFO+MEMINFO_WS |
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 |
ResidentSet | PROC_THREAD+LOADER+DISK_IO+HARD_FAULTS+MEMORY+MEMINFO+VAMAP+SESSION+VIRT_ALLOC |
ReferenceSet | PROC_THREAD+LOADER+HARD_FAULTS+MEMORY+FOOTPRINT+VIRT_ALLOC+MEMINFO+VAMAP+SESSION+REFSET+MEMINFO_WS |
Network | PROC_THREAD+LOADER+NETWORKTRACE |
よく使用するものとしては [Base] [DiagEasy] [Latency] あたりがあるようですね。
冒頭に書いた Troubleshooting SQL Server High CPU usage using Xperf では [Xperf -on Latency -stackwalk profile] を使用して、CPU が使用されている原因となる SQL の調査をしています。
StackWalk の情報を取得する前に [DisablePagingExecutive] を [1] 設定して、ユーザーモード / カーネルモードドライバーの情報のページングの設定を変える必要がありそうですが。
私の環境では [0] が設定されているので、StackWalk を取得した際に警告が表示されるかなと思ったのですが、特にメッセージは表示されませんでした。レジストリ変更後に再起動をする必要があるため、稼働中のシステムで設定するのは難しいことがあるかもしれないですね。
NT エグゼクティブ ページングからをディスクを停止する方法
今回はレジストリを変更しない状態で [Xperf -on Latency -stackwalk profile] を実行して情報の取得を開始したいと思います。
コマンドを実行したら情報を取得したい SQL Server の操作を実行し、操作が終了したら [xperf -d <ETL ファイルの出力先のパス] を実行します。
■WPA の起動
情報の解析方法は Windows Perfomrance Analyzer (WPA) を使用します。
WPA を起動するための方法ですが 2 種類あります。
一つが [xperf <取得した ETL ファイル>] を実行して WPA を起動する方法です。
この方法で起動した場合は以下のような画面が表示されます。
もう一つが、スタートから WPA を起動して、ETL ファイルを開く方法になります。こちらで起動すると以下のような画面が表示されます。
Troubleshooting SQL Server High CPU usage using Xperf では WPA を起動して情報を解析する方法を使用していますので、この情報を参考にしながら試す場合は ETL ファイルの開き方は少し注意しておいたほうがよいかもしれないですね。
■シンボルファイルの設定
環境変数の [_NT_SYMBOL_PATH] にシンボルファイルのパスが設定されていない場合には WPA が起動したら [Trace] → [Configure Symbol Paths] をクリックして
シンボルのパスを [srv*C:SrvSymbols*http://msdl.microsoft.com/download/symbols] というように設定をします。
シンボルファイルのパス設定が終わったら [Trace] → [Load Symbols] をクリックして、シンボルファイルをダウンロードします。ダウンロードの状況は画面に表示されます。
# XPerf から起動した場合も同様の操作になるのですが、シンボルファイルのファイルのダウンロードが行われない場合は、[Window] → [New Window] で新しいウィンドウを開くとダウンロードが開始されるかもしれません。
なお、スタックの情報を表示するためには [Load Symbols] を有効にしておく必要があります。
■情報の解析 (XPerf から開いた場合)
それでは実際の情報の解析方法を見ていきたいと思います。
まずは、XPerf で開いた場合から。
セレクタータブをクリックすることで表示されている情報を変更することができます。
表示内容は、特定の時間のみを拡大することもできます。
今回は [CPU Sampling by CUP] の情報を使用してみたいと思います。
ズームしたい時間帯をドラッグで選択して、
[Zoom To Selection] をクリックすることで特定の時間帯を拡大することができます。
[Summary Table] をクリックすることで、選択範囲のプロセス単位の情報を表示することができます。
セレクタータブか [Columns] から表示する列を変更することができます。
初期の状態ですと、[Stack] は選択されていないためスタック情報が表示されません。
[Stack] を有効にすると以下のような情報が表示することができます。
あとは [% Weight] 等を確認し、どの部分で負荷がかかっているのかをブレークダウンしていくことで情報を解析することができます。
Disk I/O の情報の [Summary Table] を表示すると以下のようにファイル単位の I/O を確認することができます。
リソースマネージャーで使用されているのもこの辺の情報なのかもしれないですね。
■情報の解析 (WPA から開いた場合)
WPA から ETL ファイルを開いた場合には、左ペインの [Graph Explorer] から情報を選択することができます。
以下は CPU の使用率のグラフですが、デフォルトではさまざまプロセスの情報が表示された状態となっています。
特定のプロセスだけを表示したい場合には、すべてのカウンターを選択して
[Disable] → [Selection] を選択して、すべての選択を解除して、
表示したいプロセスだけを選択した除隊にします。
# 項目名の右の四角をクリックしてカウンターを有効にするか、[Enable] → [Selection] で有効にします。
右上の [Display graph and table] を表示することで、グラフの下にテーブル形式で情報を表示することも可能です。
XPerf から起動した場合と同様に WPA でもスタックの情報はデフォルトでは表示されていません。
グラフのヘッダ部分の歯車のアイコンをクリックすることでスタックの情報を追加できるようになります。
今回は [Stack] [Module] [Function] を追加しています。
後の情報の見方は XPerf から開いた場合と同じになりそうです。
スレッドやプロセスのライフタイムもわかりますので、この辺も参考になりそうですね。
SQL Server 用のシンボルファイルは Microsoft の提供しているシンボルファイルの URL のモジュールに含まれていますので、SQL Server の動作のスタックも確認ができるようになります。
特定のクエリのどの処理で重いかというところもこの辺から追うことができるかと。
スタックの情報を読める一歩進んだ情報解析ができるようにもう少し勉強していきたいと思います。