- 11/16/2020
- 3 minutes to read
-
- D
- v
この記事は、WmiPrvSE.EXEのCPUの使用が多い問題の対処方法について説明しています。exeプロセスを一定間隔で実行します。
元の製品バージョンです。 Windows Server 2019、Windows Server 2016、Windows Server 2012 R2、Window 10 – すべてのエディション
元のKB番号:4483874
症状
Windowsベースのコンピューターを使用していると、Windows Management Instrumentation (WMI) Provider Host (WmiPrvSE.) に気づかされることがあります。
この問題が発生した場合、タスク マネージャーを使用して、高い CPU を消費している WmiPrvSE.exe プロセスのプロセス識別子 (PID) を識別します。 次に、昇格したコマンドプロンプトを開き、次のコマンドを実行します:
tasklist /m wmiperfclass.dll
このモジュールがロードされているWmiPrvSE.exeプロセスのリストが表示されます。 通常、1つのプロセスだけがリストアップされます。 ただし、32 ビットと 64 ビットの両方のクライアントがある場合は、2 つのプロセスが表示されることがあります。 これは出力例です。
Image Name PID Modules
===================
WmiPrvSE.exe 2140 WmiPerfClass.dll
リストされたプロセスの PID と Task Manager で見つけたプロセスが一致する場合、この記事で説明されている問題が発生している可能性が高いでしょう。
原因
この問題は、次のいずれかの要因で発生します。
1つまたは複数のプロセスが多数のハンドルを使用している
すべてのハンドルは、カーネル構造体の \BaseNamedObjects に格納されています。 WMIPerfClassプロバイダーは、ジョブオブジェクトに関連するパフォーマンスクラスを作成するときにこの構造体をスキャンする必要があります。
ハンドルの数が多いためにこの構造体が肥大化すると、操作でCPU使用率が高く、通常より時間がかかります。
この状態については、プロセスが約30,000以上のハンドルを使用している場合、またはシステム上のハンドルの合計数が50,000を超える場合に影響が予想されます。
サポート対象のOSバージョンに対して2020年3月にリリースされるアップデートにはいくつかのパフォーマンスの最適化とこの問題のいくつかの亜種への対処が含まれています。 Windowsバージョンに適用される更新プログラムの詳細については、Windows更新プログラムの履歴を参照してください。
システム上で実行中の1つ以上のプロセスが大量のメモリを使用している
これは、実行中の各プロセスのメモリ領域を照会する必要があるため、プロセス パフォーマンス クラスの作成に影響します。 プロセスによって使用されているメモリは断片化されている可能性があり、このため、この操作はより多くのリソースを必要とします。 これは、WMIPerfClass が “Costly” パフォーマンス カウンターも照会するために起こります。
次の PowerShell コマンドを実行すると、Costly パフォーマンス カウンターが有効になっているかどうかを確認できます:
(gwmi -query 'select * from meta_class').Name | ? { $_ -match "costly"}
コマンドが結果を返す場合、これは有効になっている Costly パフォーマンス カウンターを示します。 たとえば、次のようになります。
Win32_PerfFormattedData_PerfProc_FullImage_Costly
Win32_PerfRawData_PerfProc_FullImage_Costly
Win32_PerfFormattedData_PerfProc_Image_Costly
Win32_PerfRawData_PerfProc_Image_Costly
Win32_PerfFormattedData_PerfProc_ProcessAddressSpace_Costly
Win32_PerfRawData_PerfProc_ProcessAddressSpace_Costly
Win32_PerfFormattedData_PerfProc_ThreadDetails_Costly
Win32_PerfRawData_PerfProc_ThreadDetails_Costly
回避策
この問題を解決するために。 多数のハンドルまたは大量のメモリを使用しているプロセスを特定します。そのプロセスには、メモリリークまたはハンドルリークの問題がある可能性があります。 回避策として、プロセスを再起動します。
Windowsサーバー2016またはそれ以降のバージョンのWindowsを使用している場合、デフォルトでは、以下の累積更新からCostlyパフォーマンスカウンターが無効になります:
- Windows Server 2016 / Windows 10 バージョン1607 (RS1)
October 18, 2018-KB4462928 (OS Build 14393.B).2580) - Windows 10 バージョン 1703 (RS2)
2018 年 7 月 24 日-KB4338827 (OS Build 15063.1235) - Windows 10 バージョン 1709 (RS3)
2018 年 7 月 24 日-KB4338817 (OS Build 16299.1235) - Windows 10 バージョン 1703 (RS2)
2018 年 7 月 24 日-KB4462927 (OS Build 16299.579) - Windows 10 バージョン 1803(RS4)
2018/7/16-KB4345421(OS Build 17134.167)
注意事項
累積更新プログラムのインストール後、Costlyパフォーマンスカウンターに関連するクラスが必要な場合、次のレジストリサブキーで値Enable Costly Providersを1(DWORD)に設定すると再び使用可能になります:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Wbem
プロセスが大量のハンドルを使っているときの動作には累積更新プログラムは影響がありません。
この問題は、クライアントがパフォーマンス クラスをクエリしているときに発生します。 これは通常、監視アプリケーションです。
回避策として、監視アプリケーションを無効にしてパフォーマンス クラスの作成を防ぐこともできます。
その他の情報
WMIは、いくつかのパフォーマンス クラスを提供します。 詳細については、パフォーマンス カウンター クラスを参照してください。
これらのクラスは、システムで利用可能なパフォーマンス カウンターに基づいて動的に作成されます。 すべてのクラスは同時に作成され、クエリされるクラスだけではありません。
WMIPerfClass は、WMI クライアントがこれらのクラスのいずれかをクエリするか、利用可能なクラスを列挙するときに、これらのクラスの作成を処理するモジュールです。
パフォーマンス クラスを作成するということは、WMIPerfClass.dll モジュールが WmiPrvSE.exe プロセス内にロードされ、関連コードを実行しなければならないことを意味します。