返回列表 发布新帖
查看: 26|回复: 0

Linux 内存泄漏排查实战指南

发表于 前天 17:13 | 查看全部 |阅读模式

这里或许是互联网从业者的最后一片净土,随客社区期待您的加入!

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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

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

2. 查找内存占用最多的进程
  1. top -o %MEM
  2. # 或者
  3. ps aux --sort=-%mem | head -20
复制代码

3. 查看进程内存详细情况
  1. pmap -x <pid> | sort -k3 -n | tail -20
复制代码

4. 观察 slab 缓存增长
  1. slabtop
复制代码
如果 slabtop 某些项目持续增长,可能是内核态内存泄漏

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

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

3. 使用 valgrind 跟踪 C/C++ 应用泄漏
  1. valgrind --leak-check=full ./your_app
复制代码

4. Python 内存泄漏排查
使用 objgraph、tracemalloc 分析对象增长:
  1. import tracemalloc
  2. tracemalloc.start()
  3. # ...
  4. snapshot = tracemalloc.take_snapshot()
复制代码

5. PHP 内存泄漏
开启慢日志 + 内存峰值记录:
  1. php.ini:
  2. memory_limit = 512M
  3. request_slowlog_timeout = 5s
  4. slowlog = /var/log/php-fpm.slow.log
复制代码

四、应对方法建议
尽量使用长连接池 + 关闭连接时手动释放资源
程序语言层级设置内存限制(如 PHP、Java)
使用守护进程或定时重启策略清除泄漏(如 PHP-FPM、Supervisor)
多线程程序注意回收子线程变量
对长生命周期变量定期清理(缓存、Session、Redis Key 等)

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

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2001-2025 Suike Tech All Rights Reserved. 随客交流社区 (备案号:津ICP备19010126号) |Processed in 0.106189 second(s), 9 queries , Gzip On, MemCached On.
关灯 在本版发帖返回顶部
快速回复 返回顶部 返回列表