每次请求都会增加 Django 内存使用量
Posted
技术标签:
【中文标题】每次请求都会增加 Django 内存使用量【英文标题】:Django memory usage going up with every request 【发布时间】:2011-01-18 14:20:06 【问题描述】:我将我的第一个 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 admin 并观察内存使用情况。起初我看到问题正在发生 - 每次重新加载后内存使用量都会增加。但随后它稳定下来并停止增长。这与我最初的项目在 Django Europe 上的表现一致。不幸的是,在 Webfaction 上,它似乎永远不会稳定(或者至少不在我帐户可用的内存限制范围内)。有什么建议吗?
【问题讨论】:
如果您在模型中做一些泄漏的事情,它肯定会出现在管理员中,所以我不确定您是否已将您的代码排除为罪魁祸首。值得一提的是,我已经在 Webfaction 上运行 Django 应用程序一年多了,还没有遇到过这样的问题。 【参考方案1】:恐怕我还没有明确的答案。 Graham Dumpleton 的提示最有帮助,但遗憾的是他没有做出回答(只是 cmets),因此无法接受他的回答。
虽然我还没有完全解决这个问题,但这里有一些基本的提示给遇到类似问题的其他人:
阅读 Webfaction 的文档: Reducing Memory Usage in general Reducing mod_wsgi Memory Consumption Reducing Django Memory Consumption 确保将DEBUG
设置设置为False
不要使用mod_python
,使用mod_wsgi
确保您使用的是最新版本 od mod_wsgi
(Webfaction 倾向于安装旧版本)
Don't use Django to serve static content
尝试在守护程序模式下运行mod_wsgi
(Webfaction 默认以嵌入式模式安装它)[感谢 Graham Dumpleton 的提示]
如果您在嵌入模式下运行,您可以指定“inactivity-timeout=[seconds]”选项。它将在 [秒] 不活动后重新启动进程,有助于增加内存使用量。 Read this forum post for detailed instructions。
This script 将帮助您更轻松、更准确地监控内存使用情况[感谢 ClaudioA 的提示]
【讨论】:
【参考方案2】:我们在 Webfaction 上遇到过类似的问题,但事实证明这根本不是因为他们。在使用包含大量元素的站点地图时,Django 中存在一个关于高内存使用的错误:http://code.djangoproject.com/ticket/11572
当我们删除站点地图时,它不会再猛增 90 Mb。只是想我应该提到它,因为它需要很长时间才能解决问题。
【讨论】:
【参考方案3】:您是否查看过这些提示? -> http://blog.webfaction.com/tips-to-keep-your-django-mod-python-memory-usage-down
我们已经在 WebFaction 中部署了一个应用程序 我们没有这些问题。
您是否将静态文件作为 他们推荐?
顺便说一句,这也可能很有用: http://fightingrabbits.com/archives/198
【讨论】:
我确实首先仔细分析了这些技巧。我确实按照推荐的方式提供静态文件(我在过去两天里至少检查了五次;])。我不知道剧本。谢谢。 如果您只运行一个应用程序,则很容易避免出现问题。我认为他们实际上确实每隔一段时间就会重新启动您的应用程序。但是,当您在一个帐户中获得四个应用程序时,很容易开始达到您的极限——尤其是当 webfaction 对内存很吝啬,并且不会让您每个帐户购买超过 240 MB 左右的空间时。 嗯..不知道网络派限制了您可以购买的内存...谢谢。【参考方案4】:检查是否启用了进程内内存缓存后端,如果是,则可能是问题所在(每次请求都有新的缓存条目)。
【讨论】:
不是。我现在使用 memcached(它使用自己的进程,单独增长),但关闭缓存不会缓存任何内容。【参考方案5】:mod_python 和 mod_wsgi 模块是否都加载到 apache 中?
我知道 mod_wsgi 不喜欢在其建筑中使用 mod_python。检查它没有加载。
【讨论】:
mod_python 和 mod_wsgi 可以一起使用,不是 mod_wsgi 不喜欢。您只需松开 mod_wsgi 的一些配置选项,因为 mod_python 负责初始化 Python,而不是 mod_wsgi。此外,即使在 Apache 中启用但未使用 mod_python 也会存在内存泄漏。只有在执行大量 Apache 重新启动时才会出现内存泄漏问题,而且并非每次请求都会发生这种情况。【参考方案6】:我建议不要猜测。
看看http://code.google.com/p/django-dowser/,它是一个非常有用的应用程序,用于检测内存泄漏并找出代码的哪些部分导致内存消耗。
【讨论】:
【参考方案7】:我在 Webfaction 上也遇到了内存问题——不过,直到我添加了我的第五个应用程序之后,它们才真正出现。我尝试对我的 apache 配置进行一些调整,但最终对我有用的只是切换到 mod_wsgi。
【讨论】:
但是您是在使用 mod_wsgi 的守护程序模式,还是尝试在 mod_wsgi 的嵌入式模式下运行所有内容?即使使用 WebFaction 配置将 Apache 服务器子进程保持在 2 个,如果使用嵌入式模式仍将比守护进程模式占用更多内存,而 Django 实例只有一个进程。 @Graham - 谢谢。我将 mod_wsgi 升级到 3.1(从 webfaction 提供的 2.5),这似乎有点帮助(我第一次看到内存使用的实例实际上有点下降)。然后我切换到守护程序模式,但没有注意到太大的不同。我对配置选项感到有些害怕。我将ServerLimit
设置为“2”,MaxRequestsPerChild
设置为“500”,WSGIDaemonProcess
设置为“[mydomain] processes=2 inactivity-timeout=1800 threads=15”,WSGIRestrictEmbedded
已打开。这种配置有意义吗?
哦,您能否将有关在守护程序模式下运行的建议作为单独的答案发布(可能带有配置选项的合理值示例)?我认为这是迄今为止最好的答案,可惜它被埋在 cmets 中。【参考方案8】:
我在使用 webfaction 时遇到了同样的问题。
我使用的方法,以及 webfaction 告诉我应该继续使用的方法,是运行一个 cron 作业,每 5 分钟左右检查一次内存,并重新启动所有失控的应用程序。
在 webfaction 上的 4 个 python 应用程序中,我平均每天重启 4 次。
【讨论】:
如果他们建议用户手动重启活动进程,这听起来像是对他们的环境有问题。以上是关于每次请求都会增加 Django 内存使用量的主要内容,如果未能解决你的问题,请参考以下文章
使用 AutoMapper 的 ProjectTo 和扩展选项时,每个请求都会增加内存