python - 减少Django内存使用量。 低挂果实?




profiling memory-management (7)

我的内存使用量随着时间的推移而增加,并且重新启动Django对用户不友好。

我不确定如何去分析内存使用情况,但是关于如何开始测量的一些提示会很有用。

我有一种感觉,有一些简单的步骤可以产生巨大的收益。 确保'debug'被设置为'False'是一个明显的重大事件。

任何人都可以推荐别人吗 在低流量网站上缓存会有多大改进?

在这种情况下,我使用mod_python在Apache 2.x下运行。 我听说mod_wsgi有点精简,但在这个阶段切换会非常棘手,除非我知道收益会很大。

编辑:感谢迄今为止的提示。 任何建议如何发现什么是使用内存? 有没有Python内存分析的指南?

同样如上所述,有几件事情会让我们切换到mod_wsgi变得非常棘手,所以我想对在我们朝这个方向前进的过程中获得的收益有一些了解。

编辑:卡尔在这里发布了一个稍微更详细的回复,值得一读: Django部署:切割Apache的开销

编辑: Graham Dumpleton的文章是我在MPM和mod_wsgi相关内容中找到的最好的文章 。 我很失望,没有人可以提供有关调试应用程序本身的内存使用情况的任何信息。

最终编辑:我一直在讨论Webfaction,看他们是否可以协助重新编译Apache,这是他们在这个问题上的话:

“我真的不认为你可以通过切换到MPM Worker + mod_wsgi设置获得很多好处,我估计你可以节省大约20MB,但可能不会比这更多。”

所以! 这让我回到我原来的问题(我仍然不明白)。 人们如何去确定问题所在? 这是一个众所周知的格言,如果不经过测试就无法进行优化,以查看需要优化的位置,但很少有关于测量Python内存使用情况的教程以及Django没有的特定教程。

感谢大家的帮助,但我认为这个问题仍然是开放的!

另一个最终编辑;-)

我在django-users列表上询问了这个问题,并得到了一些非常有帮助的回复

老实说最后一次更新!

这刚刚发布。 可能是最好的解决方案了: 用Pympler分析Django对象大小和内存使用情况


Webfaction实际上有一些技巧来保持django内存使用率。

主要观点:

  • 确保debug设置为false(你已经知道了)。
  • 在你的apache配置中使用“ServerLimit”
  • 检查内存中没有加载大对象
  • 考虑在单独的进程或服务器中提供静态内容。
  • 在你的apache配置中使用“MaxRequestsPerChild”
  • 找出并了解您使用的内存量

mod_wsgi的另一个WSGIDaemonProcessWSGIDaemonProcess指令中设置maximum-requests参数,而mod_wsgi将每WSGIDaemonProcess重新启动一次守护进程。 对于用户来说应该没有明显的效果,除了第一次新鲜的进程被命中时缓慢的页面加载,因为它会将Django和你的应用程序代码加载到内存中。

但即使您确实有内存泄漏,也应该防止进程大小变得过大,而无需中断向用户提供的服务。



此外,请检查您是否使用任何已知的疏散器。 由于unicode处理中的错误,MySQLdb被称为使用Django泄漏大量内存。 除此之外, Django调试工具栏可能会帮助您跟踪生猪。


缓存:确保它们被刷新。 它很容易在缓存中登陆,但由于缓存参考,永远不会被GC'd。

Swig'd代码:确保任何内存管理都正确完成,在python中很容易错过这些内容,尤其是第三方库

监控:如果可以,请获取有关内存使用情况和命中的数据。 通常你会看到某种类型的请求和内存使用情况之间的关联。


这些是我知道的Python内存分析器解决方案(与Django相关):

免责声明:我拥有后者的股份。

单个项目的文档应该让你了解如何使用这些工具来分析Python应用程序的内存行为。

以下是一个很好的“战争故事”,也提供了一些有用的指针:


除了不保留对大数据对象的全局引用外,尽量避免将大数据集加载到内存中。

在守护进程模式下切换到mod_wsgi,并使用Apache的worker mpm而不是prefork。 后一步可以让您以更少的内存开销为更多的并发用户提供服务。





mod-python