分析Django


98

我的django应用程序的生产变得非常缓慢。可能是由于一些复杂或未索引的查询。

有什么django式的方法来分析我的应用程序吗?

Answers:


77

试试 Django Debug Toolbar。它将向您显示在每个页面上执行哪些查询以及它们花费多少时间。这是一个非常有用,功能强大且易于使用的工具。

另外,请从文档中阅读有关数据库访问优化中 Django性能的建议。

以及Jacob Kaplan-Moss 撰写的Django性能技巧


13
请注意Django Debug Toolbar(Django调试工具栏)-我在开发过程中将其关闭,并且在我的(公认的低功耗)笔记本电脑上,页面渲染明显更快-在dev服务器中查看可下载的数据量。
多米尼克·罗杰

2
django-debug-toolbar帮助我查看了django-orm命中数据库的查询数量,并且我们可以看到select_related()函数是如何减少命中率的。
panchicore 2010年

11
@ dominic-rodger我不知道调试工具栏使事情处理的速度有多慢。我的SQL查询很小(30毫秒),但CPU时间却很长(800毫秒)。我正在调整的另一页的SQL时间为300毫秒,而CPU时间为8000毫秒-因此我一直试图寻找问题的根源。关闭Django工具栏会加快速度。3年后,仍然有意义。
Esteban 2013年

2
@Esteban,非常感谢您的评论,dhango工具栏占用了我大量的CPU时间,这简直是疯了。使用django进行性能分析时,CPU时间约为30秒,一旦我将其删除,它的时间就会减少到1.5秒!
noob Mama 2015年

28

只要在Google上输入“ django-profiling”,您就会获得以下链接(以及更多):

http://code.djangoproject.com/wiki/ProfilingDjango

http://code.google.com/p/django-profiling/

http://www.rkblog.rk.edu.pl/w/p/django-profiling-hotshot-and-kcachegrind/

我个人使用的是中间件方法-即每个用户都可以切换存储在会话中的“概要分析”标志,并且如果我的概要分析中间件注意到设置了标志,它将使用Python的hotshot模块,如下所示:

def process_view(self, request, view_func, view_args, view_kwargs):

     # setup things here, along with: settings.DEBUG=True 
     # to get a SQL dump in connection.queries

     profiler = hotshot.Profile(fname)
     response = profiler.runcall(view_func, request, *view_args, **view_kwargs)
     profiler.close()

     # process results

     return response

编辑:对于分析SQL查询http://github.com/robhudson/django-debug-toolbar康斯坦丁(Konstantin)提到是一件好事-但如果您的查询确实很慢(可能是因为有成百上千的查询),那么您在将其加载到浏览器中之前,将花费大量的时间-然后由于速度缓慢,将很难进行浏览。而且,django-debug-toolbar在设计上无法提供有关AJAX请求内部的有用信息。

EDIT2:django-extensions具有内置的强大分析命令:

https://github.com/django-extensions/django-extensions/blob/master/docs/runprofileserver.rst

做到这一点,瞧:

$ mkdir /tmp/my-profile-data
$ ./manage.py runprofileserver --kcachegrind --prof-path=/tmp/my-profile-data

7
code.google.com/p/django-profile是一个User Profile django应用程序。它不用作django的分析工具:)
dzen

1
@dzen:哈,好点的,它本来是:code.google.com/p/django-profiling :-)
托马斯杰林斯基

1
如果您想知道运行后如何读取事件探查器转储python manage.py runprofileserver --prof-path=/path/to/dir,请关注此博客:darkcoding.net/software/profiling-django-for-cpu-bound-apps
Neara 2014年

啊,是的,我最喜欢的,使用Google来找到我的查询的最佳答案之一是“只是google你要搜索到这里的东西”
Anna

请注意,hotshot它已在Python 3中弃用并删除,因此此答案和ProfilingDjangoWiki页面在20202
Patryk

16

要进行数据访问分析(这通常是瓶颈所在),请查看django-live-profiler。与Django Debug Toolbar不同,它可以同时收集所有请求中的数据,并且您可以在生产环境中运行它而不会增加性能开销或暴露应用程序内部。

查看此屏幕截图


18
不支持1.6及更高版本,超过一年没有活动。
韩和


5

对于所有您的KCacheGrind爱好者来说,我发现将外壳与Django出色的测试结合使用非常容易,可以Client即时生成配置文件日志,特别是在生产环境中。我现在已经在多种场合使用了该技术,因为它具有轻松的触觉-不需要讨厌的中间件或第三方Django应用程序!

例如,要分析似乎运行缓慢的特定视图,可以打开外壳并键入以下代码:

from django.test import Client
import hotshot

c = Client()
profiler = hotshot.Profile("yourprofile.prof")  # saves a logfile to your pwd
profiler.runcall(c.get, "/pattern/matching/your/view/")
profiler.close()

为了可视化结果日志,我使用了hotshot2cachegrind:

但是还有其他选择:



0

我最近需要分析Django应用,并尝试了许多建议。我最终改为使用pyinstrument可以使用对中间件列表的单个更新将其添加到Django应用中,并提供基于堆栈的计时视图。

使用其他一些工具的经验总结:

  • 如果您的问题是由于SQL查询引起的,则Django Debug Toolbar非常有用,并且与pyinstrument
  • django-silk可以很好地工作,但是需要在要子请求计时的堆栈的每个部分中添加一个上下文管理器或装饰器。它还提供了一种访问cProfile计时并自动显示ajax计时的简便方法,这两者都非常有用。
  • djdt-flamegraph看起来很有希望,但是该页面实际上从未在我的系统上呈现过。

与我尝试过的其他工具相比,它的pyinstrument安装和使用都非常容易。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.