线上的一台机器出现了内存泄漏的情况(内存 2G,htop 发现 Python 程序占用内存 200M,但是 free -m 发现真实使用内存达到了 1G )。
想要找一款工具能够动态检测内存的,找到了这 2 个 pyrasite 和 memory_profiler
第一个 pyrasite 安装极其麻烦,环境都是 centos6,有的机器能装上,有的装不上(依赖问题,要装的依赖软件很多), 装的上的机器使用后看了下,内存检测结果发现,dict 字典占用的内存最多,但是装上的这台机器不具有参考价值,因为不是线上的机器(线上那台装不上 pyrasite)
第二个 memory_profiler 很强大,能检测到每行代码使用的内存变化情况,是使用 @profile 装饰器的,但是我发现这个好像每次只能检测一个 Python 文件? 没法检测整个项目里面加了 @profile 装饰器的吗?可能是我用法不对?
想问下各位,Python 有没有什么好的排查方法来解决这种内存泄漏问题的
1
likuku 2018-10-08 21:26:34 +08:00
htop/top 显示出的 python 内存占用你不信任它么?占用 200M 不多啊。
linux 物理内存也不完全给 top 可见的进程用的。 top 看看,频繁 I/O 时,程序运行时,闲置内存都会尽可能拿来用作系统 cache 和 buff 内存泄露是这样定义的么?我怎么记得是:“某进程 /程序 随着运行时长增加,占用的内存持续增长,不释放内存 /释放内存速度小于新申请内存速度,最终耗尽系统内存"。 |
2
Buffer2Disk OP @likuku 重启 Python 进程后,系统真实使用内存 立马减少了 800M,所以我才判断是 python 程序内存泄漏了
|
3
Buffer2Disk OP @likuku 不是 cache 和 buffer
total used free shared buffers cached Mem: 1926 1735 190 0 117 323 -/+ buffers/cache: 1295 631 Swap: 3999 0 3999 |
4
loqixh 2018-10-08 22:48:49 +08:00 1
htop 显示出内存应该是你的真实内存占用, 重启 Python 立马减少, 是不是句柄泄漏, 占用了内核内存? 如果是这样的话用 pyrasite 和 memory_profiler 也是检测不到的
|
5
Buffer2Disk OP @loqixh 改了下代码,好像是 log 模块导致的。。。?
最近在查另外一个 MySQL 连接的问题,所以在 for 循环里面打印了很多的 log,现在删掉这些 log 的代码,看起来好像正常了,内存没有暴增的现象 |
6
samray 2018-10-09 00:49:43 +08:00
|
7
Buffer2Disk OP @samray 大佬,你没审题啊,我要的检测内存占用的,你发的这个工具是分析时间占用的
|
8
Buffer2Disk OP @loqixh 如果是句柄泄漏的话,有什么好的排查方法吗
|