跟踪Python中的内存泄漏(多处理)

时间:2012-10-30 07:51:33

标签: python memory-leaks multiprocessing

我有一个泄漏内存的multiprocessing应用程序。但是,泄漏不在主进程中(根据Dowsertop),而是在子进程中。有什么办法可以在子过程中使用Dowser(或类似的工具)来追踪泄漏吗?如果没有,它如何追踪它?

更新:我花了很多时间尝试使用heapygnibbler's code,但我找不到泄漏。然后我在主进程中停止了cherrypy并在子进程中启动了另一个(带Dowser)。但几分钟后,CherryPy就会停止收听端口... :(所以我仍然在寻找更好的主意。

3 个答案:

答案 0 :(得分:3)

我发现memory_profiler非常容易使用,但我不确定它是如何与多处理交互的,因为我从未使用过该模块。有关其他Python分析器的提及,请参阅此answer以获取该线程中的简短说明和其他答案。

答案 1 :(得分:2)

我使用muppy搜索内存泄漏(在外部C库中) - 很棒的工具,我希望我能早点找到它!谢谢大家的回答。

答案 2 :(得分:1)

我发现了一些非常有用的帖子。还没有时间消化它们中的所有信息,但我想发布链接并允许你看看它们。

Marius Gedminas在Python测试套件中有两篇关于狩猎memleaks的帖子。他正在使用内置的gcinspect模块,只是将对象图作为csv文件转储到磁盘上,因此即使对于mp应用程序,该方法仍然可以正常工作。

当我有空的时候,我会在今天晚些时候调查我的自我。

<强>更新

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

文档非常自我解释,我也看不出它为什么不适用于mp应用程序的原因。

但是,如果您的内存泄漏来自某些底层c库,那么这可能对您没有帮助。至少它应该让你知道泄漏的位置。如果事实证明不在您的python代码中,那么您可能必须重构代码,以便您可以在主进程中运行相关的c-library并使用类似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