2010-03-02 3 views
85

Приложение django стало болезненно медленным на производстве. Prolly это связано с некоторыми сложными или неиндексированными запросами.Профилирование Django

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

ответ

68

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

Также ознакомьтесь с рекомендациями по производительности Django в документации Database access optimization.

И Django performance tips от Jacob Kaplan-Moss.

+11

Остерегайтесь панели инструментов Django Debug - я отключил ее во время разработки, и рендеринг страницы значительно ускорился на моем (по общему признанию, маломощном) ноутбуке - посмотрите в dev-сервере, чтобы узнать, сколько данных вы загружаете. –

+2

django-debug-toolbar помогает мне узнать, сколько запросов django-orm попадает в db, и мы можем видеть, как функция select_related() делает трюк, ударяющий его меньше. – panchicore

+9

@ dominic-rodger Я не понимал, насколько медленнее панель инструментов Debug заставила все работать. Мои запросы sql были небольшими (30 мс), но время процессора было очень высоким (800 мс). Другая страница, которую я настраивал, имела sql раз 300 мс, а процессор - 8000 мс, поэтому я пытался найти источник проблемы. Повернув панель инструментов Django, все ускорилось. 3 года спустя, по-прежнему актуальны. – Esteban

28

Просто введите "Джанго-профилирование" на 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/

Лично я с помощью подход промежуточного программного обеспечения - то есть каждый пользователь может переключать флаг «профилирования», хранящийся в сеансе, и если мое профилирующее промежуточное программное обеспечение отмечает, что флаг установлен, он использует модуль hotshot Python lik е это:

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 
+7

http://code.google.com/p/django-profile/ - это приложение django профиля пользователя. он не используется в качестве профилирования django :) – dzen

+1

@ dzen: Hah, хороший момент, это должно было быть: http://code.google.com/p/django-profiling/ :-) –

+1

, если вам интересно, как читать профайлер-дампы после запуска 'python manage.py runprofileserver -prof-path =/path/to/dir', следуйте этому блогу: http://www.darkcoding.net/software/profiling-django-for-cpu-bound- Программы/. – Neara

2

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

Вот несколько примеров:

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

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

15

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

Check out this screenshot

+14

не поддерживает 1.6 и выше, не работает больше года. –

4

Для всех вас KCacheGrind поклонников, я считаю, что это очень легко использовать оболочку в тандеме с фантастическим испытанием Джанго 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:

Но есть и другие варианты, а также:

10

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

+0

Получение проблемы промежуточного программного обеспечения «Нет обработчиков для журнала» silk.middleware »' –

Смежные вопросы