如何针对执行时间对Django应用程序进行性能分析?

13

我的Django应用程序速度极慢,我想找出哪些内容所花费的时间:

我尝试过Django-debug-toolbar,但无法找到可以给出负载时间的面板。

我的要求:

  • 堆栈跟踪类型的输出,显示呈现页面时调用的每个模块的执行时间。
  • 我想知道整个页面呈现过程中哪一部分需要更多的时间?
  • 而且,哪一部分消耗了多少CPU[最重要的]?

django-debug-toolbar能做到吗?[哪个面板?]

还有其他的Django应用程序可以做到吗?


https://dev59.com/-XE95IYBdhLWcg3wUcNn - Ahsan
1
@Ahsan建议使用Django-debug-toolbar,但它并不能满足我的需求! - Yugal Jindle
5个回答

20

django-debug-toolbar 2.0

默认情况下,django-debug-toolbar 2.0在设置DEBUG_TOOLBAR_PANELS中包括'debug_toolbar.panels.profiling.ProfilingPanel'。您可以勾选工具栏中的“Profiling”复选框并刷新页面来查看此分析信息。

django-debug-toolbar的旧版本:

您可以尝试使用django-debug-toolbar的分析面板(请确保使用应用程序从github下载的最新版本)。在您的settings.py文件中这样启用该面板:

DEBUG_TOOLBAR_PANELS = (
  'debug_toolbar.panels.version.VersionDebugPanel',
  'debug_toolbar.panels.timer.TimerDebugPanel',
  'debug_toolbar.panels.profiling.ProfilingDebugPanel',
)

django-debug-toolbar的自述文件中未记录此面板的存在;这就是我首先在此处回答的原因。


4
注意:如果您正在使用Debian或Ubuntu,还需要“apt-get install python-profiler”来获取profilepstats模块,因为它们具有非自由许可证(感谢迪士尼)。 - Tony

13

谢谢。这是我长时间以来看到的最有价值的技巧之一。它非常简单,我简直不敢相信我一直在编写没有性能分析的Django应用程序。 - AgDude
你能否解释一下如何进行配置?只是把那个文件放在某个地方吗? - Dejell

2
我建议编写一些集成测试,或者至少使用内置的测试客户端自动化请求,并在视图中添加大量调试语句。Django有一个内置的测试客户端:
from django.test.client import Client
c = Client()
response = c.post('/slow_url/')

然后在您的视图中:

def slow_url(request):
    start = time.time()
    print 'Started db query'
    result = SomeComplexModel.objects.all()
    print 'Finished db query, took ', time.time() - start
    return render('some_complex_template.html', {'result': result})  

自动化请求的过程并且在进行微小更改时能够重复请求,这是提高代码质量的方法。如果你测量每个函数运行所需时间,就能计算出 CPU 时间。很快你就能找到实际消耗资源的部分。

2
这是一个显而易见的方法,但似乎不太实际。 - Yugal Jindle
既然我正在寻找一个性能分析工具,我总是可以手动完成! - Yugal Jindle
如果你还没有编写任何单元测试或集成测试,那么你应该真正考虑开始编写了... - aychedee
2
没问题,我知道测试的重要性 - 但那不是我的问题的答案。我已经有了测试,但如果我暂时需要放置时间戳,那么我可以在我的视图中做到这一点。 - Yugal Jindle

2

这并不是基于个人偏好,而是通常我会使用一个视图来计算执行时间,它也适用于需要用户登录的视图,并在一个简单的页面中显示执行时间。

 def test(request):
     from django.test.client import Client
     import time

     c = Client()

     #client login if needed
     response = c.post('/login/', {'username': 'admin', 'password': 'password'})

     start = time.time()
     response = c.get('/pagetotest/')

     #print response
     #print 'Finished, time: ', time.time() - start # output to console
     end=time.time() - start
     return render(request,'loadingtime.html',{'time':end})

我认为这是一个良好的起点,希望它能对某些人有所帮助。


0

django-silk 可以帮助你。

  • 使用以下命令安装:pip install django-silk
  • settings.py 中添加:
MIDDLEWARE = [
    ...
    'silk.middleware.SilkyMiddleware',
    ...
]

INSTALLED_APPS = (
    ...
    'silk'
)
  • urls.py中添加路由:
urlpatterns += [url(r'^silk/', include('silk.urls', namespace='silk'))]

最后,使用以下命令在数据库中创建适当的表:
python manage.py makemigrations
python manage.py migrate

然后您可以在浏览器中浏览/silk,以找到所请求的页面。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接