Бенчмаркинг приложений django

Я заинтересован в тестировании производительности моих приложений django, когда я иду, что лучший способ получить данные о производительности линии за строкой?

note: Googling возвращает много людей, сравнивающих сам django. Я не ищу тесты django, я пытаюсь проверить производительность приложений django, которые я пишу:)

Спасибо!

edit. По строке "строка за строкой" я имею в виду время отдельных функций, вызовов db и т.д., чтобы выяснить, где узкие места находятся на очень гранулированном уровне.

Ответы

Ответ 1

Там два слоя. У нас есть большая часть №1 для нашего тестирования. Мы собираемся начать С# 2.

  • Django по отдельности. Обычные модульные тесты Django хорошо работают здесь. Создайте несколько тестов, которые проходят через несколько (менее 6) "типичных" вариантов использования. Получите это, опубликуйте и т.д. Соберите данные о времени. Это не настоящая производительность сети, но это простой в работе сценарий тестирования, который вы можете использовать для настройки.

  • Весь веб-стек. В этом случае вам нужен обычный сервер, на котором работают Squid, Apache, Django, MySQL, что угодно. Вам нужен второй компьютер (ы), чтобы действовать на вашем веб-сайте через urllib2, выполняя несколько (менее 6) "типичных" вариантов использования. Получите это, опубликуйте и т.д. Соберите данные о времени. Это все еще не "реальная" производительность сети, потому что это происходит не через Интернет, а так близко, как вы собираетесь получить без очень сложной настройки.

Обратите внимание, что # 2 (от конца до конца) включает в себя большое количество кэширования для производительности. Если ваши клиентские скрипты выполняют аналогичную работу, кэширование будет действительно полезным. если ваши клиентские скрипты делают уникальные вещи каждый раз, кеширование будет менее выгодным.

Самая сложная часть - это определение того, что такое "типичная" рабочая нагрузка. Это не функциональное тестирование, поэтому рабочая нагрузка не должна включать все. Кроме того, чем больше одновременных сеансов работает ваш клиент, тем медленнее он становится. Не пытайтесь оптимизировать свой сервер, когда ваш тестовый клиент является самой медленной частью обработки.


Edit

Если "строка за строкой" означает "профилирование", ну, вы должны запустить профайлер Python.

https://docs.python.org/library/profile.html

Обратите внимание, что в слое Django ORM имеется много кеширования. Таким образом, функция просмотра в полдюжины раз для получения значимого набора измерений неразумно. Вы должны запустить "типичный" набор операций, а затем найти горячие точки в профиле.

Как правило, ваше приложение легко оптимизировать - вы не должны много делать. Ваши функции просмотра должны быть короткими и не иметь обработки, о которых можно было бы говорить. Аналогично, ваш метод формы и модели должен быть очень коротким.

Ответ 2

Один из способов получить данные о производительности линии за строкой (профилирование) вашего приложения Django - использовать компонент промежуточного программного обеспечения WSGI, например repoze.profile.

Предполагая, что вы используете mod_wsgi с Apache, вы можете вставить repoze.profile в свое приложение следующим образом:

...
application = django.core.handlers.wsgi.WSGIHandler()
...
from repoze.profile.profiler import AccumulatingProfileMiddleware
application = AccumulatingProfileMiddleware(
    application,
    log_filename='/path/to/logs/profile.log',
    discard_first_request=True,
    flush_at_shutdown=True,
    path='/_profile'
)

Теперь вы можете указать свой браузер в /_profile для просмотра ваших данных профиля. Конечно, это не будет работать с mod_python или внутренним сервером Django.