Linux云服务器内存使用率高怎么办?
问题描述
使用Linux ECS实例时,出现如下现象:
- 系统运行卡顿、服务响应时长较长、应用性能下降等问题。
- 通过ECS控制台查看实例内存使用率监控时,发现内存使用率过高(参考值:当前内存使用率> 80%,可认为内存使用率过高)。
- 收到内存使用率超过设定阈值的告警信息。
排查方法
本文相关操作命令以CentOS 7.9 64位操作系统为例。其它版本的Linux操作系统命令可能有所差异,具体情况请参阅相应操作系统的官方文档。
- 使用free命令查看内存总体使用情况。
- 登录弹性云服务器,具体操作,请参见Linux ECS登录方法概述。
- 执行如下命令,查看内存总体使用情况:
回显信息示例如下:
图1 操作结果Mem和Swap行分别表示服务器物理内存和交换空间的使用情况。
表1 参数说明 物理内存(Mem)部分:
交换空间(Swap)部分:
total:系统总物理内存大小
used:已使用的物理内存
free:完全空闲的物理内存
shared:被tmpfs等共享的内存
buff/cache:内核缓冲区(buffers)和页缓存(cache)占用的内存总和
available:估算的可用内存,约等于free+cache
total:交换分区总大小(如果未配置Swap,则显示为0)
used:已使用的交换空间
free:空闲的交换空间
- 使用top查看实例内存使用率情况。
- 登录弹性云服务器,具体操作,请参见Linux ECS登录方法概述。
- 查找当前实例中占用内存过高的进程。
top
按下M键以按照进程的内存使用率进行排序,回显信息示例如下:
表明进程号为1015的进程占用最多的内存。
图2 操作结果
- 处理内存使用率高的问题。
表2 内存占用较多问题的原因及解决方案 问题现象
原因
解决方案
单个用户程序或进程长时间占用大量内存
异常程序,进程占用过多内存。
- 通过在top工具定位到占用内存资源较多的程序的PID,并通过如下方式结束进程。
注意:
在您结束进程前,请务必确保您了解该进程的相关信息,避免因误操作导致您的业务中断。
- 通过sudo kill -15 <PID>来结束该进程。
- 如果怀疑进程为恶意程序,您可以对其进行查杀,相关操作,请参见病毒查杀。
正常用户程序或进程长时间占用大量内存资源。导致内存使用率较高。
该程序为正常业务程序或进程,运行时占用过多内存资源。
如果实例出现内存资源瓶颈,您可以结合实际情况选择相应的处理策略。
- 升级实例规格。相关操作。请参见变更实例规格。
- 优化业务程序。
单个程序或进程偶发过高内存占用,但持续时间较短,且发生频率较低。
程序或进程中存在瞬时流量或定时任务,导致短时间内消耗大量内存。
升级实例规格,相关操作,请参见变更实例规格。
没有单个程序或进程占用大量内存资源,但整体内存使用率较高
当前实例的服务正常运行所需内存资源大于实例的内存规格。
如php业务,php线程数太多可能导致内存不足。
升级实例规格,相关操作,请参见变更实例规格。
free命令查看系统内存,发现free内存不足,且buffers和cached大量占用内存。
业务上有大量文件读写操作,内核持续将数据存入cached。
Web服务器、数据库等长期运行的服务会积累大量缓存(如静态文件、查询结果)
一般来说无需处理,当应用程序需要内存时,内核会自动释放buffers/cached,优先保障应用运行。
如果对业务有影响,可以手动释放:参见Linux操作系统云服务器中buffer和cache占用内存怎么办?。
- 通过在top工具定位到占用内存资源较多的程序的PID,并通过如下方式结束进程。
相关文档
如果是偶现的内存冲高,无法直接观测,则需要安装atop工具定位,详见安装atop。