排查 WMI CPU 使用率过高问题 您所在的位置:网站首页 VM更新显示详细信息 排查 WMI CPU 使用率过高问题

排查 WMI CPU 使用率过高问题

2023-06-02 13:04| 来源: 网络整理| 查看: 265

排查 WMI CPU 使用率过高问题 项目 06/01/2023

本文介绍如何在任何 Windows 操作系统上诊断 Windows Management Instrumentation (WMI) CPU 使用率过高的问题。

确定问题

在大多数情况下, WmiPrvse.exe 进程会占用 CPU,在少数情况下, svchost.exe 托管 WMI 服务 (Winmgmt) 占用 CPU 使用率较高。

查看任务管理器的“进程”窗格或“详细信息”窗格,以确定确切的进程

确定托管 WMI 服务 Winmgmt ) (进程 是WmiPrvse.exe还是svchost.exe,并确定进程 ID。

注意

可能需要手动添加 PID 列才能查看任务管理器中所有进程的进程 ID。

下面是一个示例。 转到 “任务管理器>详细信息”,然后按 名称 排序,找到消耗 CPU 使用率较高的 WmiPrvse.exe 进程。 记下 PID) (进程 ID。

此屏幕截图显示了 WMI 提供程序主机 的多个实例, (WmiPrvse.exe 进程) 为活动状态及其 CPU 使用率。

此屏幕截图显示托管 Winmgmt 服务) 的 Windows Management Instrumentation (svchost.exe及其 CPU 使用率。

转到 “任务管理器>服务”,按 名称排序,并找到 Winmgmt 服务。 记下 PID。 右键单击服务并选择“ 转到详细信息 ”,找到 svchost.exe 进程,如下所示:

在示例中,在三 个WmiPrvse.exe 实例中,PID 3648 位于其中,它占用了大约 25% 的 CPU 使用率。 Winmgmt 托管在 PID 为 2752 的svchost.exe 进程下。

了解 CPU 消耗

这主要涉及观察总体 CPU 消耗和识别的 PID。 请务必注意 CPU 消耗的时间、方式和频率。

通过了解特定时间的 CPU 消耗是否较高来评估情况。 检查是否存在任何活动,例如运行特定任务或服务,运行监视应用程序,或运行导致 WmiPrvse.exe 或 Winmgmt CPU 过高的脚本。

了解是否存在任何模式,这意味着 CPU 使用率是一致的、不一致的、随机的、偶发的,或者有规律的峰值。

确定 CPU 消耗的频率。 检查是否仅在生产时间、非营业时间或一天中的随机时间发生。 在用户登录或注销等特定活动期间,也可能发生此问题。

可以使用任务管理器并直观地记下 CPU 使用模式。

下面的示例演示如何使用 性能监视器 (Perfmon) 工具通过标识的 PID 来标识WmiPrvse.exe的确切实例。 还可以获取托管 WMI 服务) 的任何进程的 CPU 消耗 (WmiPrvse.exe 或 svchost.exe 的图形视图。

打开提升的命令提示符,并输入 Perfmon。

在左窗格中选择“性能监视器”,然后选择右窗格中的加号 (+) 以打开“添加计数器”窗口。

展开 “进程 ”,然后选择“ ID 进程”。 选择所有 WmiPrvse# 实例,然后选择 “添加>确定”。

在 “添加计数器” 窗口中,展开“ 进程 ”并选择“ 处理器时间百分比”。 选择与消耗高 CPU 使用率的 PID 匹配的 WmiPrvse# ,然后选择“ 添加>确定”。

对于“ID 进程”计数器, Last、 Average、 Minimum 和 Maximum 都表示相应 WmiPrvse.exe 进程的 PID。 确定占用高 CPU 使用率的确切实例后,可以通过按 Delete 从列表中删除 WmiPrvse# 实例的剩余实例。

在本示例中,请注意,WmiPrvse.exe PID 556 占用了较高的 CPU 使用率,而 WmiPrvse#1 与 性能监视器 中的 PID 556 匹配。

然后,添加计数器 %Processor Time of WmiPrvse#1 ,以查看此进程的 CPU 使用情况的实时图形视图。 在此示例中,WmiPrvse#1 的 %Processor Time 颜色从黄色更改为红色。

在托管 Wmimgmt 服务svchost.exeCPU 使用率较高的情况下,在 性能监视器 中查找正确的 svchost# 的步骤相同。

如果观察到托管 WMI 服务的 svchost.exe 进程导致 CPU 使用率过高,并怀疑 WMI 导致了此问题,则可以通过运行以下命令来确认 svchost.exe 进程的 PID 是否托管 WMI 服务:

tasklist /svc /fi "Services eq Winmgmt"

如果 svchost.exe 进程包含多个服务,则可以按照以下步骤将 WMI 服务拆分为自己的 svchost.exe 进程:

使用提升的权限打开提升的命令提示符。

运行以下命令:

sc config Winmgmt type= own

重启 WMI 服务。

重新启动服务后,可以运行 Tasklist /svc 命令来检查 Winmgmt 服务是否在其自己的svchost.exe进程中运行。

解决问题或不再需要服务处于自己的 svchost.exe 进程中后,可以将其放回共享 svchost.exe 进程中。 可以通过从命令提示符运行以下命令,然后再次重启 WMI 服务来执行该操作:

sc config Winmgmt type= share 诊断WmiPrvse.exe

到目前为止,你只有消耗高 CPU 使用率的 WmiPrvse.exe 的确切 PID。 接下来,尽可能多地收集有关此 PID 的信息。 这有助于评估情况或确定可能导致问题的内容。 收集有关其他资源使用情况的信息,或标识由标识WmiPrvse.exePID 托管的确切 WMI 提供程序 (DLL) 。

其他资源使用情况,例如内存、句柄、线程和用户名

在 CPU 使用率较高时收集有关其他资源使用情况的信息,例如内存、句柄、线程和用户名。 可以使用任务管理器中的“ 详细信息 ”选项卡,选择确切的 PID 并查看它。

注意

根据需要添加其他列。

标识由标识WmiPrvse.exe PID 托管的确切 WMI 提供程序 (DLL)

进程资源管理器 可以帮助你识别在标识的 PID 中托管的确切提供程序。 请按照下列步骤操作:

以管理员身份运行进程资源管理器。 找到标识 WmiPrvse.exe PID,转到其属性,然后选择“ WMI 提供程序 ”选项卡。

在以下示例中, 找到并找到WmiPrvse.exe PID 556 承载:

WMI 提供程序: MS_NT_EVENTLOG_PROVIDER 命名 空间: root\CIMV2 DLL 路径: %systemroot%\system32\wbem\ntevt.dll

在大多数情况下,可能加载了多个提供程序。 它可能是任何在 CPU 中花费时间的提供程序,导致高 CPU 问题。

有时,如果问题是间歇性的或很少出现的,导致问题的 WmiPrvse.exe 可能会随着时间的推移而终止。 当问题再次出现时,它可能是新的WmiPrvse.exe实例中的同一提供程序 () 。 在这种情况下,一旦记录了提供程序 () ,请运行以下 cmdlet 以显示包含该提供程序的 WmiPrvse.exe 进程的当前 PID:

tasklist /m

下面是一个示例:

tasklist /m ntevt.dll

目前,输出显示 CIMWin32.dll 提供程序加载到两个不同的 WmiPrvse.exe 实例及其 PID 中。

因此,请务必了解 WmiPrvse.exe 进程中加载的提供程序,并每次记下 WmiPrvse.exe 进程的 PID。

将提供程序 (加载到WmiPrvse.exe导致 CPU 使用率过高的 ) 后,可以了解它是否在处理任何任务。

任务可能是客户端进程提交到 WMI 服务的传入 WMI 查询,然后该服务将分配给相应的 WMI 提供程序进程。 在此示例中,将任务提交到 MS_NT_EVENTLOG_PROVIDER 提供程序。 因此,下一步是研究提供程序的传入查询和任务 MS_NT_EVENTLOG_PROVIDER 。

分析传入查询

检查传入查询包括:

标识 WMI 查询 (由 WMI 提供程序处理的) 导致 CPU 使用率过高。 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 使用率过高的行为,以保持日志干净且大小适中,以便更轻松地分析跟踪。

通过右键单击“ 跟踪 ”并选择“ 将所有事件另存为...”来导出跟踪。

在“保存类型”.xml中选择 或 .csv 。

注意

可以根据需要选择其他熟悉的格式,例如 .EVTX 。

选择跟踪文件的所需语言。

还可以选择以所需格式单独保存WMI-Activity操作事件,以供查看和分析。

查看 WMI 跟踪文件

在 WMI 跟踪中,包含多个重要操作,这些操作都是传入 WMI 查询的一部分。 这些操作记录在 IWbemServices 接口 (wbemcli.h) 中。

一些重要操作包括:

IWbemServices::ExecQuery 方法 (wbemcli.h) IWbemServices::ExecMethod 方法 (wbemcli.h) IWbemServices::ExecQueryAsync 方法 (wbemcli.h)

下面是保存的 CSV 文件中WMI-Tracing日志条目之一:

级别 日期和时间 Source 事件 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\;ClientProcessId = 5484;NamespaceName = 133277000000783520

XML 格式的类似事件如下所示:

11 0 4 0 0 0x8000000000000000 112 Microsoft-Windows-WMI-Activity/Trace 21H2W10M.contoso.com {345E5566-0000-0000-0000-67343241D901} 28089 28090 Start IWbemServices::ExecQuery - root\cimv2 : select * from Win32_Product 21H2W10M 21H2W10M.contoso.com CONTOSO\ 5484 133277000000783520 \\.\root\cimv2 true CorrelationId = {345E5566-0000-0000-0000-67343241D901}; GroupOperationId = 28089; OperationId = 28090; Operation = Start IWbemServices::ExecQuery - root\cimv2 : select * from Win32_Product; ClientMachine = 21H2W10M; User = CONTOSO\; ClientProcessId = 5484; NamespaceName = 133277000000783520 Information Info Microsoft-Windows-WMI-Activity

从上面的示例操作输出中,可以获取并了解以下信息:

查询于:2023-05-05 13:09:18 启动查询 在计算机上:21H2W10M、 从客户端 PID:5484 操作 ID:28089 查询: select * from Win32_Product 命名 空间: \\.\root\cimv2 操作: IWbemServices::ExecQuery

下面是另一个日志:

级别 日期和时间 Source 事件 ID 任务类别 说明 信息 05-05-23 14:47 Microsoft-Windows-WMI-Activity 12 无 GroupOperationId 的 ProviderInfo = 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 格式的相同事件:

12 0 4 0 0 0x8000000000000000 120 Microsoft-Windows-WMI-Activity/Trace 21H2W10M.contoso.com 28096 Provider::CreateInstanceEnum - MS_NT_EVENTLOG_PROVIDER : Win32_NTLogEvent 556 MS_NT_EVENTLOG_PROVIDER {FD4F53E0-65DC-11d1-AB64-00C04FD9159E} %systemroot%\system32\wbem\ntevt.dll 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 Information Info Microsoft-Windows-WMI-Activity

从第二个示例的操作输出中,可以获取并了解以下信息:

使用 SID 的用户启动 CreateInstanceEnum 操作:UserID=“S-1-5-21-00000000000-0000000000-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 关联的操作,了解传入查询,以及 (客户端进程) 启动这些查询的人员。

在上述示例中,PID 552 导致了 CPU 使用率过高。

从日志输出的第二个示例中,为特定的 WMI 类 Win32_NTLogEvent启动 CreateInstanceEnum 操作。

有关详细信息,请参阅 Win32_NTLogEvent,其中包括与 WMI 类关联的 WMI 提供程序详细信息。

现在,你已知道WmiPrvse.exe中托管 (MS_NT_EVENTLOG_PROVIDER) 的确切 WMI 提供程序导致 CPU 使用率过高,主机 ID (552) ,以及某些客户端进程正在查询的 WMI 类 (Win32_NTLogEvent) 。

根据你用于查看跟踪文件的工具,可以应用必要的筛选器来仅查看与 PID 552、主机 ID 552 或 ntevt.dll相关的Win32_NTLogEvent或WmiPrvse.exe操作。

筛选器仅显示包含“Win32_NTLogEvent”的行或操作,结果为:

级别 Source 事件 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\;ClientProcessId = 5484;NamespaceName = 133277000000783520 信息 Microsoft-Windows-WMI-Activity 12 GroupOperationId 的 ProviderInfo = 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\;ClientProcessId = 5484;NamespaceName = 133277000000783520 信息 Microsoft-Windows-WMI-Activity 12 GroupOperationId 的 ProviderInfo = 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\ 已启动查询的客户端的 PID:5484

最后,你有客户端进程 5484 的 PID,该进程正在启动对 Win32_NTLogEvent的查询。 它由提供程序 MS_NT_EVENTLOG_PROVIDER 处理,托管在 WmiPrvse.exe PID 552 下,这会导致 CPU 使用率过高。

缩小客户端 PID 范围后,使用以下工具之一查找进程名称。

任务管理器 进程资源管理器 进程监视器 WMIMon 有关 WmiMon 的详细信息

WMImon.exe 是一种功能强大的监视工具,可用于跟踪和监视系统事件以及 WMI 服务的资源使用情况。

它提供标识其他进程进行的 WMI 调用和查询的重要功能,以及提供有关查询频率、用于查询的用户帐户和请求的信息的信息。

此数据对于需要排查性能问题的系统管理员非常有用。

若要收集和分析此数据,可以按照分步说明进行操作:

使用上述方法确定消耗 CPU 使用率的 WmiPrvSE.exe 的 PID。 从 GitHub 下载 WMIMon.exe 工具 - luctalpe/WMIMon。 该工具用于监视 Windows 上的 WMI 活动。 将 WMIMon_Binaries.zip 文件的内容提取到计算机上的文件夹中。 以管理员身份打开命令提示符,并转到提取 WMIMon 文件的文件夹。 在命令提示符中输入 WMIMon.exe 并按 Enter 来执行 WMIMon.exe 文件。 WMIMon 现在将开始监视系统上的进程发出的 WMI 调用,包括步骤 1 中标识的调用。 WMIMon 显示客户端进程 ID、操作调用的 WMI 命名空间、WMI 类名称和用于发出请求的用户帐户等信息。 分析 WMIMon 的输出,以确定哪些进程 (es) 进行频繁的 WMI 调用,并可能导致 CPU 使用率过高。

通过执行这些步骤,可以有效地使用 WMIMon.exe 监视系统上的 WMI 活动,并确定由 WMI 过度使用导致的任何性能或安全问题。

下面是一个示例:

注意

可以通过在命令提示符中执行 WMIMon.exe > Data.txt 命令,将 WMIMon 捕获的数据导出到文本文件。 若要停止数据捕获,请按 Ctrl + C。

可能存在一些棘手的情况,即无法缩小特定客户端 PID、应用程序或 EXE 的范围。 在这种情况下,考虑通用实体(如用户名或关联的计算机)可能很有用。

也就是说,了解启动查询的用户是服务帐户还是与特定应用程序关联。

其他解决方案

完成怀疑后,可以考虑暂时禁用其服务或卸载与其关联的应用程序,并检查 CPU 使用率过高问题是否已得到解决。

下面是禁用它可以验证观察结果的一些方案。

监视应用程序和服务 system center configuration manager (SCCM) (policyhost.exe 或 Monitoringhost.exe) Powershell.exe 运行包含 WMI 查询的脚本 任何第三方应用程序 数据收集

如果需要 Microsoft 支持方面的帮助,我们建议按照 使用 TSSv2 收集用户体验问题中的信息中所述的步骤收集信息。

还可以使用WMI-Collect工具收集信息。 步骤如下:

下载 WMI-Collect.zip 并将其解压缩到 C:\temp 等文件夹中。

在提升的 PowerShell 命令提示符下,从保存脚本的文件夹运行 WMI-Collect.ps1 脚本。 例如:

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

注意

使 PowerShell 命令提示符保持打开状态,并显示“按 Enter 停止捕获:”消息,并确保重现 WmiPrvse.exe 进程或 WMI 服务 CPU 使用率过高的问题。 不要使跟踪保持启用状态超过一分钟。

按 Enter 停止跟踪。

该脚本将创建一个子文件夹,其中包含所有跟踪的结果和诊断信息。 压缩文件夹。 创建支持案例后,可将此文件上传到安全工作区进行分析。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有