在Python(多进程)中追踪内存泄漏

16

我有一个使用 multiprocessing 的应用程序存在内存泄漏问题。然而,据 Dowsertop 显示,泄漏并不在主进程中,而是在子进程中。有没有办法在子进程中使用 Dowser(或类似工具)来跟踪泄漏?如果没有,如何追踪它?

更新:我花了很多时间尝试使用heapygnibbler的代码,但是我无法找到泄漏点。然后我停止了主进程中的CherryPy,并在子进程中启动了另一个(使用Dowser)。但是几分钟后,CherryPy将停止监听端口... :( 所以我还在寻找更好的想法。


尝试使用Heapy,参考https://dev59.com/ZFrUa4cB1Zd3GeqPfwNP。 - Stanislav Heller
我花了最近一个小时试图弄清楚如何使用它。我能找到的最好的文档在这里(http://www.smira.ru/wp-content/uploads/2011/08/heapy.html),但我仍然无法获得占用大部分空间的对象列表。你怎么使用它? - johndodo
它泄漏了多少?你确定它实际上是在泄漏内存,而不是主进程和子进程之间共享内存计数错误吗? - Seth
每个进程(我有40个)每天泄漏大约30MB,所以这是非常明显的。另外,系统最终开始使用交换空间并变得无响应。你有任何关于如何调试子进程内存使用的想法吗? - johndodo
3个回答

3

我发现memory_profiler非常易于使用,但我不确定它如何与multiprocessing模块交互,因为我从未使用过该模块。请参阅此答案以获得简短的解释和该线程中其他Python性能分析工具的提及。


3

我使用muppy这个工具找到了内存泄漏问题(它是在外部C库中),真是太棒了,我希望早点发现它!感谢大家的回答。


1

我找到了几篇文章,应该会很有帮助。虽然我还没有时间消化其中的所有信息,但我想我可以把链接发给你,让你也看看。

Marius Gedminas在Python测试套件中有两篇关于查找内存泄漏的文章。他使用内置的gcinspect模块,并将对象图形简单地转储到磁盘上作为csv文件,因此这种方法即使对于mp应用程序也应该非常有效。

今天稍后我会自己研究一下。

更新

Marius发布了他的测试工具作为一个名为objgraph的开源项目(link)。它跟踪gc对象引用,但允许您打印出有用的信息,例如在函数调用后添加了多少个哪种类型的实例,并允许您查看对象的完整引用链。

文档相当自说明,我看不出为什么它不能像mp应用程序一样正常工作。

然而,如果您的内存泄漏来自某些底层c库,则可能无法帮助您。至少它应该让您知道泄漏在哪里。如果最终发现不是在您的Python代码中,则可能需要重构代码,以便您可以在主进程中运行相关的c库,并使用类似Valgrind的工具来检测泄漏。


原始帖子 http://mg.pov.lt/blog/hunting-python-memleaks.html

他更深入介绍了他使用的工具的帖子 http://mg.pov.lt/blog/python-object-graphs.html

让我开始的帖子 http://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接