Профилирование Django

100

Мое приложение django очень медленно работает. Вероятно, это связано с какими-то сложными или неиндексированными запросами.

Есть ли какой-нибудь django-ish способ профилировать мое приложение?

Шарджил
источник

Ответы:

81

Попробуйте панель инструментов отладки Django . Он покажет вам, какие запросы выполняются на каждой странице и сколько времени они занимают. Это действительно полезный, мощный и простой в использовании инструмент.

Также прочтите рекомендации по производительности Django в разделе Оптимизация доступа к базе данных из документации.

И советы по производительности Django от Джейкоба Каплан-Мосса.

Серебряный свет
источник
13
Следите за панелью инструментов отладки Django - я отключил ее во время разработки, и рендеринг страниц на моем (правда, маломощном) ноутбуке был значительно быстрее - посмотрите на сервер разработчика, чтобы узнать, сколько данных вы загружаете.
Доминик Роджер
2
django-debug-toolbar помогает мне увидеть, сколько запросов django-orm попадает в базу данных, и мы можем увидеть, как функция select_related () справляется с задачей, уменьшая количество запросов.
panchicore 02
11
@ dominic-rodger Я не понимал, насколько медленнее работает панель Debug Toolbar. Мои запросы sql были небольшими (30 мс), но время процессора было очень высоким (800 мс). На другой странице, которую я настраивал, время sql составляло 300 мс, а время процессора - 8000 мс, поэтому я продолжал пытаться найти источник проблемы. Отключение панели инструментов Django ускорило работу. Спустя 3 года все еще актуально.
Эстебан
2
@Esteban, большое спасибо за этот комментарий, я буквально сходил с ума от смехотворно большого количества процессорного времени, которое заняло панель инструментов dhango. При профилировании django время процессора составляло около 30 секунд, после того как я его удалил, оно сократилось до 1,5 секунд !!
noob Mama
28

Просто введите в Google "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 следующим образом:

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, упомянутый Константином, это хорошая вещь, но если ваши запросы действительно медленные (возможно, потому что их сотни или тысячи), тогда вы Я буду ждать безумное количество времени, пока он загрузится в браузер, и тогда будет сложно просматривать его из-за медлительности. Кроме того, 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
Томаш Зелиньски
источник
7
code.google.com/p/django-profile - это приложение для профиля пользователя django. он не используется как профилирующий django :)
dzen
1
@dzen: Ха, хороший момент, это должно было быть: code.google.com/p/django-profiling :-)
Tomasz Zieliński
1
Если вам интересно, как читать дампы профилировщика после запуска python manage.py runprofileserver --prof-path=/path/to/dir, следите за этим блогом: darkcoding.net/software/profiling-django-for-cpu-bound-apps .
Neara
ах да, мой любимый, использование Google, чтобы найти один из главных ответов на мой вопрос: «просто погуглите то, что вы искали в Google, чтобы получить сюда»
Анна
Обратите внимание, что hotshotэто устарело и удалено в Python 3, поэтому этот ответ и ProfilingDjangoстраница Wiki могут больше не иметь значения в 20202 году2.
Патрик Братковски
16

Для доступа к данным профилирования (где чаще всего возникает узкое место) проверьте django-live-profiler . В отличие от панели инструментов Django Debug Toolbar, он собирает данные по всем запросам одновременно, и вы можете запускать его в производственной среде без особых накладных расходов на производительность и без раскрытия внутренних компонентов вашего приложения.

Посмотрите этот снимок экрана

атерешкин
источник
19
не поддерживает 1.6 и выше, больше года нет активности.
Хан Хе
14

Здесь бесстыдный плагин, но я недавно сделал для этого https://github.com/django-silk/silk . Она чем-то похожа на панель инструментов django, но с историей, профилированием кода и более тонким контролем над всем.

Майкл
источник
Проблема с промежуточным программным обеспечением «Не удалось найти обработчиков для регистратора" silk.middleware "»
Навин Агарвал,
5

Для всех вас, поклонников KCacheGrind, я считаю, что очень легко использовать оболочку в тандеме с фантастическим тестом Django Clientдля генерации журналов профиля на лету, особенно в производственной среде. Я использовал эту технику несколько раз, потому что она легкая - не требуется никакого надоедливого промежуточного программного обеспечения или сторонних приложений Django!

Например, чтобы профилировать конкретное представление, которое кажется медленно работающим, вы можете взломать оболочку и ввести этот код:

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:

Но есть и другие варианты:

Джошуа Покотилов
источник
3

Если представления не являются HTML, например JSON, используйте простые методы промежуточного программного обеспечения для профилирования.

Вот пара примеров:

https://gist.github.com/1229685 - захват всех вызовов sql вошел в представление

https://gist.github.com/1229681 - профилируйте все вызовы методов, используемых для создания представления

Евгений
источник
0

Мне недавно нужно было профилировать приложение Django, и я попробовал многие из этих предложений. Вместо этого я использовал pyinstrument , который можно добавить в приложение Django с помощью одного обновления списка промежуточного программного обеспечения и обеспечить представление таймингов на основе стека.

Краткое изложение моего опыта работы с некоторыми другими инструментами:

  • Панель инструментов отладки Django отлично подходит, если проблема связана с SQL-запросами и хорошо работает в сочетании сpyinstrument
  • django-silk работает хорошо, но требует добавления диспетчера контекста или декоратора в каждую часть стека, где вы хотите установить время подзапроса. Он также обеспечивает простой способ доступа к cProfileтаймингу и автоматически отображает тайминги ajax, что может быть действительно полезно.
  • djdt-flamegraph выглядел многообещающе, но страница никогда не отображалась в моей системе.

По сравнению с другими инструментами, которые я пробовал, pyinstrumentустановить и использовать было намного проще.

Тони С Ю
источник