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