【发布时间】: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