SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

SQL Server のトレースを XPerf で取得してみる

leave a comment

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で確認

■XPerf のインストール


まずは XPerf をインストールする必要があります。

XPerf は以下からダウンロードすることができます。
Windows Software Development Kit (SDK) for Windows 8

XPerf は [Windows Performance Toolkit] (WPT) に含まれていますので、このツールをインストールします。
image

インストールが完了すると、[C:Program Files (x86)Windows Kits8.0Windows Performance Toolkit] に PATH が通っていれば、コマンドプロンプトから [XPerf] を実行することができるようになります。
image

 

■XPerf を使用した情報の取得


基本的なコマンドの形式としては以下のようになります。

開始 XPerf -on <カーネルフラグ> -stackwall <Stack Walking フラグ>
終了 XPerf -d <ファイルの出力先パス>

カーネルフラグに関しては [xperf -providers]、Stack Walking (スタック情報) フラグに関しては [xperf -help stackwalk] どのような種類があるかを確認することができます。

カーネルフラグの情報だけを取得するる場合には [xperf -providers KF] を実行することで取得することができます。
image

カーネルフラグを [+] でつなぐことで (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 ファイルの出力先のパス] を実行します。

image

■WPA の起動


情報の解析方法は Windows Perfomrance Analyzer (WPA) を使用します。

WPA を起動するための方法ですが 2 種類あります。

一つが [xperf <取得した ETL ファイル>] を実行して WPA を起動する方法です。
この方法で起動した場合は以下のような画面が表示されます。
image

もう一つが、スタートから WPA を起動して、ETL ファイルを開く方法になります。こちらで起動すると以下のような画面が表示されます。
imageimage

Troubleshooting SQL Server High CPU usage using Xperf では WPA を起動して情報を解析する方法を使用していますので、この情報を参考にしながら試す場合は ETL ファイルの開き方は少し注意しておいたほうがよいかもしれないですね。

■シンボルファイルの設定


環境変数の  [_NT_SYMBOL_PATH] にシンボルファイルのパスが設定されていない場合には WPA が起動したら [Trace] → [Configure Symbol Paths] をクリックして
image
シンボルのパスを [srv*C:SrvSymbols*http://msdl.microsoft.com/download/symbols] というように設定をします。
image

シンボルファイルのパス設定が終わったら [Trace] → [Load Symbols] をクリックして、シンボルファイルをダウンロードします。ダウンロードの状況は画面に表示されます。
# XPerf から起動した場合も同様の操作になるのですが、シンボルファイルのファイルのダウンロードが行われない場合は、[Window] → [New Window] で新しいウィンドウを開くとダウンロードが開始されるかもしれません。
image

なお、スタックの情報を表示するためには [Load Symbols] を有効にしておく必要があります。

 

■情報の解析 (XPerf から開いた場合)


それでは実際の情報の解析方法を見ていきたいと思います。
まずは、XPerf で開いた場合から。

XPerf で開いた場合には以下のような画面が表示されます
image

セレクタータブをクリックすることで表示されている情報を変更することができます。

imageimage

 

 

 

 

 

 

 

 

 

 

 

 

表示内容は、特定の時間のみを拡大することもできます。
今回は [CPU Sampling by CUP] の情報を使用してみたいと思います。

ズームしたい時間帯をドラッグで選択して、

image

[Zoom To Selection] をクリックすることで特定の時間帯を拡大することができます。

image

[Summary Table] をクリックすることで、選択範囲のプロセス単位の情報を表示することができます。
image

セレクタータブか [Columns] から表示する列を変更することができます。

imageimage

初期の状態ですと、[Stack] は選択されていないためスタック情報が表示されません。
[Stack] を有効にすると以下のような情報が表示することができます。
image
あとは [% Weight] 等を確認し、どの部分で負荷がかかっているのかをブレークダウンしていくことで情報を解析することができます。

Disk I/O の情報の [Summary Table] を表示すると以下のようにファイル単位の I/O を確認することができます。
リソースマネージャーで使用されているのもこの辺の情報なのかもしれないですね。
image
image

 

■情報の解析 (WPA から開いた場合)


WPA から ETL ファイルを開いた場合には、左ペインの [Graph Explorer] から情報を選択することができます。
image

以下は CPU の使用率のグラフですが、デフォルトではさまざまプロセスの情報が表示された状態となっています。

image

特定のプロセスだけを表示したい場合には、すべてのカウンターを選択して
image

[Disable] → [Selection] を選択して、すべての選択を解除して、

image

表示したいプロセスだけを選択した除隊にします。
# 項目名の右の四角をクリックしてカウンターを有効にするか、[Enable] → [Selection] で有効にします。
image

右上の [Display graph and table] を表示することで、グラフの下にテーブル形式で情報を表示することも可能です。

image
image

XPerf から起動した場合と同様に WPA でもスタックの情報はデフォルトでは表示されていません。
グラフのヘッダ部分の歯車のアイコンをクリックすることでスタックの情報を追加できるようになります。
image

今回は [Stack] [Module] [Function] を追加しています。
image

そうするとスタックの情報が表示できるようになります。
image

後の情報の見方は XPerf から開いた場合と同じになりそうです。

スレッドやプロセスのライフタイムもわかりますので、この辺も参考になりそうですね。

image

image

SQL Server 用のシンボルファイルは Microsoft の提供しているシンボルファイルの URL のモジュールに含まれていますので、SQL Server の動作のスタックも確認ができるようになります。
特定のクエリのどの処理で重いかというところもこの辺から追うことができるかと。
image

スタックの情報を読める一歩進んだ情報解析ができるようにもう少し勉強していきたいと思います。

Written by masayuki.ozawa

5月 5th, 2013 at 4:04 pm

Posted in SQL Server

Tagged with

Leave a Reply

*