Windows实例CPU使用率较高问题的排查与处理

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

Windows系统中,可以通过任务管理器、资源监视器等工具查看CPU使用率。本文主要介绍Windows实例中CPU使用率较高问题的排查及解决方法。

问题现象

使用 Windows 系统的ECS实例时,出现如下现象。

  • 系统运行卡顿、服务响应时长较长、应用性能下降等问题。

  • 通过ECS控制台查看实例 CPU 使用率监控时,发现CPU使用率或者负载过高(参考值:当前CPU 使用率> 80%,可认为CPU使用率过高,当前负载值>0.5,可以认为负载值过高)。

  • 收到CPU使用率或者负载超过设定阈值的告警信息。

可能原因

CPU使用率较高可能有以下原因。

  • ECS实例遭到病毒木马入侵。

  • ECS实例中第三方杀毒软件运行占用较高CPU资源。

  • ECS实例中应用程序异常、驱动异常、高I/O使用率或高中断处理的应用程序。

排查步骤

使用资源监视器查看CPU使用率指标

Windows实例中,可以通过任务管理器、资源监视器等工具定位CPU使用率过高的问题。本文以Windows Server 2022系统为例,介绍如何通过资源监视器定位CPU使用率较高的问题。其他常见工具,请参见常见工具

  1. 通过VNC方式连接ECS实例。

    具体信息,请参见通过VNC连接实例

  2. 在桌面底部单击搜索按钮,并输入资源监视器,单击确定

  3. 资源监视器页面中,查看各进程是否有CPU使用率过高的现象。

    image

  4. 针对占用CPU资源较高的进程,查看对应的进程ID和进程的程序名。

  5. 打开任务管理器,任务管理器的详细信息页签下,找到之前资源监视器查看到的异常进程名和对应的PID。右键单击进程名称,选择打开文件所在的位置(O),查看进程是否为恶意程序。

处理CPU使用率高的问题

常见CPU占用较多问题的原因及解决方案如下。

问题现象

原因

解决方案

异常用户程序或进程长时间占用大量CPU资源,导致CPU使用率和负载较高。

该程序为异常程序或进程,运行时占用过多CPU资源。

  • 通过资源监视器工具定位到占用CPU资源较多的程序的PID,并通过资源监视器或任务管理器结束进程。

    警告

    在您结束进程前,请务必确保您了解该进程的相关信息,避免因误操作导致您的业务中断。

  • 如果怀疑进程为恶意程序,您可以对其进行查杀,相关操作,请参见病毒查杀

正常用户程序或进程长时间占用大量CPU资源。导致CPU使用率和负载较高。

该程序为正常业务程序或进程,运行时占用过多CPU资源。

如果实例出现CPU性能瓶颈,您可以结合实际情况选择相应的处理策略。

单个业务程序或进程偶发CPU使用率及负载较高,但持续时间较短,且发生频率较低。

业务程序需要优化,以解决特殊业务场景(加解密,高并发等)触发的CPU资源占用过高问题。

优化业务程序。

没有单个程序或进程占用大量CPU资源,但整体CPU使用率较高,负载较低。

当前实例的服务正常运行所需CPU资源性能大于实例的CPU性能。

如果实例出现CPU性能瓶颈,您可以选择升级实例规格相关操作,请参见修改实例规格

常见工具

以下是关于Windows系统中定位CPU使用率过高问题工具的简要说明。

任务管理器

任务管理器可以直观查看应用程序列表,定位占用CPU较高的应用程序,如下是任务管理器页面。

image

在性能页面检查CPU使用率时,右键单击CPU使用率图示,单击将图形更改为(H) > 逻辑处理器(L)

如下图显示了2个逻辑CPU的使用率。

image

当单个进程的CPU使用率飙升至接近100%时,而其它进程的CPU使用率变化不大,则可能是网络I/O处理造成的。

资源监视器

资源监视器可以直观查看CPU使用率,还可以通过句柄和模块搜索对应的进程。

image

Process Explorer

Process Explorer是一款Microsoft Sysinternals工具,通过配置正确的Symbols,检查对应应用程序的线程调用的Call Stack,用以定位可能的问题驱动。下载Process Explorer工具,请参见Process Explorer

如下图是Process Explorer工具使用页面。

image

性能监视器

性能监视器(Performance Monitor)是Microsoft专业收集各个组件性能计数器的工具。对于系统CPU资源消耗,有多个Counter来检查。

Performance有如下三个核心参数。

  • \Processor(_Total)\% Processor Time:CPU执行非空闲线程的时间百分比。\Processor(_Total)\% Processor Time=\Processor(*)\% User Time+\Processor(*)\% Privileged Time.

  • \Processor(*)\% User Time:表示处理器用于执行程序代码的时间消耗,可以确定哪个应用程序或函数调用消耗了较多的时间。

  • \Processor(*)\% Privileged Time:应用程序在内核中执行系统调用(例如驱动、IRP,上下文切换等)操作的时间。如果操作系统花费多于30%的时间在Privileged Time,则说明实例正在进行高I/O吞吐相关的操作。

    % Privileged Time很高时,需要进一步检查% DPC Time% Interrupt Time以及Context Switches/sec的情况。

相关文档

如需解决Linux系统CPU使用率高的问题,请参见Linux实例CPU使用率或负载较高问题的排查及解决方案