Linux实例内存使用率较高问题的排查与处理

介绍排查Linux服务器内存使用率过高问题的方法。通过解读内存指标、定位内存消耗来源,并采取优化措施或资源调整,可恢复应用性能和系统稳定性。

问题描述

Linux服务器出现以下任一现象时,可能表明存在内存资源瓶颈:

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

  • 通过轻量应用服务器控制台,单击实例名称,查看实例内存使用率监控时,发现内存使用率过高。

  • 收到内存使用率超过设定阈值的告警信息。

排查流程

  1. 状态评估:使用freevmstat等工具,评估系统是否存在内存压力。

  2. 来源定位:若确认内存紧张,则定位消耗内存的源头。通过topps等工具分析是单个进程、多个进程还是内核(如Slab)占用了大量内存。

  3. 分类处理决策:根据定位到的内存消耗来源,采取不同的处理策略。

    • 异常进程:隔离并安全终止未知或异常的进程。

    • 正常业务:升级实例规格或者配置Swap分区作为缓冲。

  4. 持续跟踪:实施解决方案后,配置持续的监控告警,持续检测服务器。

实施步骤

步骤一:评估内存状态

  1. 远程连接Linux服务器

  2. 执行free -h命令查看内存概览。

    free -h

    关注available列,而非free列。available表示在不发生交换(Swap)的情况下,可用于启动新应用程序的预估内存量。

                  total        used        free      shared  buff/cache   available
    Mem:          896Mi       824Mi        68Mi       1.0Mi       146Mi        72Mi
    Swap:            0B          0B          0B
  3. 根据以下标准判断内存是否紧张:

    • 可用内存(Available Memory)过低available内存持续低于总内存的10%。

    • 频繁的交换活动:执行vmstat 1 5命令,观察si(从交换区换入内存)和so(从内存换出到交换区)列。如果这两列的值在多个采样间隔内持续出现较高的数值(例如,每秒都达到几十或上百),则表明系统正在频繁地使用硬盘作为虚拟内存,这是内存不足并已影响性能的明确信号。

    • 系统日志出现OOM Killer:执行dmesg | grep -i "out of memory"命令。若返回"Out of Memory"相关日志,说明内核因内存极度匮乏已强制终止进程。

步骤二:定位内存消耗源头

确认内存紧张后,定位具体的消耗来源。使用如下命令列出内存占用最高的10个进程。

ps aux --sort=-%mem | head -n 10

可以在%MEM列查看内存占比,在PID列查看进程ID。下面示例中可以看到PID25666的进程内存占比达到了60.8%。

USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
admin      25666  1.9 60.8 781904 558612 pts/0   S+   11:06   0:00 python mem_fill.py
root        1506  0.6  2.3 144428 21236 ?        Ssl  Nov27  56:53 /usr/local/aegis/aegis_client/aegis_12_61/AliYunDunMonitor
root         649  0.1  1.9 474952 17708 ?        Ssl  Nov27  15:52 /usr/libexec/platform-python -Es /usr/sbin/tuned -l -P
root        1405  0.7  1.5 1514652 14368 ?       Sl   Nov27  64:30 /usr/local/cloudmonitor/bin/argusagent
root         472  0.0  1.2  69480 11420 ?        Ss   Nov27   0:01 /usr/lib/systemd/systemd-journald
root       19854  0.0  1.2  11212 11096 ?        S<Ls Dec01   0:05 /usr/bin/atop -w /var/log/atop/atop_20251201 600
root       25773  0.1  1.1  16752 10592 ?        Ss   11:06   0:00 sshd: admin [priv]
root        1478  0.3  1.1 100256 10576 ?        Ssl  Nov27  27:48 /usr/local/aegis/aegis_client/aegis_12_61/AliYunDun
root       25739  0.1  1.1  16752 10516 ?        Ss   11:06   0:00 sshd: admin [priv]

步骤三:分场景处理与优化

根据定位到的内存消耗源头,选择对应的解决方案。

场景一:异常进程占用大量内存

若发现非业务相关或行为异常的进程占用了大量内存,需要将其终止。

  1. 确认进程信息。终止进程前,需确认其身份,避免误杀关键系统或业务进程。

    # 将 <PID> 替换为实际的进程ID,示例中是25666
    ps -fp <PID>
  2. 安全终止进程。首先尝试发送SIGTERM(信号15),允许进程正常退出。

    # 将 <PID> 替换为实际的进程ID,示例中是25666
    sudo kill -15 <PID>
    重要

    kill会终止进程,请确保该进程不会影响业务运行。

  3. 等待数秒后,检查进程是否存在。若进程仍在运行,再使用SIGKILL(信号9)强制终止。

    # 将 <PID> 替换为实际的进程ID,示例中是25666
    sudo kill -9 <PID>
    重要

    kill -9会立即终止进程,可能导致数据丢失或文件损坏,仅在kill -15无效时使用。

  4. 如果怀疑进程为恶意程序,可以使用云安全的病毒查杀

    云安全的病毒查杀需要付费使用。

场景二:正常业务进程导致内存瓶颈

若高内存占用是由预期的核心业务进程(如 sqlservr.exew3wp.exejava.exe)引起,这通常表明当前服务器资源已无法满足业务需求。

问题现象

解决方案

单个业务进程内存占用巨大。

可以结合实际情况选择对应的处理策略。

  • 升级实例规格。在控制台执行升级配置操作,选择更高内存的套餐。

  • 优化业务程序。

整体内存使用率持续高位,没有单个进程占用特别突出。

此情况表明实例的整体内存容量已无法承载当前运行的所有服务,最有效的解决方案是升级实例。在控制台执行升级配置操作,选择更高内存的套餐。

步骤四:持续跟踪

  • 效果验证: 执行 free -h 命令,确认 available 字段显示的可用内存已恢复至正常水平。

  • 设置报警: 建议为该服务器的内存使用率或可用内存指标设置报警规则。具体操作见云产品监控

  • 持续监控:安装atop工具监控Linux系统指标

    如果监控发现业务进程内存偶发性飙升,持续时间短,发生频率低。可以通过设置swap分区(交换空间)缓解该问题。详细步骤参考如何配置Linux实例的swap分区?如要彻底解决可以评估是否要升级实例规格。