最近给系统做了一点优化,前几天去查看系统监控,想看看上线前后cpu使用率曲线变化情况。查看的时候意外发现上线前后内存占用相差不少,20%以上。
本来我没怎么在意这个问题,因为我们系统会在运行过程中缓存部分数据内容。但客户觉得有异常,坚持要查。于是把一个月的内存使用情况调出来看,这一看就发现问题了:
系统内存占用确实是在缓慢增加,一两天的内存使用率曲线看不出什么,但一个月的可以明显看出来,是一条斜率很小的直线。
发现了有内存泄漏,但是想具体分析是哪个进程泄漏的还真不好办。因为我们系统有上千个进程在跑,而监控系统又只记录了总体内存占用情况,没记录单个进程内存占用。
没有枪,没有炮,只能自己来造 :) 。 我设计了一个简单的分析方法:
1 首先,我写一个脚本,每天定期记录系统所有进程使用情况,保存到文件,以时间戳命名。(用ps实现)
2 脚本跑几天后,我再使用另一个脚本,把文件合并起来分析,把每个进程在不同时间点的内存使用情况合并成一行,逐个进程输出
3 比较每个进程第一次出现与最后一次出现时占用内存之差,按从小到大排序,即可得出可能存在内存泄漏的程序。
效果如下:可以看出这个进程内存占用一直在增加,从第一次统计到最后一次统计之间内存使用增加了1460k
知道问题后就好办了,使用valgrind+gdb很快就找出导致内存泄漏的代码,纠正即可。
下面是分析过程中用到的脚本,希望对大家有帮助
© 著作权归作者所有
发表评论