Мое приложение django очень медленно работает. Вероятно, это связано с какими-то сложными или неиндексированными запросами.
Есть ли какой-нибудь django-ish способ профилировать мое приложение?
Ответы:
Попробуйте панель инструментов отладки Django . Он покажет вам, какие запросы выполняются на каждой странице и сколько времени они занимают. Это действительно полезный, мощный и простой в использовании инструмент.
Также прочтите рекомендации по производительности Django в разделе Оптимизация доступа к базе данных из документации.
И советы по производительности Django от Джейкоба Каплан-Мосса.
Просто введите в 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
python manage.py runprofileserver --prof-path=/path/to/dir
, следите за этим блогом: darkcoding.net/software/profiling-django-for-cpu-bound-apps .
hotshot
это устарело и удалено в Python 3, поэтому этот ответ и ProfilingDjango
страница Wiki могут больше не иметь значения в 20202 году2.
Для доступа к данным профилирования (где чаще всего возникает узкое место) проверьте django-live-profiler . В отличие от панели инструментов Django Debug Toolbar, он собирает данные по всем запросам одновременно, и вы можете запускать его в производственной среде без особых накладных расходов на производительность и без раскрытия внутренних компонентов вашего приложения.
Здесь бесстыдный плагин, но я недавно сделал для этого https://github.com/django-silk/silk . Она чем-то похожа на панель инструментов django, но с историей, профилированием кода и более тонким контролем над всем.
Для всех вас, поклонников 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:
Но есть и другие варианты:
Если представления не являются HTML, например JSON, используйте простые методы промежуточного программного обеспечения для профилирования.
Вот пара примеров:
https://gist.github.com/1229685 - захват всех вызовов sql вошел в представление
https://gist.github.com/1229681 - профилируйте все вызовы методов, используемых для создания представления
Мне недавно нужно было профилировать приложение Django, и я попробовал многие из этих предложений. Вместо этого я использовал pyinstrument , который можно добавить в приложение Django с помощью одного обновления списка промежуточного программного обеспечения и обеспечить представление таймингов на основе стека.
Краткое изложение моего опыта работы с некоторыми другими инструментами:
pyinstrument
cProfile
таймингу и автоматически отображает тайминги ajax, что может быть действительно полезно.По сравнению с другими инструментами, которые я пробовал, pyinstrument
установить и использовать было намного проще.