我有一个扭曲的应用程序因内存问题而不断被杀。该程序的大小增加,在被操作系统关闭之前占用了系统的所有内存。重启并重复。
这是在虚拟服务器上,因此我将内存加倍,问题解决了 - 守护程序稳定在大约1.25GB内存
有没有人就如何最好地描述这个以告诉所有内存被吸入的内容有什么建议?
如果应用程序上的信息有帮助,我正在使用twisted反应器和internet.timer.TimerService来轮询数据库以查找通过三个“服务”更新的项目。要处理的项目被推送到twisted.internet.defer.DeferredList,它们的处理发生在deferToThread块中。在延迟过程中,有一些阻塞操作(获取网页等)和大量的HTML解析(美丽的汤和其他库)。我建议将reactor.threadpool大小设置为10,并且每个'service'都使用具有10个令牌的SemaphoreService来延迟线程。我真的希望这个守护进程最大可以达到大约400MB的内存,而不是3倍。
答案 0 :(得分:2)
这更像是我在如何调试扭曲的应用程序中的内存泄漏/使用问题的一般思路。 Twisted有一个ssh服务器支持,是我在开发中几乎所有项目中添加的东西。 ssh提供了一个交互式python解释器访问方法,该方法具有python垃圾收集器和许多辅助函数,这些函数允许我a)检查来自同一类的实例的计数,b)启动和停止检查该计数的更改随着时间的推移,c)获得该类的所有参考。交互式解释器的优点在于它允许对违规实例进行临时内省,它们与其他对象的关系以及它们所处的进程状态。到目前为止,这一直被证明是一种有价值的工具,可以精确定位我忘记的位置。 /不认可我的项目中的ref发布问题。