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


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

есть ли способ Django-ish профилировать мое приложение?

6 86

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 он собирает данные по всем запросам одновременно, и вы можете запустить его в производстве без слишком больших накладных расходов производительности или предоставления внутренних приложений.

Check out this screenshot

бесстыдный штекер здесь, но я недавно сделал 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 - профилировать все вызовы методов, используемые для создания представления