我有一个负载下的 Twisted 服务器。当服务器处于负载状态时,内存使用量会增加,并且永远不会被回收(即使没有更多的客户端)。下次进入高负载时,内存使用量会再次增加。这是当时情况的快照:
- RSS 内存为 400 MB(通常最大客户端数应为 200MB)。
-
垃圾回收是空的,所以没有不可收集的对象。
- Using objgraph.py显示没有明显的泄漏候选者(正常、健康的过程和泄漏过程之间没有显着差异)。
- Using pympler显示了 Python 对象(主要是 dict、list、str 和其他本机容器)使用的几十 MB(仅)。
-
Valgrind启用leak-check=full 不会显示任何重大泄漏(只有几个MB“最终丢失”) - 因此C 扩展不是罪魁祸首。总内存也不等于显示的 400MB+top:
==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 解释器是否有帮助?
如果代码仅在负载下泄漏(您验证了这一点吗?),我会查看缓冲消息的所有位置。进程本身的内存使用量是否增加?还是系统内存使用量增加了?如果是后一种情况,您的服务器可能太慢而无法跟上传入消息并且操作系统缓冲区已满。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)