【问题标题】:tracing memory leaks in Python (multiprocessing)在 Python 中跟踪内存泄漏(多处理)
【发布时间】:2012-10-19 12:58:30
【问题描述】:

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

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

【问题讨论】:

  • 我花了最后一个小时试图弄清楚如何使用它。我能找到的最佳文档是here,但我仍然无法获得构成大部分空间的对象列表。你是怎么用的?
  • 泄漏了多少?您确定它实际上是在泄漏内存,而不是错误地计算了主进程和子进程之间的共享内存吗?
  • 每个进程(我有 40 个)每天泄漏大约 30MB,因此非常明显。此外,系统最终开始使用交换并变得无响应。你知道如何调试子进程的内存使用吗?

标签: python memory-leaks multiprocessing


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我发现了一些应该证明很有帮助的帖子。还没有时间消化其中的所有信息,但我想我会发布链接并让您也看看它们。

      Marius Gedminas 有两篇关于在 Python 测试套件中寻找 memleaks 的帖子。他正在使用内置的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

      【讨论】:

        猜你喜欢
        • 2011-12-12
        • 1970-01-01
        • 1970-01-01
        • 2012-10-14
        • 1970-01-01
        • 2016-08-10
        • 1970-01-01
        • 2013-07-01
        • 1970-01-01
        相关资源
        最近更新 更多