ここ数日で WMI とパフォーマンス カウンターについて学んだことはすべてです。
WMI は Windows Management Instrumentation の略です。WMI は、WMI システムおよび Windows COM サブシステムに登録されたクラスのコレクションです。これらのクラスはプロバイダーと呼ばれ、クエリを実行すると動的データを返す任意の数のパブリック プロパティがあります。
Windows には、Windows 環境に関する情報を提供する多数の WMI プロバイダーがプリインストールされています。この質問では、Win32_PerfRawData* プロバイダーと、それから構築される 2 つのラッパーに関心があります。
Win32_PerfRawData* プロバイダーに直接クエリを実行すると、返される数値が恐ろしく見えることに気付くでしょう。これは、これらのプロバイダーが、必要なものを計算するために使用できる生データを提供するためです。
Win32_PerfRawData* プロバイダーとの連携を容易にするために、Microsoft は、PerfMon プロバイダーと Win32_PerfFormattedData* プロバイダーの、照会時により適切な応答を返す 2 つのラッパーを提供しています。
では、プロセスの CPU 使用率を取得するにはどうすればよいでしょうか。次の 3 つのオプションがあります。
- Win32_PerfFormattedData_PerfProc_Process プロバイダーから適切にフォーマットされた数値を取得する
- PerfMon から適切にフォーマットされた数値を取得する
- Win32_PerfRawData_PerfProc_Process を使用して、自分自身の CPU 使用率を計算します
オプション 1 にはバグがあり、すべての場合に機能するとは限らないことがわかります。これは通常、インターネットで提供される回答です。
Win32_PerfFormattedData_PerfProc_Process からこの値を取得する場合は、質問に記載されているクエリを使用できます。これにより、このプロセスのすべてのスレッドの PercentProcessorTime 値の合計が得られます。問題は、複数のコアがある場合、この合計が 100 を超える可能性があることですが、このプロパティは 100 で最大になります。したがって、このプロセスのすべてのスレッドの合計が 100 未満である限り、プロセスのマシンのコア数による PercentProcessorTime プロパティ。
PowerShell の PerfMon からこの値を取得する場合は、Get-Counter "\Process(SqlServr)\% Processor Time"
. これは、0 から (CoreCount * 100) までの数値を返します。
この値を自分で計算したい場合、Win32_PerfRawData_PerfProc_Process プロバイダーの PercentProcessorTime プロパティは、このプロセスが使用した CPU 時間を返します。そのため、s1 と s2 と呼ぶ 2 つのスナップショットを作成する必要があります。次に、(s2.PercentProcessorTime - s1.PercentProcessorTime) / (s2.TimeStamp_Sys100NS - s1.TimeStamp_Sys100NS) を実行します。
そして最後の言葉です。お役に立てば幸いです。