如何处理Linux系统内存使用率过高问题?

重要

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

问题现象

使用Linux系统的ECS实例时,出现系统卡顿、内部服务响应速度变慢等问题。通过实例健康诊断显示:该实例当前内存的使用率已超过80%。

可能原因

ECS实例中存在异常的进程或服务,占用大量内存,导致内存使用率过高。一般来说,当内存使用率≥80%时,定义为内存使用率过高。建议您通过创建报警规则,实时监控ECS实例的波动情况,具体操作,请参见创建报警规则

解决方案

您可以参考以下步骤,解决内存使用率过高的问题。

  1. 远程连接ECS实例。如何连接ECS实例,请参见通过SSH的方式连接实例(Linux)

  2. 查找当前实例中占用内存过高的进程。

    执行如下命令,从进程维度查看CPU、内存等资源的使用情况。

    top
    说明

    您可输入小写字母q退出top命令。

    按下M键查看内存使用率排行,命令执行后回显样例:

    image

    1. 命令回显第一行: load average: 0.00, 0.01, 0.11表示最近1分钟、5分钟和15分钟的系统平均负载。

    2. 命令回显第三行:CPU资源总体使用情况。

    3. 命令回显第四行:内存资源总体使用情况。

    4. 命令回显最下方显示各进程的资源占用情况。

      PID:进程ID。

      USER:进程所有者。

      PR:进程优先级,越小越被优先执行。

      VIRT:进程占用的虚拟内存。

      RES:进程占用的物理内存。

      SHR:进程占用的共享内存。

      S:进程的状态。S表示休眠,R表示正在运行,Z表示僵尸进程,T表示跟踪或者停止,I表示空闲进程,D表示不可中断的休眠状态。

      %CPU:进程使用CPU百分比

      %MEM:进程使用物理内存百分比。

  3. 根据内存使用率排名,结合业务情况,对进程进行分析。

    样例中,系统的平均负载和CPU使用率均处于较低水平,但内存使用率较高,约为85%。其中,进程13183占用了79.5%的内存。

    • 如果该进程是业务进程,建议您优化业务或者升级实例规格。如何升级实例规格,请参见包年包月实例升配规格更改按量付费实例规格

    • 如果该进程是异常进程,您可以根据以下操作步骤终止异常进程。

      警告

      终止操作系统关键进程可能导致系统重启,请谨慎操作。

      1. 输入小写字母k,如图所示。

        image

      2. 输入要终止的PID,按Enter键确认。例如要终止样例中的13183。

        image

      3. 操作成功后,界面会出现类似Send pid 13183 signal [15/sigterm]的提示信息,按Enter键确认即可终止进程。image

  4. 查看实例内存使用率情况。

    free

    当前实例的内存使用率大幅降低。

    image

常见问题

如何判断系统的平均负载是否正常?

实例的CPU负载取决于其配置,并根据top命令提供的load average值,分析系统短期和长期的负载趋势。例如当ECS实例的配置为2核(vCPU)时,系统平均负载可能存在以下几种情况。

  • 若所有三个时间段的负载平均值均大于2,说明在较长时间内存在高负载状态,此时需进一步调查其原因。

  • 若1分钟的负载平均值较高,而5分钟和15分钟的负载平均值较低,可能仅为暂时性高峰,此时需持续关注。

  • 若所有三个时间段的负载平均值均小于2,则表示负载状态正常。