【Windows】怎么解决Win 10家庭版WMI Provider Host占用CPU过高的问题?-篇一【2025.05.07】
本文面向两种用户,普通小白和windows开发程序员。
对于小白,目标就是阻止wmi对资源的高占用。解决方法有以下几步:
查出谁在调用这个wmiprvse.exe
win+R 组合键打开运行,输入命令services.msc,回车或确认。
- 找到如下蓝色背景的Windows Management Instrumentation。
- 双击打开属性弹窗,点击依存关系。下发的”以下系统组件依赖此服务“显示的就是哪些服务会触发wmiprvse.exe的运行。比如Dell Data Vault Collector,我们再回到服务去找这个。
- 留意服务的状态是运行中的,像我主机,这个服务就在运行。双击打开属性弹窗。留意下可执行文件路径,到该路径下看下是否是自己安装的,最好卸载的方式去除这个服务。
点击停止的话,可能重启会再次启动,所以把启动类型这里设为禁用。
以上对于小白的一种解决方式,当然若是系统不通过服务的方式调用wmi则上述步骤不起作用,需要高阶排查。
对于程序员等兴趣爱好者:
查看wmi的日志,定位到底是谁在密集调用这个服务。控制台执行WMIMon.exe > c:/wmilog.txt 。注意需要观察wmiprvse.exe的cpu占用高的时候开启,或者至少日志包含CPU高的部分。
- Ctrl+C关闭刚刚的命令。日志量可能很大,我这里采用的方法是频率,看哪个进程调用频次高。notepad++打开C盘下的wmilog.txt文件。按照进程_ClientProcessId进行搜索,观察次数。如下图,总共1480次客户端调用,光这个就占了640次。那我们就分析这个进程,进程id=5412。
- 如下图,就把某绒揪出来了,当然这个可能是误伤,先卸载后再观察。如果好了就罢了。如果不好,再分析其他进程id。(此处蛐蛐几句,搞安全的就是细致,把命令行都隐藏了,也不知道有意无意的~)
至此,作为开发者比较精细的处理了wmiprvse占用高。那是否会有疑问这个东西是干啥的,为啥这么多程序服务依赖这个。
wmiprvse.exe 分析深入篇
此节适合对windows系统有深入兴趣的读者。
首先了解下:WMI(Windows Management Instrumentation)是Windows系统管理的核心技术,用于管理和监控系统资源、硬件、软件和服务。说白了,我们要查询下cpu的负载、内存的余量、磁盘信息等均可以通过此组件。wmi支持的全部如下。
那么导致这个进程CPU占用高的原因是啥?是查询性能频繁还是微软的这个组件本身有问题。实际上2者都存在。以下是微软自win7关于这个组件的问题。
在 Windows 7 或 Windows Server 2008 R2 中的 Wmiprvse.exe 过程中出现内存泄漏 - Microsoft 支持
下图是msdn上对wmi的架构介绍,我们分层看,第三层,是客户端层或者叫请求层,非官方写的程序都属于这一层。通过COM接口的方式调用WMI的服务。第2层,wmi管理了一个仓库,就是一个数据库,存储这些采集数据。第1层,是和系统相关调用,win7、10、11、server可能有差异,就在最低的第1层做了兼容。可理解为微软自己的全家桶很大,做了一层适配。开发一次wmi的代码,在微软的各个产品均可正常执行。
从wmi使用的方式也可看出,和sql语句很像。微软称为WQL 即 WMI Query Language。
对于个人电脑来说wmi使用最多的也就是性能采集,支持脚本的方式对于云服务厂商处理批量主机会方便很多。下文结合我最近遇到的现场wmiprvse.exe占用高的问题,做个深入分析。