かつて山市良と呼ばれたおじさんのブログ
セイテクエンジニアのブログ かつて山市良と呼ばれたおじさんのブログ vol.202 パフォーマンスモニターでできること、できないこと|セイテク・シス管道場(Web)
2026年05月18日配信
執筆者:山内 和朗
「セイテク・シス管道場(Web)」では、Windows Serverの要素技術やシステム管理の基本的な部分に焦点を当てたいと思います。前回はWindows Vistaで登場したときにはパフォーマンスモニター(当時の名称は「信頼性とパフォーマンスモニタ《音引なし》」)の一部だった「信頼性モニター」に注目しました。今回は、「パフォーマンスモニター」(perfmon)の方に注目します。
「パフォーマンスモニター」(perfmon.exe、perfmon.msc)は、Windowsのシステムパフォーマンスのリアルタイム監視、ログ記録、分析のためのMMC(Microsoft管理コンソール)スナップインベースの標準のGUI管理ツールです(画面1)。

画面1 パフォーマンスモニター(perfmon.msc)
ナビゲーションウィンドウにある「モニターツール」「データコレクターセット」「レポート」の3つのノードは、パフォーマンスモニターの機能を示しています。
モニターツール ・・・ いわゆるパフォーマンスモニターを提供します。パフォーマンスモニターは、リアルタイムまたはログ(.blg、.csv、.tsv)に記録されたパフォーマンスカウンターをグラフ(折れ線グラフ、ヒストグラム)や数値(レポート)で視覚的に表示します。
データコレクターセット ・・・ 「ユーザー定義」ノードには、特定のパフォーマンスカウンター、イベントトレース、システム構成データ(WMI)のセットをバイナリログ(.blg《既定》)またはテキスト(.csv《カンマ区切り》、.tsv《タブ区切り》またはSQLデータベースに記録できます。特定のパフォーマンスカウンターがしきい値に達したときに警告を生成する「パフォーマンスの警告」を作成することもできます。「システム」ノードにある定義済みの「System Diagnostics(システム診断)」および「System Performance(システムパフォーマンス)」を使用すると、60秒間、システムトレースやパフォーマンスデータの収集を行い、システムの正常性やパフォーマンスを診断するためのレポートを生成できます。データコレクターセットの「データマネージャー」を使用すると、レポートの作成や、ログやレポートの管理(自動削除や圧縮《.cab》作成)を自動化できます(画面2)。
レポート ・・・ データコレクターセットを使用して作成した一連のカウンターからレポートを確認して生成できます。データコレクターセットの「データマネージャー」を使用すると、レポートを自動作成できます(画面3)。
なお、「データコレクターセット」の「イベントトレースセッション」と「スタートアップイベントトレース」ノードは、Windows自身が内部診断や最適化のために使用しているイベントトレース(ETW)であるため、通常、ユーザーが監視目的で利用することはありません。

画面2 データコレクターセットのデータマネージャー。ログやレポートの作成や管理の自動化が可能

画面3 60秒間の「System Diagnostics(システム診断)」の実行で自動生成されたレポート
このように、パフォーマンスモニターはさまざまな機能を提供しますが、イベントトレース機能を除けば、パフォーマンスカウンターを監視するためのフロントエンドツールにすぎません。サードベンダーやオープンソースの監視ツール(弊社のBOM for Windows《手前味噌ですが...》 や、Zabbixなど)を利用しているなら、パフォーマンスモニターを利用する必要はありません。ちなみに、BOMはWindowsのパフォーマンス監視にWindowsのパフォーマンスカウンター(例、¥Processor(_Total)¥% Processor Time)を使用しますが、クロスプラットフォームであるZabbixは監視対象のOSのネイティブなAPIまたはパフォーマンスカウンターを使用してパフォーマンス情報(例、system.cpu.util、perf_counter[¥Processor(_Total)¥% Processor Time])を取得できます。
もちろん、システムの問題を調査するために、一時的に短い監視間隔(1秒間隔など)でパフォーマンスを監視するのにパフォーマンスモニターを利用することは有効です。組み込みの「System Diagnostics(システム診断)」と「System Performance(システムパフォーマンス)」を平常時に実行しておきそれをベースラインとして、調査時に実行したレポートと比較するという使い方もできます。
現在、「パフォーマンスの警告」によるしきい値監視は、ほとんど利用されていないはずです。その理由は、警告(アラート)通知の機能が不足しているからです。「パフォーマンスの警告」では、「警告の動作」としてイベントログにイベントを書き込むか、別のデータコレクターセットを開始するか、タスクスケジューラーに登録済みのタスクを実行することしかできません(画面4)。昔はタスクスケジューラーの標準機能を利用して警告時に電子メールの送信ができました。しかし、その機能はWindows VistaおよびWindows Server 2008以降、削除されました(GUIには残っていますが機能しません)。パフォーマンスのしきい値監視は、パフォーマンスモニターに依存せずに、外部ツールに任せたほうが無難です(画面5)。
参考: (注: この方法はWindows VistaおよびWindows Server 2008以降ではもう機能しません)
パフォーマンス カウンター アラートを作成し、アラートがトリガーされたときに電子メールを送信する|Windows Server(Microsoft Learn)
画面4 「パフォーマンスの警告」データコレクターセットの設定例*1 機能はもう使われていないはず
*1 「アプリケーションイベントログにエントリを記録する」を有効にすると、アプリケーション(Application)ログではなく、Microsoft-Windows-Diagnosis-PLA/Operationsにイベント(イベントID 2031など)が書き込まれます。

画面5 しきい値によるアラート監視は、外部ツールのほうが得意(画面はBOM for Windows)

画面6 外部ツールを利用すれば、しきい値監視でイベントログに書き込んだり、電子メールで通知したりできる(画面はBOM for Windows、Microsoft 365メールに対応)
Windowsのパフォーマンスカウンターは、パフォーマンスモニターを使用しなくても、コマンドラインやツール、プログラムから取得することがきます。具体的には、TYPEPERFコマンド、WMIクラス、Get-Counterコマンドレット、.NET APIの.NET PerformanceCounterクラス、Win32 PDH(Performance Ata Helper) APIなどです。PowerShellまたはコマンドプロンプト(cmd.exe)で利用できる比較的簡単な例を以下に示します。いずれも、CPU使用率を提供するパフォーマンスカウンター「¥Processor Information(_Total)¥% Processor Time」またはレガシな「¥Processor(_Total)¥% Processor Time」 を1秒ごとに監視する例です(画面7)。
| # TYPEPERF コマンド(コマンドプロンプトまたはPowerShellで実行) typeperf "\Processor Information(_Total)\% Processor Time" -si 1 |
| # PowerShell Get-Counter コマンドレット(以下はすべてPowerShellで実行) while ($true) { $cpu = Get-Counter -Counter "\Processor Information(_Total)\% Processor Time" Write-Host "`r$($cpu.CounterSamples.CookedValue) % " -noNewLine sleep 1 } または Get-Counter -Counter "\Processor Information(_Total)\% Processor Time" -Continuous | Select -Expand CounterSamples|Select-Object CookedValue |
| # WMI Win32_PerfFormattedData_PerfOS_Processor クラス(レガシな¥Processor(_Total)¥% Processor Time」に相当) while ($true) { $cpu = (Get-CimInstance Win32_PerfFormattedData_PerfOS_Processor | Where-Object { $_.Name -eq "_Total" }).PercentProcessorTime Write-Host "`r$($cpu) % " -noNewLine Sleep 1 } |
| # .NET PerformanceCounter クラス $cpu = New-Object System.Diagnostics.PerformanceCounter( "Processor Information", "% Processor Time", "_Total" ) while ($true) { Write-Host "`r$($cpu.NextValue()) % " -noNewLine Sleep 1 } |

画面7 パフォーマンスモニターを使用しなくても、パフォーマンスカウンターの情報に比較的簡単にアクセスできる
次回はパフォーマンスモニターではなく、より重要なパフォーマンスカウンターに注目します。
ヒント:Windows ServerのServer Coreインストールには、既定でパフォーマンスモニターが含まれませんが、パフォーマンスカウンターは利用可能です。Windows Server 2019以降であれば、アプリ互換性オンデマンド機能(FoD)を追加することで、パフォーマンスモニター(perfmon.msc)やリソースモニター(perfmon /rel)を含む一部のGUI管理ツールを利用できるようになります。
|