python 内存泄漏定位
不同的语言有不同定位的方式。对于golang 而言。pprof 工具已经足够了。C,C++,java 更是有自身的监控定位机制。这里单单阐述python的 内存泄漏。
观察
首先 我们可以从监控工具上看到内存的异常告警。于是开始定位是什么问题导致的。
- 登录到具体容器上。
- ps -auxf 查看具体是哪个进程导致的内存暴涨。(一般也就是单服务容器)
定位思路
业务侧定位
- 最近新上线的代码 通过对比排查
- 对大表的select 操作,比如需要下载一个很大的excel。中间对数据操作不停的生成新的集合,导致数据量巨大。
- 全局变量不停增加数据。
- 程序GC 不能回收对象,针对python 而言,循环引用对象,自己实现了__del__ 方法。
- python GC 被禁止。
以上的一些方法都是依靠对代码有一定的熟悉程度。对新增的东西进行防范。
工具侧定位
对于进程而言,对正在执行中的进程我们可以使用gdb 的方式attach 到这个进程。而gdb主要也是查找调用堆栈。对内存的展示和统计并不具备特别的优势。
针对python 的两个工具。没有侵入性
pyrasite
Pyrasite is a library and a set of tools for injecting code into running Py