代码之家  ›  专栏  ›  技术社区  ›  Andy Baker

减少Django内存使用。低垂的果实?

  •  132
  • Andy Baker  · 技术社区  · 16 年前

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

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

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

    有人能推荐其他人吗?低流量站点上的缓存会有多大改进?

    编辑:谢谢你的提示。有没有关于如何发现内存被占用的建议?有关于Python内存分析的指南吗?

    编辑: Django Deployment: Cutting Apache's Overhead

    编辑: Graham Dumpleton's article

    最终编辑:

    所以这让我回到了我最初的问题(我仍然不知道)。我们如何着手找出问题所在?这是一条众所周知的格言,没有测试就不会进行优化,以确定需要优化的地方,但是关于度量Python内存使用情况的教程很少,而且根本没有针对Django的教程。

    very helpful replies

    老实说,这是有史以来的最后一次更新!

    这是刚刚发布的。可能是目前最好的解决方案: Profiling Django object size and memory usage with Pympler

    10 回复  |  直到 7 年前
        1
  •  50
  •   nosklo    16 年前

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

    mod_python . 它在apache内部加载一个解释器。如果需要使用apache,请使用 mod_wsgi mod_wsgi 这样做容易吗 configure for django mod_python

    spawning 这似乎是运行python web应用程序的新的快速可扩展方式。

    编辑 :我看不出切换到mod_wsgi会是什么样子” 棘手的 “。这应该是一项非常简单的任务。请详细说明您在开关方面遇到的问题。

        2
  •  28
  •   Van Gale    16 年前

    如果您是在mod_wsgi下运行的,并且由于它是wsgi兼容的,所以可能会生成,那么您可以使用 Dozer 查看您的内存使用情况。

    在mod_wsgi下,只需在wsgi脚本的底部添加以下内容:

    from dozer import Dozer
    application = Dozer(application)
    

    http://domain/_dozer/index 查看所有内存分配的列表。

    我还将添加对mod_wsgi的支持。与mod_python相比,它在性能和内存使用方面有很大的不同。Graham Dumpleton对mod_wsgi的支持非常出色,无论是在积极开发方面,还是在帮助邮件列表中的用户优化安装方面。大卫·克莱默 curse.com

        3
  •  15
  •   Romeo Mihalcea Pankrat    7 年前

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

    免责声明:我与后者有利害关系。

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

    下面是一个很好的“战争故事”,它也给出了一些有用的提示:

        4
  •  5
  •   zgoda    16 年前

    Django Debug Toolbar 也许能帮你追踪猪。

        5
  •  4
  •   Carl Meyer    16 年前

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

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

        6
  •  4
  •   Jason Baker    16 年前

    网络派系实际上有 some tips 用于降低django内存使用率。

    要点:

    • 在apache配置中使用“ServerLimit”
    • 考虑在单独的进程或服务器中服务静态内容。
    • 找出并了解您正在使用的内存量
        7
  •  3
  •   AdamKG    16 年前

    maximum-requests 您的 WSGIDaemonProcess 指令和mod_wsgi将每隔一段时间重新启动守护进程。对于用户来说,除了第一次点击一个新进程时页面加载速度慢之外,应该没有明显的效果,因为它会将Django和您的应用程序代码加载到内存中。

    内存泄漏,这将防止进程大小过大,而不必中断对用户的服务。

        8
  •  3
  •   Staale    16 年前

    以下是我用于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()
    

    对于apache:

    <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,这样您就可以看到它是否会有所不同。

        9
  •  1
  •   Richard Levasseur    16 年前

    Swig'd code:确保任何内存管理都是正确的,在python中很容易忽略这些,特别是对于第三方库

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

        10
  •  1
  •   Emil Stenström    14 年前

    我们在Django中偶然发现了一个带有大型站点地图(10.000个项目)的bug。似乎Django在生成站点地图时正在尝试将它们全部加载到内存中: http://code.djangoproject.com/ticket/11572