Python中的内存泄漏Twisted:它在哪里?

时间:2010-11-02 13:25:44

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

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

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

    显示的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。

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

1 个答案:

答案 0 :(得分:2)

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