【问题标题】:Memory leak in Python Twisted: where is it?Python Twisted 中的内存泄漏:它在哪里?
【发布时间】:2011-05-03 22:43:56
【问题描述】:

我有一个 Twisted 服务器正在加载。当服务器负载不足时,内存使用量会增加,并且永远不会回收(即使没有更多客户端)。下次它进入高负载时,内存使用量再次增加。以下是当时情况的快照:

  • RSS 内存为 400 MB(通常最大客户端数应为 200MB)。
  • gc.garbage 为空,因此没有无法收集的对象。
  • 使用 objgraph.py 显示没有明显的泄漏候选者(正常、健康的进程与泄漏进程之间没有显着差异)。
  • 使用 pympler 显示 Python 对象(主要是 dict、list、str 和其他本机容器)使用了几十 MB(仅)。
  • Valgrind 启用了泄漏检查=完全不会显示任何重大泄漏(只有几个 MB '确定丢失')​​-因此 C 扩展不是罪魁祸首。总内存也没有与 top 所示的 400MB+ 相加:

    ==23072== HEAP SUMMARY:
    ==23072== in use at exit: 65,650,760 bytes in 463,153 blocks
    ==23072== total heap usage: 124,269,475 allocs, 123,806,322 frees, 32,660,215,602 bytes allocated

我能找到的唯一解释是垃圾收集器没有跟踪某些对象,因此 objgraph 和 pympler 没有显示它们,但使用了大量的 RAM。

我还有哪些其他工具或解决方案?使用 sys.getobjects 在调试模式下编译 Python 解释器会有帮助吗?

【问题讨论】:

  • 另一个值得一看的工具是 heapy。 stackoverflow.com/questions/1331561/… 上的答案给出了您可能想要使用它的一种方式的示例。
  • 我试过了,不幸的是,当我尝试使用它时,Heapy 崩溃了。
  • 只有在使用 PyPy 或 CPython 时才会出现这种情况吗?

标签: python memory-leaks garbage-collection twisted memory-management


【解决方案1】:

如果代码仅在负载下泄漏(您验证了吗?),我会查看所有缓冲消息的位置。进程本身的内存使用量会增加吗?还是系统的内存使用增加了?如果是后一种情况,您的服务器可能太慢了,无法跟上传入的消息并且操作系统缓冲区已填满..

【讨论】:

  • 不,问题在于进程本身的内存使用情况。是的,这似乎与负载问题有关,因为一个进程可以持续数天而不会增加内存。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-25
  • 1970-01-01
  • 2012-04-09
相关资源
最近更新 更多