DataBase  /  SQL Server  /  レポート取得ガイド

PART 05 — Performance Monitor(PerfMon)による取得とセクション定義

Windows 標準の Performance Monitor(PerfMon)は、OS と SQL Server の性能カウンタを 同時に収集できるツールです。CPU・メモリ・I/O などの OS リソースと Buffer Manager・SQL Statistics・Locks などの SQL Server 固有のカウンタを 時系列で記録し、長期的な傾向分析や問題発生時の原因特定に活用できます。

1. PerfMon の概要と起動方法

PerfMon は perfmon.exe または Win + Rperfmon で起動します。 SQL Server のインスタンスが起動すると、SQL Server:* というオブジェクト群が 自動的にカウンタとして登録されます。

💡 名前付きインスタンスの場合
名前付きインスタンスはカウンタオブジェクトが MSSQL$INSTANCENAME:Buffer Manager のように $インスタンス名 が付きます。 デフォルトインスタンスは SQLServer:Buffer Manager です。

2. OS 系カウンタとしきい値

カウンタオブジェクト正常目安要注意深刻
% Processor Time Processor(_Total) < 70% 70〜85% > 85% 継続
Pages/sec Memory < 5 5〜20 > 20 継続(ページング発生)
Available MBytes Memory > 物理メモリの 10% 物理メモリの 5〜10% < 物理メモリの 5%
Avg. Disk sec/Read PhysicalDisk(*) < 10ms 10〜25ms > 25ms
Avg. Disk sec/Write PhysicalDisk(*) < 5ms(ログ) 5〜15ms > 15ms
Disk Queue Length PhysicalDisk(*) < 2 2〜4 > 4 継続
Context Switches/sec System 環境依存 急激な増加 CPU コア数 × 5000 超が継続

3. Buffer Manager カウンタとセクション定義

Oracle AWR の SGA Buffer Cache / Buffer Pool セクションに相当します。

カウンタ名説明目安
Buffer cache hit ratio バッファプールから要求が満たされた割合(%)。高いほどメモリで処理できている 99% 以上が理想(OLTP の場合)
Page life expectancy ページがバッファプールに留まる予測秒数(PLE)。低下は読み取り圧力を示す 300 秒以上(最低目安)。環境によっては 3000 秒以上が正常
Database pages バッファプール中のデータベースページ数
Free pages バッファプール中の空きページ数
Lazy writes/sec バッファプールのクリーン化のためにページをディスクに書き込んでいる頻度 継続的な高値はメモリ不足のサイン
Checkpoint pages/sec チェックポイントによりディスクに書き込まれたページ数/秒
Page reads/sec 物理読み取り(ディスクアクセス)の回数/秒 持続的に高い場合はバッファプール増量を検討

4. SQL Statistics カウンタとセクション定義

Oracle AWR の Instance Activity Statistics(SQL 実行統計)に相当します。

カウンタ名説明注目ポイント
Batch Requests/sec 1 秒あたりの受信バッチ数。SQL Server のスループット指標 ベースラインと比較して急増・急減を確認
SQL Compilations/sec 1 秒あたりのコンパイル数 Batch Requests/sec の 10% 超はアドホッククエリが多い可能性
SQL Re-Compilations/sec 1 秒あたりの再コンパイル数 Batch Requests/sec の 10% 超はパラメータスニッフィング問題等
Auto-Param Attempts/sec 自動パラメータ化の試行回数/秒
Failed Auto-Params/sec 自動パラメータ化に失敗した回数/秒 多い場合は sp_executesql によるパラメータ化を検討

5. Locks / Latches カウンタとセクション定義

Oracle AWR の Enqueue / Latch Statisticsセクションに相当します。

カウンタ名インスタンス説明目安
Lock Waits/sec _Total ロック待機の発生回数/秒 0 が理想。持続的な増加は要調査
Average Wait Time (ms) _Total ロック待機の平均待機時間(ミリ秒) 500ms 超は要注意
Deadlocks/sec _Total デッドロック発生回数/秒 0 が理想。継続的な発生は要対処
Lock Requests/sec _Total ロック要求の発生回数/秒
Latch Waits/sec (Latches オブジェクト) ラッチ待機の発生回数/秒 持続的な増加は内部競合のサイン
Average Latch Wait Time (ms) (Latches オブジェクト) ラッチ待機の平均待機時間 10ms 超は要調査

6. Databases / Log カウンタとセクション定義

Oracle AWR の Redo / Undo / Log File Statisticsセクションに相当します。

カウンタ名説明注目ポイント
Log Bytes Flushed/sec トランザクションログのフラッシュ量(バイト/秒) WRITELOG 待機と合わせて確認
Log Flushes/sec ログフラッシュの回数/秒 高頻度は commit が多いか、小さなトランザクションが多いサイン
Log Flush Waits/sec ログフラッシュ待ちの回数/秒 0 が理想。継続的な値はログ I/O ボトルネック
Transactions/sec 1 秒あたりのトランザクション数 ベースラインとの比較で負荷変化を把握
Active Transactions 現在アクティブなトランザクション数 急増は長時間未確定トランザクションの可能性

7. Memory Manager カウンタとセクション定義

Oracle AWR の PGA / Memory Advisorセクションに相当します。

カウンタ名説明注目ポイント
Memory Grants Pending クエリ実行用のメモリ許可を待機しているプロセス数 0 以外は RESOURCE_SEMAPHORE 待機と連動。要調査
Memory Grants Outstanding メモリ許可を取得して実行中のプロセス数
Total Server Memory (KB) SQL Server が現在使用しているメモリ(KB) Max Server Memory の設定値に近づいていないか確認
Target Server Memory (KB) SQL Server が理想とするメモリ使用量(KB) Total < Target が継続する場合はメモリ不足

8. データコレクタセットによる自動収集

PerfMon の「データコレクタセット」を使うと、定期的にカウンタを自動収集して BLG(バイナリログ)ファイルに保存できます。GUI または logman コマンドで設定可能です。

PowerShell — データコレクタセットの作成(XML テンプレート使用)
# logman でデータコレクタセットを作成(30 秒間隔、BLG 形式で保存)
logman create counter SQLServer_PerfMon `
    -f bincirc `
    -max 500 `
    -si 30 `
    -o "C:\PerfMon\SQLServer_%computername%_%date:~0,4%%date:~5,2%%date:~8,2%.blg" `
    -c `
        "\Processor(_Total)\% Processor Time" `
        "\Memory\Available MBytes" `
        "\Memory\Pages/sec" `
        "\PhysicalDisk(*)\Avg. Disk sec/Read" `
        "\PhysicalDisk(*)\Avg. Disk sec/Write" `
        "\PhysicalDisk(*)\Current Disk Queue Length" `
        "\SQLServer:Buffer Manager\Buffer cache hit ratio" `
        "\SQLServer:Buffer Manager\Page life expectancy" `
        "\SQLServer:Buffer Manager\Lazy writes/sec" `
        "\SQLServer:SQL Statistics\Batch Requests/sec" `
        "\SQLServer:SQL Statistics\SQL Compilations/sec" `
        "\SQLServer:SQL Statistics\SQL Re-Compilations/sec" `
        "\SQLServer:Locks(_Total)\Lock Waits/sec" `
        "\SQLServer:Locks(_Total)\Deadlocks/sec" `
        "\SQLServer:Memory Manager\Memory Grants Pending" `
        "\SQLServer:Databases(_Total)\Transactions/sec" `
        "\SQLServer:Databases(_Total)\Log Flush Waits/sec"

# データコレクタセットを開始
logman start SQLServer_PerfMon

# データコレクタセットを停止
logman stop SQLServer_PerfMon

9. typeperf / logman によるコマンドライン収集

CMD — typeperf でリアルタイム表示
:: Buffer Cache Hit Ratio と Page Life Expectancy をリアルタイム表示(5秒間隔)
typeperf ^
    "\SQLServer:Buffer Manager\Buffer cache hit ratio" ^
    "\SQLServer:Buffer Manager\Page life expectancy" ^
    "\SQLServer:SQL Statistics\Batch Requests/sec" ^
    "\SQLServer:Locks(_Total)\Deadlocks/sec" ^
    -si 5 -sc 60
CMD — typeperf で CSV ファイルに出力
:: CSV で 1 時間(3600 秒 ÷ 10 秒間隔 = 360 サンプル)収集
typeperf ^
    "\SQLServer:Buffer Manager\Buffer cache hit ratio" ^
    "\SQLServer:Buffer Manager\Page life expectancy" ^
    "\SQLServer:SQL Statistics\Batch Requests/sec" ^
    -si 10 -sc 360 ^
    -f CSV ^
    -o "C:\PerfMon\sqlserver_$(Get-Date -Format yyyyMMddHHmm).csv"
BLG ファイルは relog で CSV 変換可能
relog C:\PerfMon\sample.blg -f CSV -o C:\PerfMon\sample.csv
CSV に変換すると Excel や Python(pandas)で加工・可視化が容易になります。