降低姜戈内存的使用?

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

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

我有一种感觉,有一些简单的步骤,可以产生巨大的收益。确保“ debug”设置为“ False”显然是一个大问题。

有人能提出其他建议吗? 在低流量站点上缓存能有多大的改进?

在本例中,我使用 mod _ python 在 Apache 2.x 下运行。我听说 mod _ wsgi 有点瘦,但是在这个阶段很难切换,除非我知道收益很大。

编辑: 谢谢到目前为止的提示。有什么建议可以帮助我们发现是什么消耗了我们的内存?有关于 Python 内存分析的指南吗?

正如前面提到的,切换到 mod _ wsgi 会有一些麻烦,所以我希望在继续朝这个方向努力之前,了解一下我可以期望获得的收益。

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

编辑: 《 Graham Dumpleton 的文章》是我在 MPM 和 mod _ wsgi 相关文章中找到的最好的。我相当失望,没有人能够提供任何信息调试的内存使用在应用程序本身虽然。

最终编辑: 我一直在和网络派讨论这个问题,看看他们是否能够帮助重新编译 Apache,这是他们关于这个问题的说法:

“我真的不认为切换到 MPM Worker + mod _ wsgi 设置会有什么好处。我估计您可以节省大约20MB,但可能不会超过20MB。”

那么!这又把我带回了我最初的问题(我对此仍然一无所知)。如何识别问题所在?众所周知,如果不进行测试,就不会优化需要优化的地方,但是关于测量 Python 内存使用情况的教程很少,而且根本没有专门针对 Django 的教程。

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

另一个最终编辑; -)

我在 django 用户列表中问了这个问题,得到了一些 非常有帮助的回复

说实话,这是最后一次更新了!

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

20681 次浏览

确保没有保留对数据的全局引用。这会阻止 python 垃圾收集器释放内存。

不要用 mod_python。它在 apache 中加载一个解释器。如果需要使用 apache,则改为使用 mod_wsgi。转换并不难。很简单。mod_wsgi比脑死亡的 mod_python更容易进入 为 django 配置

如果您可以从需求中删除 Apache,那将对您的内存有更好的帮助。spawning似乎是运行 pythonweb 应用程序的新的快速可伸缩方式。

编辑 : 我不明白如何切换到 mod _ wsgi 可以是“ 很狡猾”。这应该是一个非常容易的任务。请详细说明您在开关上遇到的问题。

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

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

Mod _ wsgi 的另一个优点是: 在 WSGIDaemonProcess指令中设置一个 maximum-requests参数,mod _ wsgi 将不时地重新启动守护进程。对于用户来说,应该没有可见的效果,除了在第一次命中一个新进程时缓慢的页面加载,因为它将把 Django 和您的应用程序代码加载到内存中。

但是,即使您的 有内存泄漏,这应该可以防止进程大小变得过大,而不必中断对用户的服务。

实际上,Web 派有 小费来降低 django 内存的使用。

主要内容:

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

如果您在 mod _ WSGI 下运行,并且由于它是 WSGI 兼容的,因此可能正在产生,那么您可以使用 道瑟来查看内存使用情况。

在 mod _ WSGI 下面,只需在 WSGI 脚本的底部添加以下内容:

from dozer import Dozer
application = Dozer(application)

然后将浏览器指向 http://domain/_dozer/index,查看所有内存分配的列表。

我还将添加对 mod _ wsgi 的支持。相对于 mod _ python,它在性能和内存使用方面带来了天壤之别。Graham Dumpleton 对 mod _ wsgi 的支持非常出色,无论是在积极的开发方面,还是在帮助邮件列表中的用户优化他们的安装方面。诅咒网的 David Cramer 发布了一些图表(不幸的是,我现在看不到) ,显示在高流量网站上切换到 mod _ wsgi 之后,CPU 和内存的使用量急剧下降。有几个姜戈开发商换了。说真的,这是显而易见的:)

缓存: 确保它们被冲走了。有些东西很容易在缓存中着陆,但是由于缓存引用,它永远不会被 GC 化。

Swig’d 代码: 确保任何内存管理都正确完成,在 python 中很容易忽略这些内存管理,特别是在第三方库中

监视: 如果可以,获取有关内存使用和命中率的数据。通常,您会看到某种类型的请求与内存使用之间的相关性。

此外,检查是否没有使用任何已知的泄漏者。由于 unicode 处理中的 bug,已知 MySQLdb 在使用 Django 时会泄漏大量内存。除此之外,Django 调试工具栏可以帮助你追踪猪。

下面是我用于 mod _ wsgi 的脚本(称为 wsgi.py,并将其放入 django 项目的根目录中) :

import os
import sys
import django.core.handlers.wsgi


from os import path


sys.stdout = open('/dev/null', 'a+')
sys.stderr = open('/dev/null', 'a+')


sys.path.append(path.join(path.dirname(__file__), '..'))


os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings'
application = django.core.handlers.wsgi.WSGIHandler()

根据需要调整 myproject.sets 和路径。我将所有输出重定向到/dev/null,因为默认情况下 mod _ wsgi 阻止打印。使用日志记录代替。

对阿帕奇来说:

<VirtualHost *>
ServerName myhost.com


ErrorLog /var/log/apache2/error-myhost.log
CustomLog /var/log/apache2/access-myhost.log common


DocumentRoot "/var/www"


WSGIScriptAlias / /path/to/my/wsgi.py


</VirtualHost>

希望这至少可以帮助您设置 mod _ wsgi,这样您就可以看到它是否有所不同。

下面是我知道的 Python 内存分析器解决方案(与 Django 无关) :

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

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

下面是一个不错的“战争故事”,它也提供了一些有用的建议:

我们在 Django 中发现了一个带有大型站点地图(10.000个项目)的 bug。似乎 Django 在生成站点地图时试图将它们全部加载到内存中: http://code.djangoproject.com/ticket/11572——当 Google 访问站点时,有效地杀死了 apache 进程。