|
这里或许是互联网从业者的最后一片净土,随客社区期待您的加入!
您需要 登录 才可以下载或查看,没有账号?立即注册
×
内存泄漏是服务稳定性的“隐形杀手”,如果不及时排查,很可能导致服务崩溃、系统卡死、OOM(Out of Memory)等严重后果。尤其在高并发、长时间运行的服务中,内存泄漏问题更容易被放大,如何定位 Linux 系统中可能存在的内存泄漏问题。
一、怎么判断系统内存“泄漏”了?
常见症状:
服务运行时间越久,占用内存越高,重启后恢复正常
系统总内存使用持续增长,但缓存/释放不下来
top 或 free -m 显示内存占用非常高,swap 被频繁使用
dmesg 或 /var/log/messages 出现 OOM kill 日志
二、常用排查命令
1. 查看整体内存使用情况
关键看 used(已用内存)是否持续增长和 available 是否越来越小
2. 查找内存占用最多的进程
- top -o %MEM
- # 或者
- ps aux --sort=-%mem | head -20
复制代码
3. 查看进程内存详细情况
- pmap -x <pid> | sort -k3 -n | tail -20
复制代码
4. 观察 slab 缓存增长
如果 slabtop 某些项目持续增长,可能是内核态内存泄漏
三、进阶排查方法
1. 使用 smem 工具查看真实进程内存
能更准确统计共享内存、私有内存等细节
安装: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
分析程序层面代码逻辑 → 语言相关工具
临时措施:定时重启;根本方案:修复代码、优化结构
|
|