SQL Server の状態を確認するためにパフォーマンスモニターでデータを取得することがあります。
今回の投稿ではパフォーマンスモニター関連のコマンド等についてまとめてみたいと思います。
コマンドに関しては コマンド ラインからパフォーマンスを監視する がまとまっているかと。
Contents
■現状の状態を表示する際の設定を保存
後で解析をするためにログとして取得したい場合にはユーザー定義のデータコレクターセットを使用するかと思います。
現在の状態を確認するためにデータコレクターセットとは別に、現在の活動状況を表示することがあるかと。
この際、カウンターを追加していきますが、追加したカウンターの情報を頻繁にみる必要があるため、設定を保存しておきたいということがあるかと思います。
グラフ内を右クリックして [設定を保存] を使用することで、設定を保存することができるのですが、Web ページとして保存されるため、使い勝手がいまいちだったりします。
MMC で確認ができる状態で設定を保存したい場合は、以下の方法で設定を保存することができます。
- ファイル名を指定して実行から [mmc] を起動
- [ファイル] → [スナップインの追加と削除] から [パフォーマンス モニター] を追加し、パフォーマンス モニターを開く
- カウンターを追加
- [ファイル] → [名前を付けて保存] から msc ファイルとして保存
以上で設定を保存することが可能です。
再度同様の情報を表示させたい場合には保存した msc ファイルを実行することで、同じ状態の設定を使用することができます。
■コマンドプロンプトでパフォーマンスモニターを操作
TypePerf
UNIX だと vmstat で CUI ベースでパフォーマンスの情報を取得することができるかと思います。
Windows でも typeperf コマンドを使用することで CUI ベースでパフォーマンスの情報を取得することができます。
typeperf "Processor(_Total)% Processor Time" -si 5 カウンターの一覧を取得する場合 typeperf -q
取得するカウンターは以下のようなテキストファイルで外部に保持することができます。
Processor(_Total)% Processor Time MemoryAvailable MBytes
TypePerf を以下の形式で実行することでカウンターを読むことができます。
typeperf -si 5 -cf c:\temp\Counter.txt
logman
ユーザー定義のパフォーマンスモニターをほかの端末に移したい時などは logman? コマンドを利用します。
logman には export と import のオプションがありますので他の端末で設定したパフォーマンスモニターのユーザー定義の設定を移すことができます。
エクスポートについては以下のようなコマンドで実行します。
REM ユーザー定義の設定を確認 logman logman export "New Data Collector Set" -xml c:\temp\Export.xml
エクスポートをしたファイルは XML で出力されますので、これを他の環境にインポートすればユーザー定義の設定を移行し、他の環境で同様のパフォーマンスモニターのログを取得できるようにすることができます。
logman -import -xml c:\temp\export.xml -name "Data Collection"
relog
パフォーマンスモニターのログはバイナリログ (blg) で取得することが多いですが、解析するは CSV + Excel で使用することが多いかと思います。
このような変換をする場合には、relog を使用します。
relog DataCollector01.blg -c "Processor(_Total)% Processor Time" "MemoryAvailable MBytes" -f CSV -o export.txt -b "2013/12/22 16:45:00" -e "2013/12/22 16:47:00"
以下のようなカウンターファイルにエクスポート対象を定義することができます。
Processor(_Total)% Processor Time MemoryAvailable MBytes
このファイルを使用して、エクスポートをすることができますので、特定のパターンで情報解析を頻繁にする場合はこのようなカウンターファイルを用意すると便利だと思います。
relog DataCollector01.blg -cf cf.txt -f CSV -o export.txt -b "2013/12/22 16:45:00" -e "2013/12/22 16:47:00"
■リモートから取得する場合
パフォーマンスモニターの情報はリモートから取得したい場合もあるかと思います。
パフォーマンスモニターの情報をリモートか取得することは可能なのですが、設定やポートの許可が必要となりますので、ざっくりと書いておきたいと思います。
パフォーマンスモニターを実行する環境で必要となる権限
一般ユーザーではパフォーマンスモニターを使用して情報を取得することができません。
パフォーマンスモニターのデータコレクターに設定するユーザーは、「Performance Log Users」のメンバーである必要があります。
このグループのメンバーであれば、パフォーマンスモニターの操作ができますので、ログの取得設定をすることができます。
このグループに所属していないユーザーをデータコレクターに設定した場合、データコレクターを開始することができなかったかと。
SYSTEM や Administrator で実行する場合は不要ですが、リモートから取得する場合は、ドメインユーザーか、パススルーが可能な同一ユーザー名/パスワードのローカルユーザーを使用することが多いかと思いますので。
パフォーマンスモニターで情報を取得される環境で必要となる権限
パフォーマンスモニターのデータコレクターに設定したユーザーが、実際に情報を取得される環境の「Performance Log Users」のメンバーの必要があります。
# Administrators グループのユーザーの場合は不要ですが。
このグループに所属していないユーザーを、データコレクターに設定して、情報の取得を開始した場合、情報が取得されません。
パフォーマンスモニターで情報を取得される環境でアクセスを許可する必要のあるポート
パフォーマンスモニターで情報を取得される環境では、情報を取得する環境からの、以下のポートのアクセス許可が必要となります。
- TCP:135
- TCP:139
- TCP445
Windows ファイアウォールでは、「パフォーマンス ログと警告」という、システムでデフォルトで定義されているルールがありますが、このルールの許可では、アクセスができないことがあったはずですので、取得環境から上記のポートにアクセスできることを確認しておいたほうがよいかと。
# 「パフォーマンス ログと警告」とあわせて「ファイルとプリンターの共有 」が有効になっていた場合は、アクセスできたはずですが。
■PowerShell でパフォーマンスモニターの情報を取得
PowerShell でもパフォーマンスモニターを操作することができます。
いくつかの操作方法があり、System.Diagnostics.PerformanceCounter を使用した方法については、みなさんご存じ TaaS こと田口さんが解説してくださっています。
PowerShell で パフォーマンス カウンタ の値を取得する
# TaaS については、しばやん先生がまとめてくれています。
最近の Windows Azure でよく使われる *aaS をまとめてみた
$Counter = "\processor(_total)\% processor time", "\Memory\Available MBytes" Get-Counter -Counter $Counter | Select -ExpandProperty "counterSamples" | SELECT path,instancename,@{name="value";expression={($_.cookedvalue).tostring("#0")}} $p = New-Object -TypeName System.Collections.ArrayList [void]$p.Add((new-object System.Diagnostics.PerformanceCounter("Processor", "% Processor Time", "_Total"))) [void]$p.Add((new-object System.Diagnostics.PerformanceCounter("Memory", "Available MBytes"))) [void]$p.nextvalue() # CPU 使用率等については即時次の情報を読み取ると正確な値が取得できないため、1 秒スリープする # https://msdn.microsoft.com/ja-jp/library/system.diagnostics.performancecounter.nextvalue(v=vs.110).aspx Start-Sleep 1 1..10 | %{ $p | %{[PSCustomObject]@{ Date=(Get-Date).ToString("HH:mm:ss") "Date(UTC)"=(Get-Date).ToUniversalTime().ToString("HH:mm:ss") CategoryName=$_.CategoryName CounterName=$_.CounterName InstanceName=$_.InstanceName Value=$_.NextValue() RawValue = $_.RawValue }} | ft Start-Sleep 1 }
PowerShell 3.0 以降は以下のコマンドレットが追加されているので、標準のコマンドレットでパフォーマンスモニターの情報を取得することもできます。
パフォーマンス カウンタの計算値の取得 も合わせて確認しておくとよさそうですね。
PowerShell で取得して、SQLite に書き込むようなものについては、PerfmonToSQLite?として作ってみました。
データコレクターセットについては、国井さんの パフォーマンスモニタ徹底攻略マニュアル や、なおきさんの PowerShell を使って、複数台の端末上に同様の設定でパフォーマンスチェックの簡略化を実現 で紹介されている Pla.DataCollectorSet (IDataCollectorSet interface) を使う形になるのでしょうか。