Профилирование Django
мое приложение django стало болезненно медленным на производстве. Вероятно, это связано с некоторыми сложными или неиндексированными запросами.
есть ли способ Django-ish профилировать мое приложение?
6 ответов:
попробовать Панель Инструментов Отладки Django. Он покажет вам, какие запросы выполняются на каждой странице и сколько времени они занимают. Это очень полезный, мощный и простой в использовании инструмент.
кроме того, прочитайте рекомендации по производительности Django в оптимизация доступа к базе данных из документации.
и советы по производительности Django by Джейкоб Каплан-Мосс.
просто введите "django-профилирование" в 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/
лично я использую подход middleware-т. е. каждый пользователь может переключать флаг "профилирование", хранящийся в сеансе, и если мой профилирование middleware замечает, что флаг был установлен, он использует 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
изменить: для профилирования 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 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 - профилировать все вызовы методов, используемые для создания представления