Linux实例CPU使用率较高问题的排查及解决方案

更新时间:2025-04-18 06:21:42
重要

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

在使用 Linux 实例时,如果遇到实例运行卡顿或服务响应时长较长等问题,可能是 CPU 使用率或负载过高导致,您可以参考本文内容排查并解决问题。

问题现象

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

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

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

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

可能原因

CPU最为常见的两个观测指标是CPU使用率和CPU负载情况。关于这两个指标值过高的可能原因如下。

  • CPU使用率过高的常见原因:

    • 异常的进程或服务占用大量 CPU 资源,导致 CPU 使用率过高。

    • 业务程序及业务场景对实例的 CPU 性能要求较高,实例的 CPU 性能不足以支撑业务开展所需的 CPU 性能要求。

  • CPU负载过高的常见原因:

    • 单一进程长时间占用CPU。

    • 磁盘或网络I/O出现瓶颈。

排查步骤

要定位实例CPU负载过高的问题,您可以参见下述操作步骤进行问题的排查定位。

使用top命令查看进程的CPU资源使用信息

top命令是Linux系统中常用的性能分析工具,可以实时显示系统中各进程的资源占用情况。

使用介绍

top [-n] [-d] 
说明

[-n]:刷新次数。如果不指定刷新次数,但指定了刷新时间间隔,刷新操作不会自动停止,您需要按q键退出top程序。

[-d] :刷新时间间隔。

使用示例

  1. 使用Workbench工具以SSH协议登录Linux实例

  2. 执行如下命令,查看系统中各进程的资源占用情况,该命令会每2秒统计一次各进程相关信息,统计5次后退出top命令。

    top -n 5 -d 2

    系统显示示例如下。 关于回显信息介绍的更多信息,请参见系统摘要信息及进程指标监控字段说明

    top - 17:27:13 up 27 days,  3:13,  1 user,  load average: 0.02, 0.03, 0.05
    Tasks:  94 total,   1 running,  93 sleeping,   0 stopped,   0 zombie
    %Cpu(s):  0.3 us,  0.1 sy,  0.0 ni, 99.5 id,  0.0 wa,  0.0 hi,  0.0 si,  0.1 st
    KiB Mem:   1016656 total,   946628 used,    70028 free,   169536 buffers
    KiB Swap:        0 total,        0 used,        0 free.   448644 cached Mem
    PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
    1 root        20   0   41412   3824   2308 S  0.0  0.4   0:19.01 systemd
    2 root        20   0       0      0      0 S  0.0  0.0   0:00.04 kthreadd
  3. top命令的交互模式下,可以通过按键与top命令进行交互。关于交互模式的更多信息,请参见使用top命令的交互模式

    • 通过P键,可以对CPU使用率进行倒序排列,方便定位系统中占用CPU较高的进程。

    • 通过M键,您可以对系统内存使用情况进行排序。如果有多核CPU,数字键1可以显示每核CPU的负载状况。

说明
  • 如需查看每个进程ID对应的程序文件,您可以运行ll /proc/<PID>/exe命令,其中<PID>需替换为实际的程序PID。

  • 如果已查询出占用CPU资源较多的非业务进程信息,需要终止该进程,您可以在top命令的交互模式下结束对应进程,具体操作,请参见通过PID结束对应进程

使用vmstat命令查看系统资源使用信息

vmstat(Virtual Memory Statistics)是用于报告虚拟内存统计信息的命令,可以使用该命令,从系统维度查看操作系统的虚拟内存、进程、CPU等指标信息。

常用参数说明

vmstat命令的使用格式如下。

vmstat [-n] [delay [count]] 

参数选项

说明

参数选项

说明

-n

只在开始时显示一次各字段名称。

[delay]

刷新时间间隔。如果不指定,只显示一条结果。

[count]

刷新次数。如果不指定刷新次数,但指定了刷新时间间隔,刷新操作不会自动停止,您需要按Ctrl+C键退出vmstat程序。

使用示例

执行如下命令,使用vmstat1秒统计一次各进程的CPU使用情况,连续统计4次。

vmstat -n 1 4

返回示例类似如下。

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 2684984 310452 2364304    0    0     5    17   19   35  4  2 94  0  0
 0  0      0 2687504 310452 2362268    0    0     0   252 1942 4326  5  2 93  0  0
 0  0      0 2687356 310460 2362252    0    0     0    68 1891 4449  3  2 95  0  0
 0  0      0 2687252 310460 2362256    0    0     0     0 1906 4616  4  1 95  0  0

回显结果主要字段说明如下。

  • r:表示系统中CPU等待处理的线程。一个CPU每次只能处理一个线程,所以该数值越大,通常表示系统运行越慢。

  • us:用户模式消耗的CPU时间百分比。该值较高时,说明用户进程消耗的CPU时间比较多。如果该值长期超过50%,则需要对程序算法或代码等进行优化。

  • sy:内核模式消耗的CPU时间百分比。

  • wa:I/O等待消耗的CPU时间百分比。该值较高时,说明IO等待比较严重,这可能是磁盘大量作随机访问造成的,也可能是磁盘性能出现了瓶颈。

  • id:处于空闲状态的CPU时间百分比。如果该值持续为0,同时syus的两倍,则通常说明系统面临CPU资源短缺。

处理CPU使用率高的问题

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

问题现象

原因

解决方案

问题现象

原因

解决方案

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

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

  • 通过在top工具定位到占用CPU资源较多的程序的PID,并通过如下方式结束进程。

    警告

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

    • 通过sudo kill -15 <PID>来结束该进程。

    • top命令交互模式下结束进程,具体操作,请参见通过PID结束对应进程

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

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

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

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

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

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

优化业务程序。

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

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

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

常见问题

CPU使用率较低但负载较高

问题现象

当前Linux系统没有业务程序运行。通过top命令观察,发现CPU使用率不高,但是CPU负载(load average)却非常高,如下图所示。

image

可能原因

该问题可能是因为僵尸(zombie)进程过多导致。load average是对CPU负载进行评估的,其值越高说明其任务队列越长,处于等待执行的任务越多。

解决方案

您可以通过ps -axjf命令查看是否存在D+状态进程,该状态是指不可中断的睡眠状态。

处于该状态的进程无法终止,也无法自行退出,只能通过恢复其依赖的资源或者重启系统来解决。

image

kswapd0进程占用CPU较高

问题现象

ECS实例运行卡顿,使用top命令查看,kswapd0进程占用了99% CPU。

image

可能原因

出现该问题可能是系统此时在持续进行换页操作,导致占用大量CPU资源。

kswapd0是虚拟内存管理中负责换页的进程,当ECS实例物理内存不足时,kswapd0会执行换页操作,换页操作会消耗大量的CPU资源。

解决方案

您可以通过修改vm.swappiness内核参数来控制交换空间的大小,来解决kswapd0进程占用CPU较高的问题。

  1. 使用Workbench工具以SSH协议登录Linux实例

  2. 通过调整swappiness参数解决kswapd0进程占用CPU较高的问题,具体操作,请参见调整swappiness参数

CPU使用率过高但通过top命令查询不到异常进程

问题现象

使用ECS实例的过程中,如果遇到CPU使用率高达100%等异常情况,且无法通过top、htop等命令查询到消耗CPU资源的具体进程。

可能原因

该问题可能是系统遭遇计算机病毒或恶意程序攻击导致。

解决方案

  1. 查看云监控监控数据。

    1. 登录ECS控制台-实例

    2. 在左侧导航栏,单击实例ID

    3. 单击监控页签,在操作系统监控页签下,查看该主机的CPU使用率并记录CPU使用率变高的具体时间点。

  2. 查看Linux系统相关的命令修改记录。

    以下示例以top命令为例进行演示,实际操作中,您需要替换为实际需要查看的命令,如ps等。

    1. 使用Workbench工具以SSH协议登录Linux实例

    2. 查看命令文件状态信息。

      执行如下命令,查看当前Linux系统命令文件状态信息。

      sudo stat /usr/bin/top

      回显信息示例如下。

        File: /usr/bin/top
        Size: 134864          Blocks: 264        IO Block: 4096   regular file
      Device: 253,3   Inode: 658539      Links: 1
      Access: (0755/-rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
      Access: 2025-04-15 13:45:41.240874421 +0800
      Modify: 2024-09-26 16:44:05.000000000 +0800
      Change: 2025-04-15 13:45:24.822222315 +0800
       Birth: 2025-04-15 13:45:24.804221600 +0800

      关于回显信息中的参数说明如下。

      • Access:文件最后一次被访问时间。

      • Modify:文件内容最后一次被修改的时间。

      • Change:文件元数据被修改的时间。

      • Birth:文件被创建的时间。

    3. 查看命令软件包信息。

      Alibaba Cloud Linux/CentOS/RHEL/Fedora
      Ubuntu/Debian
      1. 查看命令文件路径

        sudo which top

        回显结果示例如下。

        /usr/bin/top
      2. 查看软件所属软件包

        sudo rpm -qf /usr/bin/top

        回显结果示例如下,说明该命令属于procps-ng软件包。

        procps-ng-3.3.10-28.el7.x86_64
      3. 通过包管理工具校验软件包

        sudo rpm -V procps-ng
        • 回显结果为空,表明文件正常。

        • 回显结果示例如下,说明文件有被修改。

          ??5?????? c /etc/sysctl.conf
          • ??5?????? 表示文件属性(如权限、所有者、大小等)与原始安装记录不符。

          • c 表示文件内容被修改。

      1. 查看命令文件路径

        sudo which top

        回显结果示例如下。

        /usr/bin/top
      2. 查看软件所属软件包

        sudo dpkg -S /usr/bin/top

        回显结果示例如下,说明该命令属于procps软件包。

        procps: /usr/bin/top
      3. 通过包管理工具校验软件包

        sudo dpkg -V procps
        • 回显结果为空,表明文件正常。

        • 回显结果示例如下,说明文件有被修改。

          ??5?????? c /etc/sysctl.conf
          • ??5?????? 表示文件属性(如权限、所有者、大小等)与原始安装记录不符。

          • c 表示文件内容被修改。

      说明

      如果您通过上述检查后,依然怀疑您的命令被恶意程序修改过,您可以选择使用包管理工具重新安装该软件包,具体操作,请参见使用包管理工具管理软件

  3. 查询当前实例是否连接到异常域名。

    运行如下命令,查看网络接口的连接信息。

    iftop -i [$Device] -n -P
    说明

    [$Device]请替换为当前系统使用的网卡,如eth0。

    系统显示类似如下,若您没有连接过crypto-pool.fr,则crypto-pool.fr是异常域名。

    image

  4. 综合以上表现,如果在某个时间点之后,您的实例出现异常进程占用CPU资源过高,且实例有与异常域名或IP的网络通讯,那么很有可能您的实例遭遇了病毒或是恶意软件的攻击,您可以参考如下步骤处理该问题。

    1. 通过快照备份ECS实例数据,具体操作,请参见创建快照

    2. 使用遭遇病毒或恶意软件攻击之前的有效快照恢复实例数据,具体操作,请参见使用快照回滚云盘

    3. 通过云安全中心对实例进行病毒查杀,提升主机防护能力。更多信息,请参见主机防护

相关文档

  • 本页导读 (1)
  • 问题现象
  • 可能原因
  • 排查步骤
  • 使用top命令查看进程的CPU资源使用信息
  • 使用vmstat命令查看系统资源使用信息
  • 处理CPU使用率高的问题
  • 常见问题
  • CPU使用率较低但负载较高
  • kswapd0进程占用CPU较高
  • CPU使用率过高但通过top命令查询不到异常进程
  • 相关文档