Python Twisted中的内存泄漏:它在哪里?
我有一台Twisted服务器正在加载。当服务器处于负载状态时,内存使用会增加,并且永远不会回收(即使没有更多的客户端)。下次它进入高负载时,内存使用量会再次增加。以下是当时情况的快照:Python Twisted中的内存泄漏:它在哪里?,python,memory-leaks,garbage-collection,twisted,memory-management,Python,Memory Leaks,Garbage Collection,Twisted,Memory Management,我有一台Twisted服务器正在加载。当服务器处于负载状态时,内存使用会增加,并且永远不会回收(即使没有更多的客户端)。下次它进入高负载时,内存使用量会再次增加。以下是当时情况的快照: RSS内存为400 MB(通常最大客户端数应为200 MB) 垃圾是空的,因此没有无法收集的对象 使用objgraph.py显示没有明显的泄漏候选(正常、健康的过程与泄漏过程之间没有显著差异) 使用pympler显示Python对象(主要是dict、list、str和其他本机容器)使用的几十MB(仅) Valg
- RSS内存为400 MB(通常最大客户端数应为200 MB)
- 垃圾是空的,因此没有无法收集的对象
- 使用objgraph.py显示没有明显的泄漏候选(正常、健康的过程与泄漏过程之间没有显著差异)
- 使用pympler显示Python对象(主要是dict、list、str和其他本机容器)使用的几十MB(仅)
- Valgrind启用泄漏检查=完全时不会显示任何重大泄漏(只有两个MBs“最终丢失”)-因此C扩展不是罪魁祸首。总内存与顶部显示的400MB+内存之和也不相同:
==23072==堆摘要:
==23072==在出口处使用:463153块中的650760字节
==23072==总堆使用率:124269475 allocs,123806322 frees,32660215602字节分配
我还有哪些其他工具或解决方案?使用sys.getobjects在调试模式下编译Python解释器会有帮助吗?如果代码仅在加载时泄漏(您验证了吗?),我会查看消息缓冲的所有位置。进程本身的内存使用是否增加?还是系统的内存使用增加了?如果是后一种情况,您的服务器可能太慢,无法跟上传入的消息,并且操作系统缓冲区已满。否,问题在于进程本身的内存使用情况。是的,这似乎与负载问题有关,因为一个进程可以持续数天而不增加内存。另一个需要关注的工具是heapy。上的答案给出了一个您可能希望使用它的方法的示例。我尝试过这种方法,但不幸的是,当我尝试使用它时,Heapy会使进程崩溃。这种情况是否仅在使用PyPy或与CPython一起使用时才会发生?