我有一个泄漏内存的multiprocessing
应用程序。但是,泄漏不在主进程中(根据Dowser和top
),而是在子进程中。有什么办法可以在子过程中使用Dowser(或类似的工具)来追踪泄漏吗?如果没有,它如何追踪它?
更新:我花了很多时间尝试使用heapy和gnibbler's code,但我找不到泄漏。然后我在主进程中停止了cherrypy并在子进程中启动了另一个(带Dowser)。但几分钟后,CherryPy就会停止收听端口... :(所以我仍然在寻找更好的主意。
答案 0 :(得分:3)
我发现memory_profiler非常容易使用,但我不确定它是如何与多处理交互的,因为我从未使用过该模块。有关其他Python分析器的提及,请参阅此answer以获取该线程中的简短说明和其他答案。
答案 1 :(得分:2)
我使用muppy搜索内存泄漏(在外部C库中) - 很棒的工具,我希望我能早点找到它!谢谢大家的回答。
答案 2 :(得分:1)
我发现了一些非常有用的帖子。还没有时间消化它们中的所有信息,但我想发布链接并允许你看看它们。
Marius Gedminas在Python测试套件中有两篇关于狩猎memleaks的帖子。他正在使用内置的gc
和inspect
模块,只是将对象图作为csv文件转储到磁盘上,因此即使对于mp
应用程序,该方法仍然可以正常工作。
当我有空的时候,我会在今天晚些时候调查我的自我。
<强>更新强>
Marius发布了他的测试平台作为一个名为objgraph
(link)的开源项目。它跟踪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