WMI 높은 CPU 사용량 문제 해결

이 문서에서는 모든 Windows 운영 체제에서 WMI(Windows Management Instrumentation) 높은 CPU 사용 문제를 진단하는 방법을 설명합니다.

문제 식별

대부분의 시나리오에서 CPU는 WmiPrvse.exe 프로세스에서 사용되며 WMI 서비스(Winmgmt)를 호스트하는 svchost.exe 높은 CPU 사용량을 사용하는 몇 가지 인스턴스가 있습니다.

작업 관리자의 프로세스 창 또는 세부 정보 창을 검토하여 정확한 프로세스를 식별합니다.

프로세스가 WmiPrvse.exe 또는 svchost.exe (WMI 서비스 Winmgmt 호스팅)인지 확인하고 프로세스 ID를 식별합니다.

참고

작업 관리자에서 모든 프로세스의 프로세스 ID를 보려면 PID 열을 수동으로 추가해야 할 수 있습니다.

다음은 예입니다. 작업 관리자>세부 정보로 이동한 다음 이름을 기준으로 정렬하고 높은 CPU 사용량을 사용하는 WmiPrvse.exe 프로세스를 찾습니다. PID(프로세스 ID)를 기록해 둡니다.

이 스크린샷은 WMI 공급자 호스트 ( WmiPrvse.exe 프로세스)의 여러 인스턴스를 활성 및 CPU 사용률로 보여 줍니다.

스크린샷은 작업 관리자를 통한 프로세스를 보여줍니다.

이 스크린샷은 서비스 호스트: Windows 관리 계측(svchost.exe Winmgmt 서비스 호스팅) 및 해당 CPU 사용률을 보여 줍니다.

스크린샷은 작업 관리자를 통해 세부 정보를 보여줍니다.

작업 관리자>서비스로 이동하여 이름을 기준으로 정렬하고 Winmgmt 서비스를 찾습니다. PID를 기록해 둡다. 서비스를 마우스 오른쪽 단추로 클릭하고 세부 정보로 이동을 선택하여 다음과 같이 svchost.exe 프로세스를 찾습니다.

스크린샷은 작업 관리자를 통한 서비스를 보여줍니다.

이 예제에서는 세WmiPrvse.exe 인스턴스 중에서 CPU 사용량의 약 25%를 사용하는 PID 3648이 있습니다. Winmgmt는 PID 2752를 사용하여svchost.exe 프로세스에 따라 호스트됩니다.

CPU 사용량 이해

여기에는 주로 전체 CPU 사용량 및 식별된 PID를 관찰하는 작업이 포함됩니다. CPU 사용량의 시기, 방법 및 빈도를 유의해야 합니다.

특정 시간 동안 CPU 사용량이 높은지 파악하여 상황을 평가합니다. 활성 상태인 특정 작업 또는 서비스 실행, 모니터링 애플리케이션 실행 또는 WmiPrvse.exe 또는 Winmgmt 높은 CPU로 이어지는 스크립트 실행과 같은 활동이 있는지 확인합니다.

CPU 사용량이 일관되거나 일관되지 않거나, 임의적이거나, 산발적이거나, 정기적인 급증을 의미하는 패턴이 있는지 이해합니다.

CPU 사용 빈도를 식별합니다. 프로덕션 시간, 업무 외 시간 또는 하루 중 임의의 시간에만 발생하는지 확인합니다. 또한 사용자 로그인 또는 로그아웃과 같은 특정 활동 중에 발생할 수 있습니다.

작업 관리자를 사용하고 CPU 사용 패턴이 어떻게 표시되는지 시각적으로 기록할 수 있습니다.

다음은 성능 모니터(Perfmon) 도구를 사용하여 식별한 PID로 WmiPrvse.exe 정확한 인스턴스를 식별하는 방법을 보여 주는 예제입니다. 모든 프로세스(WmiPrvse.exe또는svchost.exe 호스팅 WMI 서비스)의 CPU 사용량에 대한 그래픽 보기를 가져올 수도 있습니다.

  1. 관리자 권한 명령 프롬프트를 열고 Perfmon을 입력합니다.

  2. 왼쪽 창에서 성능 모니터 선택하고 오른쪽 창에서 더하기 기호(+)를 선택하여 카운터 추가 창을 엽니다.

  3. 프로세스를 확장하고 ID 프로세스를 선택합니다. 모든 WmiPrvse# 인스턴스를 선택한 다음, 확인추가>를 선택합니다.

    ID 프로세스 카운터를 추가하는 방법을 보여 줍니다.

    ID 프로세스 카운터의 세부 정보를 보여 줍니다.

  4. 카운터 추가 창에서 프로세스를 확장하고 %Processor Time을 선택합니다. 높은 CPU 사용량을 사용하는 PID와 일치하는 WmiPrvse#을 선택한 다음, 확인추가>를 선택합니다.

    스크린샷은 %Processor Time 카운터를 추가하는 방법을 보여줍니다.

    스크린샷은 %Processor Time 카운터의 세부 정보를 보여줍니다.

  5. "ID 프로세스" 카운터의 경우 마지막, 평균, 최소최대 값은 모두 각 WmiPrvse.exe 프로세스의 PID를 나타냅니다. 높은 CPU 사용량을 사용하는 정확한 instance 확인한 후에는 Delete 키를 눌러 목록에서 나머지 WmiPrvse# 인스턴스 인스턴스를 제거할 수 있습니다.

이 예제에서는 WmiPrvse.exe PID 556에서 높은 CPU 사용량을 사용하고 있으며 성능 모니터 PID 556과 일치하는 WmiPrvse#1입니다.

그런 다음 카운터 %Processor Time of WmiPrvse#1 이 추가되어 이 프로세스의 CPU 사용량에 대한 라이브 그래픽 보기를 볼 수 있습니다. 이 예제에서는 WmiPrvse#1%Processor Time 색이 노란색에서 빨간색으로 변경됩니다.

이 단계는 Wmimgmt 서비스를 호스트하는 svchost.exe높은 CPU 사용량의 경우 성능 모니터 올바른 svchost#을 찾는 것과 동일합니다.

WMI 서비스를 호스트하는 svchost.exe 프로세스가 높은 CPU 사용량을 유발하고 WMI가 문제에 기여하고 있다고 의심되는 경우 다음 명령을 실행하여 svchost.exe 프로세스의 PID가 WMI 서비스를 호스팅하는지 확인할 수 있습니다.

tasklist /svc /fi "Services eq Winmgmt"

svchost.exe 프로세스에 여러 서비스가 포함된 경우 다음 단계에 따라 WMI 서비스를 자체 svchost.exe 프로세스로 분리할 수 있습니다.

  1. 관리자 권한으로 관리자 권한 명령 프롬프트를 엽니다.

  2. 다음 명령을 실행합니다.

    sc config Winmgmt type= own
    
  3. WMI 서비스를 다시 시작합니다.

서비스를 다시 시작한 후 명령을 실행 Tasklist /svc 하여 Winmgmt 서비스가 자체svchost.exe프로세스에서 실행되는 경우 검사 수 있습니다.

문제를 해결하거나 더 이상 서비스가 자체 svchost.exe 프로세스에 있을 필요가 없으면 공유 svchost.exe 프로세스에 다시 배치할 수 있습니다. 명령 프롬프트에서 다음 명령을 실행한 다음 WMI 서비스를 다시 시작하여 작업을 수행할 수 있습니다.

sc config Winmgmt type= share

WmiPrvse.exe 진단

지금까지 높은 CPU 사용량을 사용하는 WmiPrvse.exe 정확한 PID만 있습니다. 다음으로, 이 PID에 대해 가능한 한 많은 정보를 수집합니다. 이렇게 하면 상황을 평가하거나 문제를 일으킬 수 있는 항목을 식별하는 데 도움이 됩니다. 다른 리소스 사용에 대한 정보를 수집하거나 식별된 WmiPrvse.exe PID에서 호스트하는 정확한 WMI 공급자(DLL)를 식별합니다.

메모리, 핸들, 스레드 및 사용자 이름과 같은 기타 리소스 사용량

CPU 사용량이 많을 때 메모리, 핸들, 스레드 및 사용자 이름과 같은 다른 리소스 사용량에 대한 정보를 수집합니다. 작업 관리자에서 세부 정보 탭을 사용하고 정확한 PID를 선택한 다음 검토할 수 있습니다.

참고

필요에 따라 열을 추가합니다.

스크린샷은 작업 관리자의 높은 CPU 사용량 서비스를 보여줍니다.

식별된 WmiPrvse.exe PID에서 호스트하는 정확한 WMI 공급자(DLL) 식별

프로세스 Explorer 식별된 PID에서 호스트되는 정확한 공급자를 식별하는 데 도움이 될 수 있습니다. 다음 단계를 따릅니다.

  1. 프로세스 Explorer 관리자 권한으로 실행합니다. 식별된 WmiPrvse.exe PID를 찾고, 해당 속성으로 이동한 다음, WMI 공급자 탭을 선택합니다.

  2. 다음 예제에서 WmiPrvse.exe PID 556이 있으며 호스팅 중인 것으로 확인되었습니다.

    • WMI 공급자: MS_NT_EVENTLOG_PROVIDER
    • 네임 스페이스: root\CIMV2
    • DLL 경로: %systemroot%\system32\wbem\ntevt.dll

    스크린샷은 WmiPrvSE.exe:556 속성을 보여줍니다.

대부분의 경우 둘 이상의 공급자가 로드될 수 있습니다. CPU에서 시간을 소비하여 높은 CPU 문제를 일으키는 공급자일 수 있습니다.

경우에 따라 문제가 간헐적이거나 드물게 발생하는 경우 문제를 일으키는 WmiPrvse.exe 시간이 지남에 따라 종료될 수 있습니다. 문제가 다시 발생하면 새 WmiPrvse.exeinstance 동일한 공급자일 수 있습니다. 이 경우 공급자가 적어지면 다음 cmdlet을 실행하여 해당 공급자를 포함하는 WmiPrvse.exe 프로세스의 현재 PID를 표시합니다.

tasklist /m <Provider DLL>

다음은 예입니다.

tasklist /m ntevt.dll 

스크린샷은 ntevt.dll 파일의 작업 목록 출력을 보여줍니다.

따라서 WmiPrvse.exe 프로세스에서 로드되는 공급자를 이해하고 매번 WmiPrvse.exe 프로세스의 PID를 기록해 두는 것이 중요합니다.

WmiPrvse.exe 로드되어 CPU 사용량이 높은 공급자가 있으면 작업을 처리하는지 이해할 수 있습니다.

작업은 클라이언트 프로세스에서 WMI 서비스에 제출한 다음 적절한 WMI 공급자 프로세스에 할당되는 들어오는 WMI 쿼리일 수 있습니다. 이 예제에서 작업은 공급자에게 MS_NT_EVENTLOG_PROVIDER 제출됩니다. 따라서 다음 단계는 공급자에게 들어오는 쿼리 및 작업을 연구하는 MS_NT_EVENTLOG_PROVIDER 것입니다.

들어오는 쿼리 분석

들어오는 쿼리를 검사하려면 다음이 포함됩니다.

  • 높은 CPU 사용량을 유발하는 WMI 공급자가 처리하는 WMI 쿼리 식별
  • WMI 클래스(es) 쿼리.
  • 연결된 사용자입니다.
  • 쿼리를 시작하는 클라이언트 프로세스입니다.

위의 정보는 공개적으로 사용 가능한 도구 WMIMon 또는 WMI-Activity 운영 로그 및 이벤트 뷰어 사용할 수 있는 WMI-Tracing 사용하여 수집할 수 있습니다.

운영 로그: Microsoft-Windows-WMI-Activity/Operational

들어오는 쿼리는 다음에서 사용할 수 있는 Microsoft-Windows-WMI-Activity/Operational 로그에서 운영 이벤트로 기록됩니다.

> 이벤트 뷰어애플리케이션 및 서비스 로그>Microsoft>Windows>WMI-Activity

여러 가지 유형의 이벤트가 기록됩니다.

높은 CPU를 사용하는 WmiPrvse.exe 프로세스가 수시로 종료되고 로드되는 공급자를 이미 알고 있는 경우 다음 이벤트는 현재 활성 WmiPrvse.exe 프로세스에서 해당 공급자를 호스트하는 데 도움이 될 수 있습니다.

Log Name:      Microsoft-Windows-WMI-Activity/Operational
Source:        Microsoft-Windows-WMI-Activity
Event ID:      5857
Task Category: None
User:          NETWORK SERVICE
Description:
MS_NT_EVENTLOG_PROVIDER provider started with result code 0x0. HostProcess = wmiprvse.exe; ProcessID = 556; ProviderPath = %systemroot%\system32\wbem\ntevt.dll

WMI 추적을 사용하도록 설정하려면 "분석 및 디버그 로그"를 사용하도록 설정합니다.

이벤트 뷰어보기 분석 및 디버그 로그 보기를> 선택하여 WMI 활동에 대한 디버그추적을 사용하도록 설정합니다.

스크린샷은 이벤트 뷰어 작동을 보여줍니다.

디버그추적 은 기본적으로 사용하지 않도록 설정되며 추적 또는디버그 를 마우스 오른쪽 단추로 클릭한 다음 로그 사용을 선택하여 각 디버그를 수동으로 사용하도록 설정할 수 있습니다.

참고

분석 및 디버그 로그 표시를 사용하도록 설정하면 거의 모든 이벤트 원본에 대한 디버그 및 추적이 가능하고 추가 로깅이 만들어집니다. 따라서 조사가 완료되면 사용하지 않도록 설정해야 하며 더 이상 사용되지 않습니다.

이 추적은 WmiPrvse.exe 프로세스에서 높은 CPU 사용량을 관찰하는 동안 또는 높은 CPU 사용량의 동작을 캡처하여 로그를 클린 유지하고 추적을 더 쉽게 분석할 수 있도록 적당히 크기가 조정되도록 하는 동안 계속 사용할 수 있습니다.

  1. 추적을 마우스 오른쪽 단추로 클릭하고 모든 이벤트를 다른 이름으로 저장...을 선택하여 추적을 내보냅니다.

  2. 형식으로 저장에서 또는 .csv 을 선택합니다.xml.

    참고

    필요에 따라 다른 친숙한 형식을 .EVTX 선택할 수 있습니다.

  3. 추적 파일의 원하는 언어를 선택합니다.

  4. WMI-Activity 운영 이벤트를 검토하고 분석할 수 있도록 원하는 형식으로 별도로 저장하도록 선택할 수 있습니다.

WMI 추적 파일 검토

WMI 추적 내에는 들어오는 WMI 쿼리의 일부인 여러 가지 중요한 작업이 포함되어 있습니다. 작업은 IWbemServices 인터페이스(wbemcli.h)에 설명되어 있습니다.

몇 가지 중요한 작업은 다음과 같습니다.

  • IWbemServices::ExecQuery 메서드(wbemcli.h)
  • IWbemServices::ExecMethod 메서드(wbemcli.h)
  • IWbemServices::ExecQueryAsync 메서드(wbemcli.h)

저장된 WMI-Tracing CSV 파일의 로그 항목 중 하나는 다음과 같습니다.

수준 날짜 및 시간 원본 이벤트 ID 작업 범주 설명
정보 05-05-23 14:48 Microsoft-Windows-WMI-Activity 11 없음 CorrelationId = {345E5566-0000-0000-0000-68343241D901}; GroupOperationId = 30693; OperationId = 30694; Operation = Start IWbemServices::ExecQuery - root\cimv2 : select * from Win32_Product; ClientMachine = 21H2W10M; User = CONTOSO\<UserName>; ClientProcessId = 5484; NamespaceName = 133277000000783520

XML 형식의 유사한 이벤트는 다음과 같습니다.

 <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"> 
<System> 
<Provider Name="Microsoft-Windows-WMI-Activity" Guid="{1418ef04-b0b4-4623-bf7e-d74ab47bbdaa}"/> 
<EventID>11</EventID> 
<Version>0</Version> 
<Level>4</Level> 
<Task>0</Task> 
<Opcode>0</Opcode> 
<Keywords>0x8000000000000000</Keywords> 
<TimeCreated SystemTime="2023-05-05T13:09:18.7442455Z"/> 
<EventRecordID>112</EventRecordID> 
<Correlation ActivityID="{eddc1bfb-0000-0000-0000-18b6cabf5949}"/> 
<Execution ProcessID="2752" ThreadID="4132"/> 
<Channel>Microsoft-Windows-WMI-Activity/Trace</Channel> 
<Computer>21H2W10M.contoso.com</Computer> 
<Security UserID="S-1-5-18"/> 
</System> 
<UserData> 
<Operation_New xmlns="http://manifests.microsoft.com/win/2006/windows/WMI"> 
<CorrelationId>{345E5566-0000-0000-0000-67343241D901}</CorrelationId> 
<GroupOperationId>28089</GroupOperationId> 
<OperationId>28090</OperationId> 
<Operation>Start IWbemServices::ExecQuery - root\cimv2 : select * from Win32_Product</Operation> 
<ClientMachine>21H2W10M</ClientMachine> 
<ClientMachineFQDN>21H2W10M.contoso.com</ClientMachineFQDN> 
<User>CONTOSO\<UserName></User> 
<ClientProcessId>5484</ClientProcessId> 
<ClientProcessCreationTime>133277000000783520</ClientProcessCreationTime> 
<NamespaceName>\\.\root\cimv2</NamespaceName> 
<IsLocal>true</IsLocal> 
</Operation_New> 
</UserData> 
<RenderingInfo Culture="en-US"> 
<Message>CorrelationId = {345E5566-0000-0000-0000-67343241D901}; GroupOperationId = 28089; OperationId = 28090; Operation = Start IWbemServices::ExecQuery - root\cimv2 : select * from Win32_Product; ClientMachine = 21H2W10M; User = CONTOSO\<UserName>; ClientProcessId = 5484; NamespaceName = 133277000000783520</Message> 
<Level>Information</Level> 
<Task/> 
<Opcode>Info</Opcode> 
<Channel/> 
<Provider>Microsoft-Windows-WMI-Activity</Provider> 
<Keywords/> 
</RenderingInfo> 
</Event> 

위의 샘플 작업 출력에서 다음 정보를 얻고 이해할 수 있습니다.

  • 쿼리가 시작됨: 2023-05-05 13:09:18
  • 컴퓨터: 21H2W10M,
  • 클라이언트 PID에서: 5484
  • 작업 ID: 28089
  • 쿼리: select * from Win32_Product
  • 네임 스페이스: \\.\root\cimv2
  • 작업: IWbemServices::ExecQuery

다른 로그는 다음과 같습니다.

수준 날짜 및 시간 원본 이벤트 ID 작업 범주 설명
정보 05-05-23 14:47 Microsoft-Windows-WMI-Activity 12 없음 ProviderInfo for GroupOperationId = 30641; Operation = Provider::CreateInstanceEnum - MS_NT_EVENTLOG_PROVIDER : Win32_NTLogEvent; HostID = 556; ProviderName = MS_NT_EVENTLOG_PROVIDER; ProviderGuid = {FD4F53E0-65DC-11d1-AB64-00C04FD9159E}; 경로 = %systemroot%\system32\wbem\ntevt.dll

XML 형식의 동일한 이벤트:

<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"> 
<System> 
<Provider Name="Microsoft-Windows-WMI-Activity" Guid="{1418ef04-b0b4-4623-bf7e-d74ab47bbdaa}"/> 
<EventID>12</EventID> 
<Version>0</Version> 
<Level>4</Level> 
<Task>0</Task> 
<Opcode>0</Opcode> 
<Keywords>0x8000000000000000</Keywords> 
<TimeCreated SystemTime="2023-05-05T13:09:18.8438242Z"/> 
<EventRecordID>120</EventRecordID> 
<Correlation ActivityID="{2a353ead-0000-0000-0000-256f9de5fabd}"/> 
<Execution ProcessID="2752" ThreadID="4348"/> 
<Channel>Microsoft-Windows-WMI-Activity/Trace</Channel> 
<Computer>21H2W10M.contoso.com</Computer> 
<Security UserID="S-1-5-21-0000000000-0000000000-00000000-1103"/> 
</System> 
<UserData> 
<Operation_Provider_Info_New xmlns="http://manifests.microsoft.com/win/2006/windows/WMI"> 
<GroupOperationId>28096</GroupOperationId> 
<Operation>Provider::CreateInstanceEnum - MS_NT_EVENTLOG_PROVIDER : Win32_NTLogEvent</Operation> 
<HostId>556</HostId> 
<ProviderName>MS_NT_EVENTLOG_PROVIDER</ProviderName> 
<ProviderGuid>{FD4F53E0-65DC-11d1-AB64-00C04FD9159E}</ProviderGuid> 
<Path>%systemroot%\system32\wbem\ntevt.dll</Path> 
</Operation_Provider_Info_New> 
</UserData> 
<RenderingInfo Culture="en-US"> 
<Message>ProviderInfo for GroupOperationId = 28096; Operation = Provider::CreateInstanceEnum - MS_NT_EVENTLOG_PROVIDER : Win32_NTLogEvent; HostID = 556; ProviderName = MS_NT_EVENTLOG_PROVIDER; ProviderGuid = {FD4F53E0-65DC-11d1-AB64-00C04FD9159E}; Path = %systemroot%\system32\wbem\ntevt.dll</Message> 
<Level>Information</Level> 
<Task/> 
<Opcode>Info</Opcode> 
<Channel/> 
<Provider>Microsoft-Windows-WMI-Activity</Provider> 
<Keywords/> 
</RenderingInfo> 
</Event> 

두 번째 예제의 작업 출력에서 다음 정보를 얻고 이해할 수 있습니다.

  • Operation CreateInstanceEnum은 SID를 사용하여 사용자를 대신하여 시작됩니다. UserID="S-1-5-21-00000000000-000000000000-00000000-1103"
  • 2023-05-05 13:09
  • 정확한 작업: Provider::CreateInstanceEnum - MS_NT_EVENTLOG_PROVIDER : Win32_NTLogEvent
  • 호스트 ID: 556
  • 공급자 이름: MS_NT_EVENTLOG_PROVIDER
  • 공급자 경로: %systemroot%\system32\wbem\ntevt.dll

높은 CPU 사용량을 유발하는 클라이언트 PID 찾기

이 로그 파일을 검토하는 방법은 높은 CPU 사용량을 사용하는 식별된 WmiPrvse.exe PID와 관련된 작업을 나열하고, 들어오는 쿼리를 이해하고, 누가 시작했는지(클라이언트 프로세스)하는 것입니다.

위에서 설명한 예제에서는 높은 CPU 사용량을 유발하는 PID 552입니다.

로그 출력의 두 번째 예제에서 CreateInstanceEnum 작업은 특정 WMI 클래스 Win32_NTLogEvent에 대해 시작됩니다.

자세한 내용은 WMI 클래스와 연결된 WMI 공급자 세부 정보를 포함하는 Win32_NTLogEvent 참조하세요.

이제 CPU 사용량이 많은 WmiPrvse.exe 호스트된 정확한 WMI 공급자(MS_NT_EVENTLOG_PROVIDER)와 일부 클라이언트 프로세스에서 쿼리되는 호스트 ID(552) 및 WMI 클래스(Win32_NTLogEvent)를 알 수 있습니다.

추적 파일을 검토하는 데 사용하는 도구에 따라 PID 552 또는 호스트 ID 552 또는ntevt.dll관련된 Win32_NTLogEvent 작업만 검토하거나 WmiPrvse.exe 데 필요한 필터를 적용할 수 있습니다.

필터에서 "Win32_NTLogEvent"을 포함하는 줄 또는 작업만 표시하면 결과는 다음과 같습니다.

수준 원본 이벤트 ID 설명
정보 Microsoft-Windows-WMI-Activity 11 CorrelationId = {345E5566-0000-0000-0000-68343241D901}; GroupOperationId = 30641; OperationId = 30642; Operation = Start IWbemServices::CreateInstanceEnum - root\cimv2 : Win32_NTLogEvent; ClientMachine = 21H2W10M; User = CONTOSO\<UserName>; ClientProcessId = 5484; NamespaceName = 133277000000783520
정보 Microsoft-Windows-WMI-Activity 12 ProviderInfo for GroupOperationId = 30641; Operation = Provider::CreateInstanceEnum - MS_NT_EVENTLOG_PROVIDER : Win32_NTLogEvent; HostID = 556; ProviderName = MS_NT_EVENTLOG_PROVIDER; ProviderGuid = {FD4F53E0-65DC-11d1-AB64-00C04FD9159E}; 경로 = %systemroot%\system32\wbem\ntevt.dll
정보 Microsoft-Windows-WMI-Activity 11 CorrelationId = {345E5566-0000-0000-0000-68343241D901}; GroupOperationId = 30697; OperationId = 30698; Operation = Start IWbemServices::CreateInstanceEnum - root\cimv2 : Win32_NTLogEvent; ClientMachine = 21H2W10M; User = CONTOSO\<UserName>; ClientProcessId = 5484; NamespaceName = 133277000000783520
정보 Microsoft-Windows-WMI-Activity 12 ProviderInfo for GroupOperationId = 30697; Operation = Provider::CreateInstanceEnum - MS_NT_EVENTLOG_PROVIDER : Win32_NTLogEvent; HostID = 556; ProviderName = MS_NT_EVENTLOG_PROVIDER; ProviderGuid = {FD4F53E0-65DC-11d1-AB64-00C04FD9159E}; 경로 = %systemroot%\system32\wbem\ntevt.dll

위의 작업에서 다음과 같은 추가 정보를 얻을 수 있습니다.

  • Timestamp
  • 작업 ID: 30642;
  • 정확한 연산 = Start IWbemServices::CreateInstanceEnum - root\cimv2 : Win32_NTLogEvent;
  • 클라이언트 컴퓨터 = 21H2W10M
  • User = CONTOSO\<UserName>
  • 쿼리를 시작한 클라이언트의 PID: 5484

마침내 에 대한 쿼리 Win32_NTLogEvent를 시작하는 클라이언트 프로세스 5484의 PID가 있습니다. 이는 공급자 MS_NT_EVENTLOG_PROVIDER 가 처리하고 WmiPrvse.exe PID 552에서 호스트되며, 이로 인해 높은 CPU 사용량이 발생합니다.

클라이언트 PID의 범위를 좁히면 다음 도구 중 하나를 사용하여 프로세스 이름을 찾습니다.

WmiMon에 대한 자세한 정보

WMImon.exe 시스템 이벤트의 추적 및 모니터링과 WMI 서비스의 리소스 사용을 허용하는 강력한 모니터링 도구입니다.

다른 프로세스에서 수행한 WMI 호출 및 쿼리를 식별하고 쿼리 빈도, 쿼리에 사용되는 사용자 계정 및 요청된 정보에 대한 정보를 제공하는 중요한 기능을 제공합니다.

이 데이터는 성능 문제를 해결해야 하는 시스템 관리자에게 유용할 수 있습니다.

이 데이터를 수집하고 분석하려면 단계별 지침을 따를 수 있습니다.

  1. 위에서 설명한 방법을 사용하여 CPU 사용량을 사용하는 WmiPrvSE.exe PID를 식별합니다.
  2. GitHub - luctalpe/WMIMon에서 WMIMon.exe 도구를 다운로드합니다. 이 도구는 Windows에서 WMI 활동을 모니터링하는 것입니다.
  3. 컴퓨터의 폴더에 WMIMon_Binaries.zip 파일의 내용을 추출합니다.
  4. 관리자 권한으로 명령 프롬프트를 열고 WMIMon 파일을 추출한 폴더로 이동합니다.
  5. 명령 프롬프트에 를 입력 WMIMon.exe 하고 Enter 키를 눌러 WMIMon.exe 파일을 실행합니다.
  6. 이제 WMIMon은 1단계에서 식별된 WMI 호출을 포함하여 시스템의 프로세스에서 수행한 WMI 호출을 모니터링하기 시작합니다.
  7. WMIMon은 클라이언트 프로세스 ID, 작업에서 호출한 WMI 네임스페이스, WMI 클래스 이름 및 요청을 만드는 데 사용되는 사용자 계정과 같은 정보를 표시합니다.
  8. WMIMon의 출력을 분석하여 WMI 호출이 빈번하고 CPU 사용량이 많을 수 있는 프로세스를 식별합니다.

이러한 단계에 따라 WMIMon.exe 사용하여 시스템에서 WMI 활동을 모니터링하고 과도한 WMI 사용으로 인한 성능 또는 보안 문제를 식별할 수 있습니다.

다음은 예입니다.

스크린샷은 WMIMon에서 캡처한 데이터를 보여줍니다.

참고

명령 프롬프트에서 명령을 실행 WMIMon.exe > Data.txt 하여 WMIMon에서 캡처한 데이터를 텍스트 파일로 내보낼 수 있습니다. 데이터 캡처를 중지하려면 CtrlC를 + 누릅니다.

특정 클라이언트 PID, 애플리케이션 또는 EXE의 축소가 불가능한 까다로운 상황이 있을 수 있습니다. 이러한 경우 사용자 이름 또는 연결된 컴퓨터와 같은 일반적인 엔터티를 고려하는 것이 유용할 수 있습니다.

즉, 쿼리를 시작하는 사용자가 서비스 계정인지 또는 특정 애플리케이션과 연결되어 있는지 이해합니다.

기타 솔루션

피의자를 완료한 후에는 서비스를 일시적으로 사용하지 않도록 설정하거나 연결된 애플리케이션을 제거하고 높은 CPU 사용량 문제가 해결되었는지 확인하는 것이 좋습니다.

다음은 사용하지 않도록 설정하면 관찰의 유효성을 검사할 수 있는 몇 가지 시나리오입니다.

  • 애플리케이션 및 서비스 모니터링
  • 시스템 센터 구성 관리자(SCCM) (policyhost.exe 또는 Monitoringhost.exe)
  • WMI 쿼리를 포함하는 스크립트 실행Powershell.exe
  • 타사 애플리케이션

데이터 수집

Microsoft 지원의 지원이 필요한 경우 사용자 환경 문제에 대해 TSS를 사용하여 정보 수집에 설명된 단계에 따라 정보를 수집하는 것이 좋습니다.

WMI-Collect 도구를 사용하여 정보를 수집할 수도 있습니다. 그 단계는 다음과 같습니다.

  1. WMI-Collect.zip 다운로드하고 C:\temp와 같은 폴더에서 추출합니다.

  2. 관리자 권한 PowerShell 명령 프롬프트에서 스크립트가 저장된 폴더에서 WMI-Collect.ps1 스크립트를 실행합니다. 예를 들면

    C:\temp\WMI-Collect.ps1 -Logs -Trace -Activity -Kernel -WPR -PerfMonWMIPrvSE
    

    참고

    • "Enter 키를 눌러 캡처를 중지합니다."라는 메시지와 함께 PowerShell 명령 프롬프트를 열어 두고 WmiPrvse.exe 프로세스 또는 WMI 서비스 높은 CPU 사용 문제가 재현되었는지 확인합니다.
    • 추적을 1분 이상 사용하도록 설정하지 마세요.
  3. Enter 키를 눌러 추적을 중지 합니다.

스크립트는 모든 추적의 결과와 진단 정보를 포함하는 하위 폴더를 만듭니다. 폴더를 압축합니다. 지원 사례가 만들어지면 이 파일을 분석을 위해 보안 작업 영역에 업로드할 수 있습니다.