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 + R → perfmon で起動します。
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 コマンドで設定可能です。
# 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 によるコマンドライン収集
:: 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
:: 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"
relog C:\PerfMon\sample.blg -f CSV -o C:\PerfMon\sample.csvCSV に変換すると Excel や Python(pandas)で加工・可視化が容易になります。