我的 Django 应用程序非常慢,我想弄清楚什么需要时间:
我尝试过Django-debug-toolbar
,但找不到一个可以让我中断加载时间的面板。
我的要求:
- 堆栈跟踪类型的输出,其中包含为渲染页面而调用的每个模块的执行时间。
- 我想了解整个页面渲染过程的哪个部分需要时间?
- 另外,哪个部分消耗了多少 CPU [最重要]?
能django-debug-toolbar
做到吗?[什么面板?]
任何其他 django-app 可以做到这一点?
我的 Django 应用程序非常慢,我想弄清楚什么需要时间:
我尝试过Django-debug-toolbar
,但找不到一个可以让我中断加载时间的面板。
我的要求:
能django-debug-toolbar
做到吗?[什么面板?]
任何其他 django-app 可以做到这一点?
django-debug-toolbar
2.0默认情况下,django-debug-toolbar
2.0 包含'debug_toolbar.panels.profiling.ProfilingPanel'
在设置中DEBUG_TOOLBAR_PANELS
。您可以通过勾选工具栏中的“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 的自述文件中;这就是为什么我首先在这里回答。
终于找到了一种分析我的 django webapp 的方法:
以下 2 个 django 片段提供middleware
了该配置文件的整个流程和输出(如果请求prof
位于)GET keys
:
http://djangosnippets.org/snippets/727/ [使用 cProfile]
简单明了的分析 - 拯救了我的一天!
我建议改为编写一些集成测试,或者至少使用内置的测试客户端来自动化请求并在视图中放置大量调试语句
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 时间。您很快就可以了解实际消耗资源的部分。
它不是分析,但我通常只是使用视图来计算执行时间,它也适用于需要用户登录的视图,它在一个简单的页面中显示执行时间
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})
我认为这是一个好的开始,希望对某人有所帮助
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
然后,您可以在 Internet 浏览器中浏览/silk
以找到那里请求的页面。