我有一个负载的Twisted服务器。当服务器负载不足时,内存使用量会增加,并且永远不会回收(即使没有更多客户端)。下次进入高负载时,内存使用量再次增加。这是当时情况的快照:
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吗?
答案 0 :(得分:2)
如果代码只是在负载下泄漏(你验证了吗?),我会看看缓冲消息的所有位置。进程本身的内存使用量是否增加?或者系统的内存使用量增加了吗?如果是后一种情况,您的服务器可能只是太慢而无法跟上传入的消息并且操作系统缓冲区已满了......