分析Django

sha*_*eel 93 django profiling

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

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

Sil*_*ght 75

试试 Django调试工具栏.它将显示在每个页面上执行的查询以及它们花费的时间.它是一个非常有用,功能强大且易于使用的工具.

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

和Jacob Kaplan-Moss的Django表演技巧.

  • 注意Django调试工具栏 - 我在开发期间将其关闭,并且我的(无可否认的低功耗)笔记本电脑上的页面渲染速度明显更快 - 在开发服务器中查看您正在下载的数据量. (11认同)
  • @ dominic-rodger我没有意识到调试工具栏让事情处理的速度慢了多少.我的sql查询很小(30ms)但cpu时间非常高(800ms).我调整的另一个页面的sql时间为300毫秒,CPU时间为8000毫秒 - 所以我一直试图找到问题的根源.把Django工具栏变成了加速的东西.3年后,仍然相关. (9认同)
  • django-debug-toolbar帮助我看看django-orm有多少查询命中数据库,我们可以看到select_related()函数如何更少地使用它. (2认同)
  • @Esteban,非常感谢您的评论,我真的对 dhango 工具栏占用的大量 CPU 时间感到疯狂。使用 django 分析 CPU 时间约为 30 秒,一旦我将其删除,它就下降到 1.5 秒! (2认同)

Tom*_*ski 27

只需在谷歌上输入"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/

就个人而言,我正在使用中间件方法 - 即每个用户都可以切换存储在会话中的"profiling"标志,如果我的分析中间件注意到已经设置了一个标志,它会使用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
Run Code Online (Sandbox Code Playgroud)

编辑:对于分析SQL查询,Konstantin提到的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
Run Code Online (Sandbox Code Playgroud)

  • http://code.google.com/p/django-profile/是用户个人资料django应用程序.它不是用作分析django :) (7认同)

小智 15

对于分析数据访问(这是大多数时间的瓶颈),请查看django-live-profiler.与Django Debug Toolbar不同,它同时收集所有请求中的数据,您可以在生产中运行它,而不会产生太多的性能开销或暴露您的应用程序内部.

看看这个截图

  • 不支持1.6及以上,一年以上没有活动. (17认同)

Mic*_*ael 13

这里有无耻的插件,但我最近为此目的制作了https://github.com/django-silk/silk.它有点类似于django工具栏,但具有历史记录,代码分析和对所有内容的更精细控制.


Ton*_* Yu 11

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

快速总结一下我使用其他一些工具的经验:

与我尝试过的其他工具相比,它的pyinstrument安装和使用要容易得多。


Jos*_*low 5

对于你所有的KCacheGrind粉丝,我发现很容易使用shell与Django的Client即时生成配置文件的奇妙测试,特别是在生产中.我现在已经多次使用过这种技术,因为它有轻触 - 不需要讨厌的中间件或第三方Django应用程序!

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

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()
Run Code Online (Sandbox Code Playgroud)

为了可视化生成的日志,我使用了hotshot2cachegrind:

但是还有其他选择: