Linux 服务器内存占用过高怎么办?缓存、进程和 OOM 怎么判断
Linux 内存占用高不能只看 used,要结合 available、Swap、OOM 和进程增长趋势判断。本文说明如何区分正常缓存、真实内存不足和异常进程。
Linux 内存占用高并不一定是故障。Linux 会主动把空闲内存用于文件缓存,所以面板显示 used 很高,不代表应用已经没有内存可用。判断内存问题,要看 available、Swap、OOM 和进程变化趋势。
先看 free,不要只看面板百分比
free -h
重点看 `available`。如果 `available` 仍然充足,`buff/cache` 高通常是正常缓存。如果 `available` 很低,并且 Swap 明显使用,才说明内存压力较大。
| 观察结果 | 判断 | 处理方向 |
|---|---|---|
| used 高,available 也高 | 多数是缓存 | 不需要清缓存 |
| available 低,Swap 增长 | 真实内存压力 | 找高内存进程或考虑扩容 |
| 服务突然退出 | 可能发生 OOM | 查内核日志 |
| 某进程持续上涨 | 可能内存泄漏 | 看进程和应用日志 |
找出高内存进程
ps -eo pid,user,cmd,%mem,%cpu --sort=-%mem | head -n 20
这条命令能看到内存占用最高的进程。数据库、Java 应用、游戏服、PHP-FPM、Node.js 都可能正常占用较高内存,关键看是否符合业务规模,以及是否持续增长不回落。
如果某个进程短时间持续上涨,可以间隔几分钟多看几次,而不是只凭一次截图判断。
查是否发生 OOM
dmesg -T | grep -i 'out of memory\|killed process'
如果看到 `Killed process`,说明系统因为内存不足杀过进程。网站 502、数据库断开、游戏服掉线都可能和 OOM 有关。
也可以看内核日志:
journalctl -k -n 100 --no-pager
OOM 日志通常会显示被杀进程的 PID、进程名和内存信息,这比“面板显示内存高”更有判断价值。
Swap 使用怎么看
Swap 不是不能用,但长期大量使用说明内存压力已经影响性能。数据库、游戏服和高并发 Web 服务如果频繁换入换出,会明显变慢。此时应先确认高内存进程是否正常,再决定优化配置或升级内存。
不建议频繁手动清缓存
清缓存会让数字变好看,但通常不是解决方案。缓存本来就是 Linux 提升性能的一部分。真正应该处理的是内存泄漏、进程数过多、配置不合理或业务规模超过当前配置。
什么时候考虑升级
如果业务高峰时 available 长期很低,Swap 持续使用,并且有 OOM 记录,说明配置可能不足。升级前建议记录高峰期进程、内存、访问量和业务类型,避免盲目加配置。
如果高内存来自陌生进程、隐藏路径或外发异常,先按安全事件排查。用户可以查看 free、ps、dmesg 和应用日志;涉及虚拟化资源限制、宿主机异常或扩容迁移时,需要服务商配合。