Linux系统运行过程中,内存不足是较为常见的问题,轻则导致程序响应变慢,重则引发进程被系统强制终止,影响业务正常运行。遇到这类问题时,需要按照排查、临时处理、长期优化的步骤逐步解决。

一、排查内存使用情况
首先需要明确当前系统的内存占用状态,定位内存消耗的主要来源,常用的排查命令有以下两种。
1. 使用free命令查看整体内存状态
free命令可以快速展示系统总内存、已用内存、空闲内存以及swap的使用情况,执行以下命令可以看到详细数据:
# 以人类可读的格式显示内存信息 free -h
输出结果中,Mem行代表物理内存的使用情况,Swap行代表交换分区的使用情况。如果available数值过低,说明系统可用内存已经不足。
2. 使用top命令定位高内存进程
top命令可以实时展示所有进程的资源占用情况,按内存占用排序可以快速找到消耗内存最多的进程:
# 启动top命令后按Shift+M按内存占用降序排列 top
在top的输出结果中,RES列代表进程实际占用的物理内存大小,%MEM列代表该进程占用总内存的百分比,记录下占用过高的进程的PID,方便后续处理。
二、临时应对内存不足的方法
如果内存不足已经影响到系统正常运行,可以先采取以下临时措施快速释放内存。
1. 释放系统缓存
Linux系统会自动使用空闲内存作为文件缓存,这些缓存可以在需要时释放,执行以下命令可以清理页缓存、目录项缓存和 inode 缓存:
# 清理系统缓存,需要root权限 echo 3 > /proc/sys/vm/drop_caches
注意该操作不会释放正在使用的内存,仅释放可回收的缓存,不会对运行中的程序造成影响。
2. 调整swap空间
如果系统swap空间不足,可以临时创建swap文件扩展交换分区:
# 创建2G大小的swap文件 dd if=/dev/zero of=/swapfile bs=1M count=2048 # 设置文件权限 chmod 600 /swapfile # 格式化swap文件 mkswap /swapfile # 启用swap文件 swapon /swapfile
3. 终止异常进程
如果某个进程异常占用大量内存,可以使用kill命令终止该进程:
# 替换PID为实际占用内存过高的进程ID kill -9 PID
三、长期优化方案
临时处理只能解决当前问题,还需要从根源上优化,避免内存不足问题反复出现。
1. 优化程序内存占用
检查占用内存过高的程序,是否存在内存泄漏问题,优化程序代码逻辑,减少不必要的内存占用。如果是第三方服务,可以调整其配置文件中的内存相关参数,比如降低Java应用的JVM堆内存上限。
2. 调整系统内存分配参数
可以修改/etc/sysctl.conf文件中的内存相关参数,优化系统内存分配策略:
# 编辑sysctl配置文件 vim /etc/sysctl.conf # 添加以下内容,调整swap使用倾向,数值越低越优先使用物理内存 vm.swappiness=10 # 保存后执行以下命令生效 sysctl -p
3. 升级硬件内存
如果系统长期内存占用过高,且无法通过软件优化解决,可以考虑增加物理内存,从硬件层面彻底解决内存不足的问题。
常见问题说明
很多用户会疑惑为什么free命令显示的空闲内存很少,其实Linux系统会尽可能利用空闲内存作为缓存提升IO性能,这部分缓存属于可回收内存,当程序需要内存时会自动释放,不属于内存不足的情况,只需要关注available数值即可。
注意:操作终止进程、修改系统配置等命令时需要确认操作对象,避免误终止关键系统进程导致系统崩溃。