Windows で定期的に WMIPRVSE.EXE プロセスによる高い CPU 使用率

適用対象: Windows Server, version 1903Windows Server 2019, all versionsWindows Server 2016

現象


Windows ベースのコンピューターを使用すると、Windows Management Instrumentation (WMI) プロバイダー ホスト (WmiPrvSE.exe) プロセスが 15 分から 20 分ごとに数分間、高い CPU 容量 (100% 近く) を使用していることがわかります。

問題が発生したら、タスク マネージャーを使用して、高い CPU を消費している WMIPRVSE.EXE プロセスのプロセス識別子 (PID) を識別します。 次に、昇格したコマンド プロンプトを開き、次のコマンドを実行します。 

tasklist /m wmiperfclass.dll

このモジュールがロードされた WMIPRVSE.EXE プロセスのリストが表示されます。 通常、1 つのプロセスだけがリストされます。 ただし、32 ビットと 64 ビットの両方のクライアントがある場合は、2 つのプロセスが表示されることがあります。これは、次のような出力です。 

リストされたプロセスの PID がタスク マネージャーで見つかったものと一致している場合は、この記事で説明する問題が発生する可能性が非常に高くなります。

原因


この問題は、次のいずれかの原因によって発生する可能性があります。

1 つ以上のプロセスが多数のハンドルを使用している

すべてのハンドルは、カーネル構造体 \BaseNamedObjects に格納されます。 WMIPerfClass プロバイダーは、Job オブジェクトに関連するパフォーマンスクラスを作成するときに、この構造体をスキャンする必要があります。

ハンドル数が多いためにこの構造体が大量の処理を経ている場合は、処理の CPU 使用率が高くなり、通常よりも時間がかかります。

プロセスが約 30,000 を超えるハンドルを使用している場合、またはシステム上のハンドルの総数が 50,000 を超えている場合は、この条件に影響を与える可能性があります。

システムで実行中の 1 つ以上のプロセスが大量のメモリを使用している

実行中の各プロセスのメモリ領域を照会する必要があるため、これはプロセス パフォーマンス クラスの作成に影響します。 プロセスによって使用されるメモリは断片化されている可能性があるため、この操作はより多くのリソースを消費します。 これは、WMIPerfClass が「Costly」パフォーマンス カウンターもクエリしているために発生します。

次の PowerShell コマンドを実行して、Costly パフォーマンス カウンターが有効になっているかどうかを確認できます。

‎ (gwmi -query 'select * from meta_class').Name | ? { $_ -match "costly"}

コマンドが結果を返す場合、これは有効になっている Costly パフォーマンス カウンターを示します。 例:

回避策


問題を修正するには、大量のハンドルまたは大量のメモリを使用しているプロセスを識別します。プロセスにメモリ リークまたはハンドル リークの問題がある可能性があります。

回避策として、プロセスを再起動します。

Windows Server 2016 以降のバージョンの Windows を使用している場合、既定では、Costly パフォーマンス カウンターは次の累積的な更新から無効になっています。

注: 累積的な更新プログラムがインストールされた後、Costly パフォーマンス カウンターに関連するクラスが必要な場合は、次のレジストリ サブキーの値 Enable Costly Providers1 (DWORD) に設定して、それらを再度利用できるようにします。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Wbem

注: プロセスが多数のハンドルを使用している場合、累積的な更新プログラムは動作に影響しません。

この問題は、クライアントがパフォーマンス クラスを照会している場合に発生します。 通常、これは監視アプリケーションです。

回避策として、監視アプリケーションを無効にして、パフォーマンス クラスの作成を防ぐこともできます。

詳細情報


WMI には、いくつかのパフォーマンス クラスが用意されています。 詳細については、「パフォーマンス カウンター クラス」を参照してください。

これらのクラスは、システムで使用可能なパフォーマンス カウンターに動的に基づいて作成されます。 照会されているクラスだけでなく、すべてのクラスが同時に作成されます。

WMIPerfClass は、WMI クライアントがこれらのクラスのいずれかを照会したり、使用可能なクラスを列挙したりするときに、これらのクラスの作成を処理するモジュールです。

これらのパフォーマンス クラスは、15 ~ 20 分後に無効にされるキャッシュに格納されます。 ‎キャッシュが無効になったらすぐに、クライアントが要求する場合は、パフォーマンス クラスを再度作成する必要があります。

パフォーマンス クラスを作成することは、WMIPerfClass.dll モジュールを WMIPRVSE.EXE プロセス内にロードし、関連するコードを実行する必要があることを意味します。