我的 django 应用程序在生产过程中变得非常慢。可能是由于一些复杂或未索引的查询。
有没有类似 django 的方法来分析我的应用程序?
尝试使用 Django 调试工具栏。它将显示每个页面上执行了哪些查询以及它们花费了多少时间。这是一个非常有用、强大且易于使用的工具。
此外,请阅读文档中数据库访问优化中有关 Django 性能的建议。
和 Django 性能技巧 by 雅各布·卡普兰-莫斯。
只需在谷歌上输入“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
这里是无耻的插件,但我最近为此目的制作了https://github.com/django-silk/silk。它有点类似于 django 工具栏,但具有历史记录、代码分析和对所有内容的更细粒度的控制。
要分析数据访问(大多数时候是瓶颈所在),请查看 django-live-profiler。与 Django 调试工具栏不同,它同时收集所有请求的数据,您可以在生产中运行它,而不会产生太多性能开销或暴露您的应用程序内部结构。
我最近需要分析一个 Django 应用程序,并尝试了其中的许多建议。 我最终使用 pyinstrument 来代替,它可以使用中间件列表的单个更新来添加到 Django 应用程序,并提供基于堆栈的计时视图。
快速总结我使用其他一些工具的经验:
pyinstrument
cProfile
计时并自动显示 ajax 计时,这两者都非常有用。与我尝试过的其他工具相比,
pyinstrument
安装和使用起来要容易得多。
对于所有 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:
但还有其他选择:
当视图不是 HTML(例如 JSON)时,请使用简单的中间件方法进行分析。
这里有几个例子:
https://gist.github.com/1229685 - 捕获进入视图的所有 sql 调用
https://gist.github.com/1229681 - 分析用于创建视图的所有方法调用
您可以使用line_profiler。
它允许显示代码的逐行分析以及每行旁边的时间(当一行被点击多次时,时间也会被总结)。
它与非 Django python 代码一起使用,但实际上在 Django 上使用它有一个小技巧:https://stackoverflow.com/a/68163807/1937033
我正在使用 Silk 进行 Django 应用程序的实时分析和检查。这是一个很棒的工具。你可以看一下。