为什么 WMI 提供程序主机 (WmiPrvSE.exe) 会不断增加我的 CPU?

Sat*_*hat 91 windows-7 process wmi hp-envy

我通常让我的笔记本电脑 24x7 运行,一天结束时,我的大腿因为过热而被烧伤真的很烦人。

过热似乎是 WMI 提供程序主机 (WmiPrvSE.exe) 每隔几分钟将 CPU 利用率飙升至 25% 的结果。为什么会发生这种情况?

我有一台运行在 Windows 7 Home Premium 上的 HP Envy 14(带有 HP 捆绑的垃圾)。

(注意:根据@nhinkle过去的观察,似乎 HP Wireless Manager 可能是罪魁祸首,有什么办法可以证实这一点?)

这个问题是本周超级用户问题
阅读 2011 年 2 月 28 日的博客条目以了解更多详细信息或提交您自己的本周问题。

nhi*_*kle 111

正如 Sathya 在他的问题中提到的,我之前在我的类似 HP 笔记本电脑上遇到过这个问题,现在我已经使用科学方法确认 HP 笔记本电脑上的 CPU 峰值是由 HP Wireless Assistant 引起的。或者,我可能会开始称呼它为 HP CPU Assassin。

实验概述

  • 问题是什么导致 HP 笔记本电脑上的 CPU 频繁出现尖峰,特别是 WmiPrvSE.exe 过程?

  • 假设HP Wireless Assistant (HPWA) 导致了问题

  • 方法

    1. 查看安装 HPWA 时是否开始出现问题。
    2. 查看WmiPrvSE.exe当 HPWA 进程挂起时CPU 是否停止尖峰并且进程停止使用 >20% 的 CPU。
    3. 查看重新启用 HPWA 进程时 CPU 是否再次开始尖峰
    4. 重复第 2 步和第 3 步进行多次试验以确保结果准确
       
  • 结果HPWA 导致 CPU 使用率过高

  • 结论您应该卸载 HPWA,因为它没有任何用处

背景资料

当我拿到 HP Pavillion dm4t 笔记本电脑时,我注意到 CPU 的使用率会经常飙升至 50%,几乎每隔一秒。这会耗尽电池寿命,并使笔记本电脑升温;与 Sathya 经历的症状大致相同。仅通过查看 Windows 7 中的资源监视器,我就能够看到该进程WmiPrvSE.exe有问题。

cpu 额定值

快速的谷歌搜索证实了我的假设,即这是Windows Management Instrumentation (WMI) 主机进程。简而言之,WMI 可用于查询系统信息,例如处理器使用情况、正在运行的进程、登录者以及各种其他信息。WMI 主机进程运行 WMI 查询的任何其他进程,因此WmiPrvSE.exe它本身不是罪魁祸首,它只是一个中介。

为了找出导致此问题的特定进程,我使用了Systinternals Process Explorer。我发现WmiPrvSE.exe进程的哪个实例使用了大量CPU,然后点击它打开详细信息。

进程浏览器

不幸的是,我无法找到任何方法来找出进行所有查询的进程,但由于我已将此作为 CPU 峰值的来源进行隔离,并且知道这是一项服务,因此我前往服务管理器查看哪个进程服务依赖于 WMI,认为这可能会让我找到另一个线索。

服务名称

我认为它不会是导致问题的内置 Windows 服务,因此消除这些,我决定在列表中工作并尝试禁用每个服务,并查看问题是否仍然存在。位于列表顶部的是 HP Wireless Assistant 服务。我回到服务菜单,并禁用了该服务。回顾任务管理器,我看到 CPU 使用率几乎为零。我恢复了 HPWA 服务。CPU 使用率猛增。我现在有足够的数据来形成我的理论。我卸载了 HPWA 服务,再也没有出现过这个问题。

验证假设

几个月后,沙迪亚问了这个问题。我决定一劳永逸地证明这是 HPWA 的错。我重新安装了几个月没有安装的 HP Wireless Assistant。立刻,处理器使用率猛增。然后我完成了上面概述的实验。

首先,我在资源监视器中隔离了负责 HPWA 服务的进程。HPWA_Service.exe并且HPWA_Main.exe是两个。以下是这两个处理运行时的 CPU 使用情况:

运行hpwa的任务管理器

然后,我暂停了这两个进程。CPU 使用率立即下降;稍等片刻后,图表上的先前 CPU 使用情况将被清除,如下所示:

没有运行hpwa的任务管理器

我再次启用这些进程以查看使用情况是否会恢复。它做了:

任务管理器刚刚启用了hpwa
启用 HPWA 时的第一个峰值

启用hpwa后的任务管理器
启用 HPWA 后不久

再次暂停进程导致 CPU 使用率回落:

禁用 hpwa 后降低 CPU 使用率

我又测试了一次迭代,在第三次试验中,同样的事情再次发生。我认为这足以证明是 HP Wireless Assistant 导致了问题,随后禁用了该服务,现在将其卸载。

HPWA 所做的只是在无线打开或关闭时通知用户,并占用 CPU。没有什么是内置无线管理工具无法做到的,因此我建议如果您安装了此软件,请将其删除。


注意:至少有一个人报告说卸载 HPWA 会导致他们在键盘上的无线开关停止工作。在我的笔记本电脑上,卸载 HPWA 后它仍然可以正常工作,但如果您的笔记本电脑确实停止工作,您始终可以从 Windows 内部禁用无线网卡。按Winkey+x打开 Windows 移动中心,然后单击Turn Wireless Off按钮。

窗户移动中心


根据讨论HP支持论坛,这个问题已被固定在较新版本的惠普无线助手。如果您的笔记本电脑需要 HPWA 才能使用 wifi 开/关按钮,您可以从 HP 的驱动程序网站下载最新版本,并且可能不会再出现此问题。尽管如此,如果您不需要它来打开/关闭 wifi 按钮,那么安装此软件似乎仍然没有任何附加价值。

  • 哇!这是一个**非常棒**的帖子!我*见过*有史以来记录和截图最多的帖子之一!+1!! (20认同)
  • +1,很棒的侦探工作和漂亮的截图帖子,在Windows中使用无线助手软件,这是我在新PC上删除的第一件事。 (2认同)

Tam*_*man 38

故障排除

  1. 从 Microsoft Sysinternals下载ProcDump

  2. 一旦 WmiPrvSE.EXE 达到 25% 持续 1 秒,就让它转储:

    procdump.exe -c 25 -s 1 -x WmiPrvSE.EXE %HOMEPATH%\WmiPrvSE.dmp
    
    Run Code Online (Sandbox Code Playgroud)

    这将在您的用户文件夹中创建一个转储。

    随意重复此 1 - 2 次,以便您有更多转储,并且可以确定原因已被转储,而不是另一个更正常的事件。

  3. 在线分析您的转储,并可选择在SpeedyShare分享

    替代方案WinDBG可以与命令一起使用!analyze -v,一定要设置符号

  4. 显示的堆栈跟踪应包括导致此问题的过程。

也许谷歌一些堆栈的顶级程序以更好地了解它们的作用。
如果它们没有帮助,您可能需要更高级的分析。请看我的下一节:


  1. Windows 性能分析工具下载适用于您的 Windows 版本的设置。
  2. 在您的系统上安装该软件。
  3. 以管理员身份打开命令提示符,然后复制粘贴下一个命令:

    xperf -start perf!GeneralProfiles.InBuffer -stackwalk profile && timeout -1 && xperf -stop perf!GeneralProfiles.InBuffer %HOMEPATH%\myTrace.etl
    
    Run Code Online (Sandbox Code Playgroud)
  4. ENTER 一次以启动命令,现在您必须等到尖峰发生。

  5. 秒杀后,您立即前往控制台并按ENTER
  6. 等待一段时间后,将在您的用户文件夹中生成一个日志文件 myTrace.etl。
  7. 运行以下命令以显示文件并对其进行分析(需要WinDBG / Symbols):

    xperf %HOMEPATH%\myTrace.etl
    
    Run Code Online (Sandbox Code Playgroud)

如果你想让我研究一下:

  1. 将 myTrace.etl 从您的用户文件夹压缩为 zip 文件。
  2. SpeedyShare上共享压缩的 zip 文件。
  3. 在此处分享链接,我将尝试查找并向您展示问题的原因。

由于 WmiPrvSE.EXE 是针对 CAPI 存储运行 WMI 查询的主机,由于IPC,即使使用 XPerf,您也可能无法找到原因,我刚刚发现的另一个解决方案是启用 WMI 日志记录并检查日志如所描述的在这里,所述ClientProcessId将是由WMI查询过程的PID。通过将 PID 列添加到 Task Manager 或Process Explorer,或者使用tasklist /FI "PID eq X"X 是您找到的PID ,可以将此 PID 追溯到进程。


转储 1 的分析:第 94-115 行指示远程过程调用转储 2 的
分析:第 84-105 行指示远程过程调用

在内核中,启动了一个新线程来处理远程过程调用存根,它本质上是一个查询请求,WMI Provider 将执行并响应该请求。由于读取注册表和/或性能信息,这会导致高 CPU 活动。

由于转储是对单个时刻的捕获,因此您将无法看到哪个进程执行了 RPC。
因此,您需要一个像 XPerf 一样跟踪的程序,以查看将执行 RPC 的前一个线程。

或者,如果您启用 RPC State Information,您可以使用rpcdbg查看谁发起了呼叫。

例子:

0:000> bp rpcrt4!RpcServerUseProtseqEpA
0:000> g
Breakpoint 0 hit
eax=00452000 ebx=7ffd5000 ecx=00452008 edx=00000014 esi=00d5f55c edi=7c911970
eip=77e97a0b esp=0012ff3c ebp=0012ff6c iopl=0 nv up ei pl nz na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000206
RPCRT4!RpcServerUseProtseqEpA:
77e97a0b 8bff mov edi,edi
0:000> kb
ChildEBP RetAddr Args to Child
0012ff38 00401046 00452000 00000014 00452008 RPCRT4!RpcServerUseProtseqEpA
0012ff6c 00401e37 00000001 003330a0 00333120 hellos!main+0x46 [e:\projects\hello\hellos.c @ 21]
Run Code Online (Sandbox Code Playgroud)

上面的例子在 RPC 上设置了一个断点,所以你可以看到谁在堆栈的第二行运行它。但是,在第一次调用时设置断点(请注意这是实时调试)不太可能帮助您查看每次是谁调用 WMI 提供程序...

那篇文章中有更多关于RPC 状态信息的信息可能会有所帮助,但是当我们可以只使用 XPerf 时,像我们这样胆小的人不应该经历所有这些。:-)


正如我们现在了解 RPC 工作原理的内部工作一样,我们也可以使用API Monitor

  1. 下载、安装并启动 API Monitor。(如果你有 64 位,两次:一次 x86,一次 x64)
  2. 转到文件-->以管理员身份运行
  3. API 捕获过滤器设置为Rpcrt4.dll模块。

    在此处输入图片说明

  4. 与断点类似,我们想知道谁调用了RpcServerUseProtSeq函数:

    在此处输入图片说明

  5. 钩住每个正在运行的进程,除了那些低 PID 的进程(以防止崩溃)。
    理想情况下,您不想挂钩dwm.exe/winlogon.exe或降低。
    您也可以尝试单个进程并稍后从Hooked Processes窗口中取消它们...

    虽然......我已经尝试过并且可以连接任何过程。

  6. 如果一切顺利,进行 RPC 调用的Hooked Process将包含线程。
    单击这些线程后,您应该会看到一堆调用。
    如果你这样做了,你就找到了导致问题的过程!

解决方案

使您的计算机保持最新状态很重要,安装HPWA 4.0.10.0可以解决这个问题!;-)

  • 我更喜欢 nhinkles 的回答——但这也很棒而且很有帮助——但最重要的是,像 API 监视器这样的工具是我最近开始想念的东西,所以感谢和 +1 的提示。 (2认同)
  • @Tom,我没有那种印象,我当然不想暗示它。然而,我*确实*感到有一种冲动,即用比我单独使用赞成票更详细和区分更多的方式来识别该问题的两个优秀答案。:) (2认同)

har*_*ymc 13

Microsoft 博客条目WMIprvse 是真正的恶棍吗?显示了如何查找哪个进程负责 WmiPrvSE.exe 正在使用的 CPU。

该方法使用“显示分析和调试日志”的事件查看器选项来跟踪所有 WMI 活动,从而获取有罪进程的进程 ID。


Dan*_*nyT 7

只需为同一条船上的其他人添加这个,这个页面就遍布谷歌。我在 Windows 8.1 上的 Lenovo Yoga2 Pro 上,WmiProvderHost 将 CPU 峰值提高到 50% 并耗尽电池电量时遇到了同样的问题。

根据上面的一些出色的调查建议,我发现问题实际上是GoPro Studio(GoPro 相机附带的免费视频编辑软件)。它安装了一个监控服务,等待你连接你的相机,对我来说这是罪魁祸首。

  • Windows 8.1,关闭 GoPro 常驻程序后,我的 WMI Provider Host CPU 使用率从 40% 下降到 8% (3认同)