2010-03-02 72 views
85

我的Django应用程序在生产中变得非常缓慢。这是由于一些复杂或未索引的查询而引起的。分析Django

是否有任何django-ish的方式来分析我的应用程序?

回答

68

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

此外,请从文档中阅读有关Django性能的建议,内容为Database access optimization

Django performance tips作者: Jacob Kaplan-Moss。

+11

当心Django的调试工具栏 - 我在开发过程中把它关掉,页面渲染是显著快上我的(当然低功耗)笔记本 - 看在开发服务器,看看你有多少数据下载。 – 2010-03-02 13:32:58

+2

Django的调试工具栏里帮我看看有多少查询Django的ORM打分贝,我们可以看到select_related()函数做的伎俩击中它少。 – panchicore 2010-03-02 14:20:47

+9

@ dominic-rodger我没有意识到调试工具栏让事情变得缓慢多少。我的SQL查询很小(30毫秒),但CPU时间非常高(800毫秒)。我正在调整的另一个页面的sql时间为300ms,CPU时间为8000ms - 所以我一直试图找到问题的根源。将Django Toolbar关闭正确。 3年后,仍然有关。 – Esteban 2013-01-30 18:59:39

28

只需键入 “Django的分析” 谷歌,你会得到这些链接(及以上):

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模块E本:

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是一个很好的事情 - 但如果你的查询都是很慢的(可能是因为有他们的几百或几千个),那么你会等待疯狂的时间,直到它被加载到浏览器 - 然后由于缓慢将很难浏览。另外,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

http://code.google.com/p/django-profile/是一个用户配置文件django应用程序。它不是用来作为分析的Django :) – dzen 2011-03-14 16:52:09

+1

@dzen:哈,好点的,它的意思是:http://code.google.com/p/django-profiling/ :-) – 2011-03-14 18:17:53

+1

如果你想知道如何阅读运行后探查转储'蟒蛇manage.py runprofileserver --prof路径= /路径/到/ dir',按照此博客:http://www.darkcoding.net/software/profiling-django-for-cpu-bound-应用/。 – Neara 2014-03-20 10:16:18

15

对于分析数据访问的所有方法调用(这是那里的瓶颈在大多数时候)请查看django-live-profiler。与Django调试工具栏不同,它可以同时收集所有请求中的数据,并且可以在生产环境中运行它,而无需太多的性能开销或公开应用内部信息。

Check out this screenshot

+14

不支持1.6及以上,超过一年没有活动。 – 2014-06-07 02:47:27

4

为您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:

但也有其他选择:

10

无耻的插头插在此处,但我最近为此目的而https://github.com/django-silk/silk。它有点类似于Django的工具栏,但有历史,代码分析和对一切的更细致的控制。

+0

获取中间件问题'没有处理程序可以找到记录器“silk.middleware”' – 2017-08-09 10:20:13