Профилирование Джанго - PullRequest
92 голосов
/ 02 марта 2010

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

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

Ответы [ 6 ]

73 голосов
/ 02 марта 2010

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

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

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

28 голосов
/ 02 марта 2010

Просто введите "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

РЕДАКТИРОВАТЬ: Для профилирования 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
15 голосов
/ 16 декабря 2012

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

Check out this screenshot

12 голосов
/ 07 июня 2014

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

5 голосов
/ 31 декабря 2013

Для всех вас, поклонников 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 голосов
/ 26 сентября 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...