傲来云 发表于 前天 17:13

Linux 内存泄漏排查实战指南

内存泄漏是服务稳定性的“隐形杀手”,如果不及时排查,很可能导致服务崩溃、系统卡死、OOM(Out of Memory)等严重后果。尤其在高并发、长时间运行的服务中,内存泄漏问题更容易被放大,如何定位 Linux 系统中可能存在的内存泄漏问题。

一、怎么判断系统内存“泄漏”了?
常见症状:
服务运行时间越久,占用内存越高,重启后恢复正常
系统总内存使用持续增长,但缓存/释放不下来
top 或 free -m 显示内存占用非常高,swap 被频繁使用
dmesg 或 /var/log/messages 出现 OOM kill 日志

二、常用排查命令
1. 查看整体内存使用情况
free -h关键看 used(已用内存)是否持续增长和 available 是否越来越小

2. 查找内存占用最多的进程
top -o %MEM
# 或者
ps aux --sort=-%mem | head -20
3. 查看进程内存详细情况
pmap -x <pid> | sort -k3 -n | tail -20
4. 观察 slab 缓存增长
slabtop如果 slabtop 某些项目持续增长,可能是内核态内存泄漏

三、进阶排查方法
1. 使用 smem 工具查看真实进程内存
smem -r -k -t能更准确统计共享内存、私有内存等细节
安装:yum install smem 或 apt install smem

2. 查看具体程序内存增长(如 Nginx、PHP、Java)
watch -n 2 pmap -x <pid> | tail -n 1连续观察数分钟是否持续增长

3. 使用 valgrind 跟踪 C/C++ 应用泄漏
valgrind --leak-check=full ./your_app
4. Python 内存泄漏排查
使用 objgraph、tracemalloc 分析对象增长:
import tracemalloc
tracemalloc.start()
# ...
snapshot = tracemalloc.take_snapshot()
5. PHP 内存泄漏
开启慢日志 + 内存峰值记录:
php.ini:
memory_limit = 512M
request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm.slow.log
四、应对方法建议
尽量使用长连接池 + 关闭连接时手动释放资源
程序语言层级设置内存限制(如 PHP、Java)
使用守护进程或定时重启策略清除泄漏(如 PHP-FPM、Supervisor)
多线程程序注意回收子线程变量
对长生命周期变量定期清理(缓存、Session、Redis Key 等)

五、总结
判断是否是内存泄漏 → 监控曲线、内存快照对比
找出泄漏进程 top / pmap / smem
分析程序层面代码逻辑 → 语言相关工具
临时措施:定时重启;根本方案:修复代码、优化结构

页: [1]
查看完整版本: Linux 内存泄漏排查实战指南