Python 程序内存泄漏,有什么好的排查方法吗?

2018-10-08 21:08:06 +08:00
 Buffer2Disk

线上的一台机器出现了内存泄漏的情况(内存 2G,htop 发现 Python 程序占用内存 200M,但是 free -m 发现真实使用内存达到了 1G )。

想要找一款工具能够动态检测内存的,找到了这 2 个 pyrasite 和 memory_profiler

第一个 pyrasite 安装极其麻烦,环境都是 centos6,有的机器能装上,有的装不上(依赖问题,要装的依赖软件很多), 装的上的机器使用后看了下,内存检测结果发现,dict 字典占用的内存最多,但是装上的这台机器不具有参考价值,因为不是线上的机器(线上那台装不上 pyrasite)

第二个 memory_profiler 很强大,能检测到每行代码使用的内存变化情况,是使用 @profile 装饰器的,但是我发现这个好像每次只能检测一个 Python 文件? 没法检测整个项目里面加了 @profile 装饰器的吗?可能是我用法不对?

想问下各位,Python 有没有什么好的排查方法来解决这种内存泄漏问题的

4498 次点击
所在节点    程序员
8 条回复
likuku
2018-10-08 21:26:34 +08:00
htop/top 显示出的 python 内存占用你不信任它么?占用 200M 不多啊。

linux 物理内存也不完全给 top 可见的进程用的。

top 看看,频繁 I/O 时,程序运行时,闲置内存都会尽可能拿来用作系统 cache 和 buff

内存泄露是这样定义的么?我怎么记得是:“某进程 /程序 随着运行时长增加,占用的内存持续增长,不释放内存 /释放内存速度小于新申请内存速度,最终耗尽系统内存"。
Buffer2Disk
2018-10-08 22:41:32 +08:00
@likuku 重启 Python 进程后,系统真实使用内存 立马减少了 800M,所以我才判断是 python 程序内存泄漏了
Buffer2Disk
2018-10-08 22:42:35 +08:00
@likuku 不是 cache 和 buffer

total used free shared buffers cached
Mem: 1926 1735 190 0 117 323
-/+ buffers/cache: 1295 631
Swap: 3999 0 3999
loqixh
2018-10-08 22:48:49 +08:00
htop 显示出内存应该是你的真实内存占用, 重启 Python 立马减少, 是不是句柄泄漏, 占用了内核内存? 如果是这样的话用 pyrasite 和 memory_profiler 也是检测不到的
Buffer2Disk
2018-10-08 23:57:06 +08:00
@loqixh 改了下代码,好像是 log 模块导致的。。。?

最近在查另外一个 MySQL 连接的问题,所以在 for 循环里面打印了很多的 log,现在删掉这些 log 的代码,看起来好像正常了,内存没有暴增的现象
samray
2018-10-09 00:49:43 +08:00
Buffer2Disk
2018-10-09 10:12:45 +08:00
@samray 大佬,你没审题啊,我要的检测内存占用的,你发的这个工具是分析时间占用的
Buffer2Disk
2018-10-09 10:16:23 +08:00
@loqixh 如果是句柄泄漏的话,有什么好的排查方法吗

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/495729

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX