我有一个django项目,还有一个问题 - 它占用了大量内存并且负载过多。
如何找到项目中存在大量内存的问题?
答案 0 :(得分:4)
如果您将Django与DEBUG = True
一起使用,那么Django会记录每个可以快速挂载并使用大量内存的数据库查询。
如果您未在DEBUG模式下运行,请查看gc模块,特别是尝试将gc.set_debug(gc.DEBUG_LEAK)
添加到settings.py
。这将向您显示有关哪些对象正在使用内存的大量信息。
答案 1 :(得分:3)
一般来说,对于调试/分析,我建议将django-debug-toolbar作为起始位置以及各种提示:
http://docs.djangoproject.com/en/dev/topics/db/optimization/
然而,这不会给出内存使用信息。如果您确实需要,可以尝试使用pympler的一些中间件来记录内存使用情况,同时调试并运行开发服务器。
http://www.rkblog.rk.edu.pl/w/p/profiling-django-object-size-and-memory-usage-pympler/?c=1
我发现这样做会让我的webapps几乎停止运行,然后使用dev-webserver会产生问题(例如,媒体文件没有得到服务)。
但正如其他人所说,最好的办法是设置DEBUG=False
:
http://docs.djangoproject.com/en/dev/faq/models/#why-is-django-leaking-memory
答案 2 :(得分:1)
正如Andrew Wilkinson所说,这可能与DEBUG = True
设置有关。但是,了解您是单独运行此项目还是作为Web服务器运行可能也很重要。
Django会在打开请求时自动缓存查询集,并在请求返回时删除引用。由于独立项目中没有请求,因此永远不会删除引用,因此每个请求的查询集都会被保存。
要修复独立的python问题,只需在完成一堆请求后调用django.db.reset_queries()
即可。这将允许对查询集进行垃圾回收并修复泄漏。