Memory management 扭曲的过程是巨大的

Memory management 扭曲的过程是巨大的,memory-management,twisted,Memory Management,Twisted,我有一个扭曲的应用程序经常因为内存问题而被杀死。该程序的规模不断扩大,在被操作系统关闭之前消耗了系统的所有内存。重新启动并重复 这是在一个虚拟服务器上,所以我将内存增加了一倍,问题得到了解决——守护进程的内存稳定在1.25GB左右 有没有人建议我如何最好地分析这一点,告诉我所有的记忆都被吸进了什么地方 如果应用程序上的信息有帮助的话,我将使用twisted reactor和internet.timer.TimerService轮询数据库,以通过三个“服务”更新项目。要处理的项被推送到twiste

我有一个扭曲的应用程序经常因为内存问题而被杀死。该程序的规模不断扩大,在被操作系统关闭之前消耗了系统的所有内存。重新启动并重复

这是在一个虚拟服务器上,所以我将内存增加了一倍,问题得到了解决——守护进程的内存稳定在1.25GB左右

有没有人建议我如何最好地分析这一点,告诉我所有的记忆都被吸进了什么地方


如果应用程序上的信息有帮助的话,我将使用twisted reactor和internet.timer.TimerService轮询数据库,以通过三个“服务”更新项目。要处理的项被推送到twisted.internet.defer.DeferredList中,它们的处理在deferToThread块中进行。在延迟的过程中,有少量的阻塞操作(抓取网页等)和大量的HTML解析(Beauty soup和其他库)。我建议reactor.threadpool的大小为10,每个“服务”都使用一个具有10个令牌的信号服务来服从线程。我真的希望这个守护进程的最大内存约为400MB,而不是3倍

这是我如何调试twisted应用程序中的内存泄漏/使用问题的一般想法。 Twisted有一个ssh服务器支持,这是我在开发中几乎所有项目中添加的东西。
ssh提供了一个交互式python解释器,可以访问该方法,该方法具有可用的python垃圾收集器和许多帮助函数,这些函数允许我a)检查来自同一类的实例的计数,b)开始和停止检查该计数随时间的变化,c)获取该类的所有引用。交互式解释器的好处在于,它允许对有问题的实例、它们与其他对象的关系以及它们所处的进程状态进行特别的自省。到目前为止,这一直被证明是一个有价值的工具,可以精确定位我在项目中忘记/未看到ref发布问题的确切位置。

哦,这是一个很好的洞察!非常感谢。我一定会尝试这种方法!在你下面的一个扭曲的问题,有一个关于内存泄漏发现的objgraph建议。实际上,与我前面建议的ssh方法结合使用会非常好。这里-您可以使用它进行交互式内存探索:)