Мое приложение django стало мучительно медленным на производстве. Вероятно, это связано с некоторыми сложными или неиндексированными запросами.
Есть ли какой-нибудь способ django-ish для профилирования моего приложения?
Мое приложение django стало мучительно медленным на производстве. Вероятно, это связано с некоторыми сложными или неиндексированными запросами.
Есть ли какой-нибудь способ django-ish для профилирования моего приложения?
Попробуйте панель инструментов Django Debug. Он покажет вам, какие запросы выполняются на каждой странице и сколько времени они берут. Это действительно полезный, мощный и простой в использовании инструмент.
Кроме того, прочитайте рекомендации по производительности Django в Оптимизация доступа к базам данных из документации.
И Советы по производительности Django Джейкоб Каплан-Мосс.
Просто введите "django-profiling" в Google, вы получите эти ссылки (и многое другое):
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 hotshot следующим образом:
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
EDIT: для профилирования 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
Для профилирования доступа к данным (это место, где узкое место занимает большую часть времени), django-live-profiler, В отличие от панели инструментов Django Debug, он собирает данные по всем запросам одновременно, и вы можете запускать их в процессе производства без чрезмерной накладной производительности или подвергая внутренности вашего приложения.
Здесь бесстыдная заглушка, но я недавно сделал для этого https://github.com/django-silk/silk. Это несколько похоже на панель инструментов django, но с историей, профилированием кода и более тонким контролем над всем.
Для всех вас, поклонников KCacheGrind, очень легко использовать оболочку в тандеме с фантастическим Client
Django для тестирования журналов профилей на лету, особенно в производственных условиях. Я использовал эту технику уже несколько раз, потому что она имеет легкое касание - не нужно никакого надоедливого промежуточного программного обеспечения или сторонних приложений 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 - профиль всех вызовов методов, используемых для создания представления