分析 Django

问题描述 投票:0回答:9

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

有没有类似 django 的方法来分析我的应用程序?

django profiling
9个回答
96
投票

尝试使用 Django 调试工具栏。它将显示每个页面上执行了哪些查询以及它们花费了多少时间。这是一个非常有用、强大且易于使用的工具。

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

Django 性能技巧 by 雅各布·卡普兰-莫斯。


29
投票

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

16
投票

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


15
投票

要分析数据访问(大多数时候是瓶颈所在),请查看 django-live-profiler。与 Django 调试工具栏不同,它同时收集所有请求的数据,您可以在生产中运行它,而不会产生太多性能开销或暴露您的应用程序内部结构。

Check out this screenshot


10
投票

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

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

    如果您的问题是由于 SQL 查询造成的,那么
  • Django 调试工具栏 非常有用,并且与
    pyinstrument
  • 结合使用效果很好
  • django-silk 效果很好,但需要向堆栈的每个需要子请求计时的部分添加上下文管理器或装饰器。它还提供了一种简单的方法来访问
    cProfile
    计时并自动显示 ajax 计时,这两者都非常有用。
  • djdt-flamegraph 看起来很有希望,但该页面从未在我的系统上实际呈现。

与我尝试过的其他工具相比,

pyinstrument
安装和使用起来要容易得多。


6
投票

对于所有 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()

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

但还有其他选择:


4
投票

当视图不是 HTML(例如 JSON)时,请使用简单的中间件方法进行分析。

这里有几个例子:

https://gist.github.com/1229685 - 捕获进入视图的所有 sql 调用

https://gist.github.com/1229681 - 分析用于创建视图的所有方法调用


2
投票

您可以使用line_profiler

它允许显示代码的逐行分析以及每行旁边的时间(当一行被点击多次时,时间也会被总结)。

它与非 Django python 代码一起使用,但实际上在 Django 上使用它有一个小技巧:https://stackoverflow.com/a/68163807/1937033


1
投票

我正在使用 Silk 进行 Django 应用程序的实时分析和检查。这是一个很棒的工具。你可以看一下。

https://github.com/jazzband/django-silk

© www.soinside.com 2019 - 2024. All rights reserved.