Linux设备内存不足如何处理
[root@localhost ~]# free -mtotal used free shared buff/cache available
Mem: 31208 14317 1280 1551 15610 14657
Swap: 15927 2781 13146
[root@localhost ~]#
从 free -m
输出来看,当前系统并非物理内存完全耗尽(物理内存 free 为 1280MB,available 为 14657MB),但存在「内存使用偏高、空闲内存较少」的情况。核心原因是 Linux 会主动利用空闲内存作为 buff/cache
(缓存文件/目录元数据、磁盘读写数据)以提升性能,因此需先区分「真实内存不足」和「缓存占用过高」,再针对性处理。
一、先理解当前内存状态(关键指标解读)
指标 | 数值(MB) | 含义解读 |
---|---|---|
total | 31208 | 物理内存总大小(约 30.5GB) |
used | 14317 | 已被进程实际占用的内存(不含缓存) |
free | 1280 | 完全空闲的内存(未被任何进程/缓存使用) |
buff/cache | 15610 | 缓存(page cache)+ 缓冲区(buffer),可被内核主动回收(不影响进程) |
available | 14657 | 真正可分配给新进程的内存(= free + 可回收的 buff/cache),当前充足 |
Swap used | 2781 | 已使用的交换分区(约 2.7GB),说明部分内存数据已交换到磁盘(需关注) |
二、分场景处理方案
场景1:临时释放缓存(buff/cache 占用过高,需快速腾内存)
Linux 的 buff/cache
是「可回收资源」,当系统需要内存时内核会自动回收,但也可手动触发释放(无风险,不影响运行中进程)。
执行以下命令释放缓存(需 root 权限):
# 1. 释放页缓存(page cache,最主要的缓存类型)
echo 1 > /proc/sys/vm/drop_caches# 2. 释放页缓存 + 目录项缓存(dentries)+ inode 缓存
echo 2 > /proc/sys/vm/drop_caches# 3. 释放所有可回收缓存(推荐,释放最彻底)
echo 3 > /proc/sys/vm/drop_caches
执行后再次用 free -m
查看,会发现 free
内存增加,buff/cache
减少(例如从 15GB 降至几 GB)。
场景2:排查高内存占用进程(找到“内存大户”)
若 used
内存持续过高(如超过 80%),需定位具体是哪些进程消耗内存,判断是否为异常占用(如内存泄漏、不合理的进程配置)。
步骤1:查看进程内存占用(按内存使用率排序)
# 方法1:用 top 实时查看(按「M」键切换为内存使用率排序)
top# 方法2:用 ps 输出详细内存占用(按 %MEM 降序,显示前20个进程)
ps -aux --sort=-%mem | head -n 20
关键指标解读(ps 输出中):
%MEM
:进程占用的物理内存百分比(核心参考);VSZ
:进程虚拟内存大小(含共享库、交换区,参考意义低);RSS
:进程实际占用的物理内存大小(不含缓存,真实内存消耗)。
处理高内存进程:
-
正常进程(如数据库、应用服务):
若进程内存增长合理(如 MySQL 缓存数据),可检查其配置是否过高(例如 JVM 的-Xmx
设太大、MySQL 的innodb_buffer_pool_size
超过物理内存 50%),适当下调配置(需重启进程生效)。 -
异常进程(如无名进程、内存泄漏进程):
若进程无正常用途(如僵尸进程、恶意进程),或内存持续增长不释放(内存泄漏),可先尝试优雅停止(如systemctl stop 服务名
),若无法停止则强制杀死(kill -9 进程PID
),并排查进程来源(避免再次启动)。
场景3:优化交换分区(Swap)使用
当前 Swap 已使用 2.7GB,若物理内存仍充足却频繁使用 Swap,会导致系统性能下降(磁盘速度远慢于内存),需调整内核参数减少 Swap 依赖。
1. 查看当前 Swap 使用率和内核参数
# 查看 Swap 详细使用(哪些进程用了 Swap)
for i in $(cd /proc; ls -d [0-9]*); do echo -n "$i "; grep VmSwap /proc/$i/status 2>/dev/null; done | sort -k 2 -n -r | head -n 10# 查看内核 Swap 调整参数(swappiness)
cat /proc/sys/vm/swappiness
swappiness
含义:内核使用 Swap 的倾向,取值 0-100(值越高越容易用 Swap);
推荐设置:物理内存充足时设为 10-20(减少 Swap 使用),内存紧张时设为 50-60。
2. 临时调整 swappiness(重启后失效)
echo 10 > /proc/sys/vm/swappiness
3. 永久调整 swappiness(重启生效)
编辑 /etc/sysctl.conf
文件,添加或修改以下行:
vim /etc/sysctl.conf
# 添加:
vm.swappiness = 10# 生效配置
sysctl -p
场景4:长期优化(避免内存不足反复出现)
-
升级物理内存(根本方案):
若系统长期available
内存低于 20%,且高内存进程是业务必需(如大数据服务、多虚拟机),建议增加物理内存(如从 32GB 升级到 64GB),这是最彻底的解决方式。 -
优化应用配置(减少不必要的内存占用):
- 对于 Java 应用:调整 JVM 参数(
-Xms
初始堆、-Xmx
最大堆),避免堆内存设太大导致浪费(例如 32GB 内存的机器,-Xmx
建议不超过 16GB); - 对于数据库(MySQL/MongoDB):缓存参数(如
innodb_buffer_pool_size
)建议设为物理内存的 40%-50%(避免独占过多内存); - 对于Web服务(Nginx/Apache):限制并发进程/线程数(如 Nginx 的
worker_processes
设为 CPU 核心数,避免过多进程占用内存)。
- 对于 Java 应用:调整 JVM 参数(
-
清理无用进程/服务:
检查系统中是否有长期闲置的服务(如postfix
、telnet
、无用的监控插件),停止并禁用其开机启动:# 查看开机启动服务 systemctl list-unit-files --type=service | grep enabled# 停止并禁用无用服务(例如禁用 postfix) systemctl stop postfix systemctl disable postfix
-
监控内存变化(提前预警):
用nmon
、glances
或prometheus + grafana
搭建内存监控,当available
内存低于 10% 时触发告警,避免内存耗尽导致进程崩溃。
三、注意事项
- 不要盲目关闭缓存:
buff/cache
是 Linux 提升磁盘性能的关键,手动释放后若系统再次读写磁盘,缓存会重新增长(属于正常现象),无需频繁释放; - 谨慎使用 kill -9:强制杀死进程可能导致数据丢失(如未保存的数据库事务),优先尝试优雅停止(如
kill 进程PID
或服务管理命令); - Swap 并非越多越好:交换分区过大(如超过物理内存 2 倍)会导致系统过度依赖磁盘,反而降低性能,建议根据实际内存需求设置(一般为物理内存的 1-1.5 倍)。
通过以上步骤,可先临时释放缓存缓解内存压力,再定位高内存进程并优化配置,最终结合长期监控和硬件升级,彻底解决 Linux 内存不足问题。