Django每次请求内存使用量增加
我把我的第一个Django项目从DjangoEurope迁移到了Webfaction,结果出现了一个看起来像是内存泄漏的问题。每次请求时,服务器的内存使用量大约增加500KB,而且这个内存使用量不会下降。这样持续下去,直到Webfaction因为内存使用过多而强制关闭它。
我在浏览器中刷新Django的管理界面时,可以明显看到这个问题(虽然这个问题在每个页面上都会发生,不仅仅是管理界面——我觉得管理界面是个不错的测试案例,因为那里没有我直接写的代码)。每次浏览器重新加载时,内存使用量都会增加几百KB。
我使用Webfaction建议的命令来测试内存:
ps -u publica -o rss,etime,pid,command
关于我的设置:
- Django 1.1(稳定版)
- 使用Apache和mod_wsgi的默认Webfaction Django设置
DEBUG
设置为False
- 使用Webfaction的MySQLdb 1.2.2,但听说它有一些问题,所以我尝试了1.2.3c版本,但没有帮助。
编辑:我创建了一个空的Django项目——默认的Django配置加上django.contrib.admin
和一个新的空数据库(尝试了mysql和postgresql)。我开始在浏览器中重新加载Django管理界面,并观察内存使用情况。起初我看到问题出现——每次重新加载后内存使用量增加。但随后它稳定下来,不再增长。这和我在Django Europe上原始项目的表现一致。不幸的是,在Webfaction上,它似乎从未稳定下来(或者至少在我账户的内存限制内没有稳定下来)。有什么建议吗?
8 个回答
你检查过这些建议吗? -> http://blog.webfaction.com/tips-to-keep-your-django-mod-python-memory-usage-down
我们在WebFaction上部署了一个应用, 并且没有遇到那些问题。
你按照他们的建议来处理静态文件了吗?
顺便说一下,这个链接也可能有用: http://fightingrabbits.com/archives/198
我们在Webfaction上遇到过类似的问题,但最后发现根本不是他们的错。其实是Django里面有个bug,导致在使用包含很多元素的网站地图时,会消耗大量内存:http://code.djangoproject.com/ticket/11572
当我们把网站地图去掉后,内存使用量就不再一下子飙升到90Mb了。觉得这个问题值得提一下,因为我们花了很长时间才找到原因。
我很抱歉,我没有找到明确的答案。Graham Dumpleton给出的建议非常有帮助,但不幸的是,他没有写成正式的回答(只是一些评论),所以我无法接受他的回复。
虽然我还没有完全解决这个问题,但我可以给其他遇到类似问题的人一些基本的建议:
- 阅读Webfaction的文档:
- 确保
DEBUG
设置为False
- 不要使用
mod_python
,要使用mod_wsgi
- 确保使用最新版本的
mod_wsgi
(Webfaction通常会安装旧版本) - 不要用Django来提供静态内容
- 尝试以守护进程模式运行
mod_wsgi
(Webfaction默认安装的是嵌入模式)[感谢Graham Dumpleton的建议] - 如果你在嵌入模式下运行,可以指定“inactivity-timeout=[秒数]”选项。这样在[秒数]的非活动后会重启进程,有助于减少内存使用。阅读这个论坛帖子获取详细说明。
- 这个脚本可以帮助你更轻松、更准确地监控内存使用情况[感谢ClaudioA的建议]