Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Twisted中的内存泄漏:它在哪里?_Python_Memory Leaks_Garbage Collection_Twisted_Memory Management - Fatal编程技术网

Python 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

我有一台Twisted服务器正在加载。当服务器处于负载状态时,内存使用会增加,并且永远不会回收(即使没有更多的客户端)。下次它进入高负载时,内存使用量会再次增加。以下是当时情况的快照:

  • 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字节分配

我能找到的唯一解释是,一些对象没有被垃圾收集器跟踪,因此它们没有被objgraph和pympler显示,而是使用了大量的RAM


我还有哪些其他工具或解决方案?使用sys.getobjects在调试模式下编译Python解释器会有帮助吗?

如果代码仅在加载时泄漏(您验证了吗?),我会查看消息缓冲的所有位置。进程本身的内存使用是否增加?还是系统的内存使用增加了?如果是后一种情况,您的服务器可能太慢,无法跟上传入的消息,并且操作系统缓冲区已满。

否,问题在于进程本身的内存使用情况。是的,这似乎与负载问题有关,因为一个进程可以持续数天而不增加内存。另一个需要关注的工具是heapy。上的答案给出了一个您可能希望使用它的方法的示例。我尝试过这种方法,但不幸的是,当我尝试使用它时,Heapy会使进程崩溃。这种情况是否仅在使用PyPy或与CPython一起使用时才会发生?