原文网址:https://www.youyong.top/article/1158f8d651300
如果希望快速解决问题,请尝试如下方法:
- 如果有安装杀毒软件,请检查CPU飙高时,杀毒软件是否在后台执行扫描操作。如果可能,请升级杀毒软件到最新版本,或者删除杀毒软件;
- 使用MSconfig禁用所有非微软自带服务驱动,检查问题是否再次发生,具体参考微软KB How to perform a clean boot in Windows;
注:请参考微软官方博文
How to troubleshoot high cpu in the System process
排查指南
如果需要定位为何出现CPU高的原因,可以参考微软官方博客说明,微软有多个工具可以定位CPU高的问题。
例如 任务管理器,资源监视器(Resource Monitor), 性能监视器(Performance Monitor), Process Explorer,Xperf (Windows server 2008以后), KernRate(Windows server 2003),抓取系统Full Memory Dump检查。
任务管理器
可以直观检查应用程序列表获取哪个应用程序占用CPU较高。点击CPU列可以按照CPU使用率排序。

在任务管理器的”性能”页中检查CPU占用率,注意在右侧CPU使用率图示,
请右键选择”将图形更改为”->”逻辑处理器”。如下图显示了4个逻辑CPU的利用率。

技巧:如果仅仅看到某个CPU飙升到接近100%, 但是其它CPU变化不大,很可能是网络IO的处理造成。
资源监视器
直接检查CPU的使用率,还可以通过句柄和模块搜索对应的进程。

Process Explorer
微软官方sysinternals工具,下载链接如下:
https://technet.microsoft.com/en-us/sysinternals/processexplorer.aspx
该工具非常强大,在检查高CPU问题方面,通过配置正确的Symbols,可以通过检查对应应用程序的线程调用的Call Stack,来定位可能的问题驱动。

关于使用实例,请参考微软专家Mark Russinovich 的博文 The Case of the System Process CPU Spikes
性能监视器/Xperf
性能监视器(Performance Monitor)是微软专业收集各个组件性能计数器的工具。
对于系统CPU资源消耗,有多个Counter来检查。通过开始->运行->perfmon打开该工具。
微软博文User Mode Versus Privileged Mode Processor Usage 描述了Performance的3个核心Counter
“\Processor(_Total)\% Processor Time”
“\Processor()\% User Time”
“\Processor()\% Privileged Time”
“\Processor(_Total)\% Processor Time” 是“\Processor()\% User Time” 与“\Processor()\% Privileged Time”使用之和。
\Processor()\% Privileged Time 高的处理
\Processor()\% Privileged Time 是应用程序在内核中执行系统调用(例如驱动、IRP,上下文切换等)操作的时间。如果操作系统花费多余30%的时间在Privileged Time ,那么意味着其可能在进行高IO吞吐相关的操作。下图是Privileged Time高的示例:

此时,请进一步检查 % DPC Time、% Interrupt Time、Context Switches/sec的情况。
如果% DPC Time、% Interrupt Time值较高,
请参考文档
Choose Your Own Adventure: High Deferred Procedure Calls (DPCs) or High Interrupts
高DPC以及高中断,意味着某些设备出现大量的操作或者很差的性能问题,此时,建议使用微软Xperf工具进一步分析,关于XPerf的使用,请参考文档:
Windows IT Pro Magazine: Examining xPerf
http://www.windowsitpro.com/print/performance/examining-xperf.aspx
如果Context Switch值比较高,请参考The Case of the 2 Million Context Switches . 高上线文切换行为可能是由于有大量的线程处于Ready状态,通过减少线程的数量解决此类的问题。如下是Mark Russinovich给出的一篇解决高CPU的实例文章。
Mark Russinovich’s The Case of the System Process CPU Spikes
\Processor()\% User Time高的处理
\Processor()\% User Time是处理器用于执行程序代码的时间消耗,可以用来哪个应用程序/函数调用消耗了最多的时间。下图给出了User Time高的示例:


具体可以参考微软文章:
How To: Identify Functions causing a High User-mode CPU Bottleneck for Server Applications in a Production Environment
原文网址:https://www.youyong.top/article/1158f8d651300