Как профилировать приложение django в отношении времени выполнения?

Приложение My Django безумно медленное, я хочу выяснить, что занимает время:

Я попробовал Django-debug-toolbar, но не смог найти панель, которая может дать мне распад времени загрузки.

Мои требования:

  • Выход типа трассировки стека со временем выполнения для каждого модуля, вызываемого для визуализации страницы.
  • Я хочу понять, какая часть всего процесса рендеринга страницы занимает время?
  • Кроме того, какая часть потребляет то, сколько CPU [САМЫЙ ВАЖНЫЙ]?

Может ли Django-debug-toolbar сделать это? [Какая панель? ]

Любое другое django-приложение, которое может это сделать?

Ответ 1

Наконец-то выяснилось, как настроить профиль django webapp:

Следующие 2 фрагмента django предоставляют middleware, которые определяют весь поток и выходят, если запрос имеет prof в GET keys:

Простое и простое профилирование - Сохранено мое время!

Ответ 2

django-debug-toolbar 2.0

По умолчанию django-debug-toolbar 2.0 включает 'debug_toolbar.panels.profiling.ProfilingPanel' в настройках DEBUG_TOOLBAR_PANELS. Вы можете просмотреть эту информацию о профилировании, установив флажок "Профилирование" на панели инструментов и обновив страницу.

Старые версии 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',
)

Это существование этой панели не задокументировано в файле readme django-debug-toolbar; вот почему я отвечаю здесь в первую очередь.

Ответ 3

Я бы рекомендовал вместо этого написать некоторые интеграционные тесты или, по крайней мере, с помощью встроенного клиента тестирования для автоматизации запросов и отправки множества предложений отладки в представлениях

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 может быть выработано, если вы измеряете время, необходимое для запуска каждой функции. Вам не понадобится много времени, чтобы отточить часть, которая фактически пережевывает ресурсы.

Ответ 4

Это не профилирование, но я просто просто использую представление для вычисления времени выполнения, он также работает для представлений, которые нужен вход пользователя, он отображает время выполнения на простой странице

 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})

Это хорошее начало, я думаю, надеюсь, что это поможет кому-то

Ответ 5

Джанго-Шелк может помочь.

  • Установите его с помощью: 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 и найти запрошенную там страницу.