Linux 内存占用分析
Linux 内存占用高的原因可能有很多,通常需要先排查具体情况。以下是可能的原因及解决方案:
⸻
- 检查系统内存使用情况
先运行以下命令查看当前内存占用情况:
free -h
• total:总内存 • used:已使用内存 • free:空闲内存 • buff/cache:缓存(Linux 会尽可能使用空闲内存来做缓存)
如果 free 很少但 buff/cache 很大,说明是正常的,因为 Linux 会缓存文件加速访问。
如果需要释放缓存,可以运行:
```sh
sync && echo 3 > /proc/sys/vm/drop_caches
注意:清理缓存不会释放真正被进程占用的内存,只是释放文件系统缓存。
⸻
- 排查占用内存最高的进程
运行以下命令找到占用内存最高的进程:
ps aux --sort=-%mem | head -n 20
或者:
top
在 top 界面按 M 键,可以按照内存使用率排序。
如果发现某个进程占用异常高,可以考虑: • 是否有内存泄漏 • 是否有大量线程/进程未释放资源 • 是否需要优化进程配置(如 Java、MySQL、Nginx 等)
如果需要终止进程:
kill -9 <PID>
⸻
- 检查 Swap 使用情况
如果 Swap 使用过高,可能会影响性能:
swapon -s
如果 Swap 使用较多,可以尝试调整 Swap 交换策略:
echo 10 > /proc/sys/vm/swappiness
默认 swappiness 是 60,降低这个值可以减少 Swap 的使用,避免过度换页。
⸻
- 检查是否有内存泄漏
如果某个进程的内存持续增长,可以使用 pmap 查看进程的内存映射:
pmap -x <PID>
如果怀疑有泄漏,可以使用 valgrind 或 memleak 工具进行分析。
⸻
- 检查系统日志
可以检查 dmesg 或 syslog 看是否有 OOM(Out Of Memory)相关的错误:
dmesg | grep -i oom
journalctl -k | grep -i oom
如果有 OOM 相关日志,可能是某个进程占用过多内存导致系统杀掉了一些进程。
⸻
- 关闭无用的服务
使用 systemctl 或 chkconfig 关闭不必要的服务:
systemctl list-units --type=service
systemctl stop <服务名>
systemctl disable <服务名>
⸻
- 检查是否有僵尸进程
使用:
ps aux | grep defunct
如果发现有大量
⸻
- 检查是否有恶意进程
如果不明原因内存占用过高,可以使用:
lsof | grep deleted
如果发现某些可疑进程(如挖矿程序),可以终止并查找 rootkit:
rkhunter --check
⸻
总结
如果 Linux 内存占用过高,可以按照以下步骤检查:
1. 是否是缓存占用?(free -h,可手动释放 echo 3 > /proc/sys/vm/drop_caches)
2. 哪个进程占用最多?(top / ps aux --sort=-%mem)
3. Swap 是否被大量使用?(swapon -s,调整 swappiness)
4. 是否有内存泄漏?(pmap -x
如果是特定进程占用过高,可以针对该进程进行优化,例如: • Java 程序:调整 -Xmx,避免过度占用内存 • MySQL / Nginx:调整缓冲池大小 • Node.js / Python:检查内存泄漏
你可以先执行 free -h 和 ps aux --sort=-%mem 看下是什么进程占用最多,再进一步分析。