我有一个负载很大的 Twisted 服务器。当服务器处于负载下时,内存使用量会增加,并且永远不会被回收(即使没有更多的客户端)。下次进入高负载时,内存使用量再次增加。这是当时情况的快照:
- RSS 内存为 400 MB(通常最大客户端数应为 200MB)。
- gc.garbage 是空的,所以没有不可回收的对象。
- 使用 objgraph.py 显示没有明显的泄漏候选者(正常、健康的进程与泄漏进程之间没有显着差异)。
- 使用 pympler 显示 Python 对象(主要是 dict、list、str 和其他 native 容器)使用了几十 MB(仅)。 启用 leak-check=full 的
Valgrind 没有显示任何重大泄漏(只有几 MB“最终丢失”)- 因此 C 扩展不是罪魁祸首。总内存也不会与 top 显示的 400MB+ 相加:
==23072== HEAP SUMMARY:<br/> ==23072== in use at exit: 65,650,760 bytes in 463,153 blocks<br/> ==23072== total heap usage: 124,269,475 allocs, 123,806,322 frees, 32,660,215,602 bytes allocated
我能找到的唯一解释是有些对象没有被垃圾收集器跟踪,所以它们没有被 objgraph 和 pympler 显示,但却使用了大量的 RAM。
我还有哪些其他工具或解决方案?使用 sys.getobjects 在 Debug模式下编译 Python 解释器会有帮助吗?
最佳答案
如果代码只是在负载下泄漏(您是否对此进行了验证?),我会查看缓冲消息的所有位置。进程本身的内存占用会增加吗?还是系统内存占用增加?如果是后一种情况,您的服务器可能只是速度太慢而无法跟上传入的消息并且操作系统缓冲区已满..
关于python - Python Twisted 中的内存泄漏 : where is it?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4078084/