介绍排查Linux服务器内存使用率过高问题的方法。通过解读内存指标、定位内存消耗来源,并采取优化措施或资源调整,可恢复应用性能和系统稳定性。
问题描述
当Linux服务器出现以下任一现象时,可能表明存在内存资源瓶颈:
系统运行卡顿、服务响应时长较长、应用性能下降等问题。
通过轻量应用服务器控制台,单击实例名称,查看实例内存使用率监控时,发现内存使用率过高。
收到内存使用率超过设定阈值的告警信息。
排查流程
状态评估:使用
free和vmstat等工具,评估系统是否存在内存压力。来源定位:若确认内存紧张,则定位消耗内存的源头。通过
top、ps等工具分析是单个进程、多个进程还是内核(如Slab)占用了大量内存。分类处理决策:根据定位到的内存消耗来源,采取不同的处理策略。
异常进程:隔离并安全终止未知或异常的进程。
正常业务:升级实例规格或者配置Swap分区作为缓冲。
持续跟踪:实施解决方案后,配置持续的监控告警,持续检测服务器。
实施步骤
步骤一:评估内存状态
执行
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根据以下标准判断内存是否紧张:
可用内存(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。下面示例中可以看到PID为25666的进程内存占比达到了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]步骤三:分场景处理与优化
根据定位到的内存消耗源头,选择对应的解决方案。
场景一:异常进程占用大量内存
若发现非业务相关或行为异常的进程占用了大量内存,需要将其终止。
确认进程信息。终止进程前,需确认其身份,避免误杀关键系统或业务进程。
# 将 <PID> 替换为实际的进程ID,示例中是25666 ps -fp <PID>安全终止进程。首先尝试发送
SIGTERM(信号15),允许进程正常退出。# 将 <PID> 替换为实际的进程ID,示例中是25666 sudo kill -15 <PID>重要kill会终止进程,请确保该进程不会影响业务运行。等待数秒后,检查进程是否存在。若进程仍在运行,再使用
SIGKILL(信号9)强制终止。# 将 <PID> 替换为实际的进程ID,示例中是25666 sudo kill -9 <PID>重要kill -9会立即终止进程,可能导致数据丢失或文件损坏,仅在kill -15无效时使用。如果怀疑进程为恶意程序,可以使用云安全的病毒查杀。
云安全的病毒查杀需要付费使用。
场景二:正常业务进程导致内存瓶颈
若高内存占用是由预期的核心业务进程(如 sqlservr.exe, w3wp.exe, java.exe)引起,这通常表明当前服务器资源已无法满足业务需求。
问题现象 | 解决方案 |
单个业务进程内存占用巨大。 | 可以结合实际情况选择对应的处理策略。
|
整体内存使用率持续高位,没有单个进程占用特别突出。 | 此情况表明实例的整体内存容量已无法承载当前运行的所有服务,最有效的解决方案是升级实例。在控制台执行升级配置操作,选择更高内存的套餐。 |
步骤四:持续跟踪
效果验证: 执行
free -h命令,确认available字段显示的可用内存已恢复至正常水平。设置报警: 建议为该服务器的内存使用率或可用内存指标设置报警规则。具体操作见云产品监控。
持续监控:安装atop工具监控Linux系统指标。
如果监控发现业务进程内存偶发性飙升,持续时间短,发生频率低。可以通过设置swap分区(交换空间)缓解该问题。详细步骤参考如何配置Linux实例的swap分区?如要彻底解决可以评估是否要升级实例规格。