Python Twisted中的内存泄漏:在哪里?

13 投票
1 回答
2869 浏览
提问于 2025-04-16 06:26

我有一个在高负载下运行的Twisted服务器。当服务器负载增加时,内存使用量也会增加,而且即使没有客户端连接,这部分内存也不会被回收。下次负载再次增加时,内存使用量又会再次上升。以下是当时情况的快照:

  • RSS内存使用量是400MB(正常情况下,最大客户端数量时应该是200MB)。
  • gc.garbage是空的,所以没有无法回收的对象。
  • 使用objgraph.py查看时,没有明显的内存泄漏对象(正常健康的进程和有泄漏的进程之间没有显著差异)。
  • 使用pympler显示只有几十MB(仅)被Python对象使用(主要是字典、列表、字符串和其他原生容器)。
  • 使用Valgrind并开启完整的泄漏检查,显示没有重大泄漏(只有几MB被“明确丢失”)——所以C扩展不是问题所在。总内存使用量也和top显示的400MB+不一致:

    ==23072== 堆内存总结:
    ==23072== 退出时使用: 65,650,760 字节,分布在 463,153 个块中
    ==23072== 总堆内存使用: 124,269,475 次分配,123,806,322 次释放,32,660,215,602 字节已分配

我能想到的唯一解释是,有些对象没有被垃圾回收器追踪到,因此在objgraph和pympler中没有显示,但却占用了大量的内存。

我还有什么其他工具或解决方案可以尝试?编译Python解释器为调试模式,使用sys.getobjects会有帮助吗?

1 个回答

2

如果代码在负载下才出现内存泄漏(你确认过这一点吗?),我建议你检查一下所有存储消息的地方。看看这个程序本身的内存使用量有没有增加?或者系统的内存使用量有没有增加?如果是后者,那可能是你的服务器处理消息的速度太慢,导致操作系统的缓冲区填满了。

撰写回答