Профілювання Джанго


99

Мій додаток django став болісно повільним у виробництві. Можливо, це пов’язано з якимись складними або неіндексованими запитами.

Чи існує якийсь django-ish спосіб профілі моєї програми?

Відповіді:


80

Спробуйте панель інструментів налагодження Django . Він покаже вам, які запити виконуються на кожній сторінці та скільки часу вони займають. Це справді корисний, потужний та простий у використанні інструмент.

Також прочитайте з документації рекомендації щодо продуктивності Django в оптимізації доступу до бази даних .

І поради щодо ефективності Django від Джейкоба Каплана-Мосса.


13
Слідкуйте за панеллю інструментів налагодження Django - я її вимкнув під час розробки, і візуалізація сторінок була значно швидшою на моєму (правда, малопотужному) ноутбуці - загляньте на сервер розробників, щоб побачити, скільки даних ви завантажуєте.
Домінік Роджер

2
django-debug-toolbar допомагає мені побачити, скільки запитів django-orm потрапляє в db, і ми можемо побачити, як функція select_related () робить трюк, вражаючи її менше.
панчікор 02.03.10

11
@ dominic-rodger Я не розумів, наскільки повільніше Панель інструментів налагодження змусила процес оброблятися. Мої запити в sql були невеликими (30 мс), але час процесора був дуже великим (800 мс). Ще одна сторінка, яку я налаштовував, мала час sql 300 мс і час процесора 8000 мс - тому я продовжував намагатися знайти джерело проблеми. Вимкнення панелі інструментів Django пришвидшило роботу. Через 3 роки, все ще актуальна.
Естебан

2
@Esteban, велике спасибі за цей коментар, я буквально зводився з глузду через смішно велику кількість процесорного часу, яку взяла панель інструментів dhango. З профілюванням django час процесора становив близько 30 секунд, як тільки я його видалив, він зменшився до 1,5 секунди !!
noob Mama

28

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

Особисто я використовую підхід проміжного програмного забезпечення - тобто кожен користувач може перемикати прапор "профілювання", що зберігається в сеансі, і якщо моє профайлове профайлу помітить, що встановлений прапор, він використовує модуль гарячих знімків Python таким чином:

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 за своєю конструкцією не може дати корисне розуміння внутрішніх елементів запитів 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
code.google.com/p/django-profile - це програма django профілю користувача. це не використовується як профілювання django :)
dzen

1
@dzen: Ха, гарно, це мало бути: code.google.com/p/django-profiling :-)
Томаш Зелінський

1
якщо вам цікаво, як читати дампи профілі після запуску python manage.py runprofileserver --prof-path=/path/to/dir, дотримуйтесь цього блогу: darkcoding.net/software/profiling-django-for-cpu-bound-apps .
Неара

ах так, мій улюблений, за допомогою google знайти одну з найкращих відповідей на мій запит є "просто погуглити те, що ти погуглив, щоб сюди потрапити"
Анна,

Зауважте, що hotshotзастаріла та вилучена у Python 3, тому ця відповідь та ProfilingDjangoсторінка Wiki можуть більше не бути актуальними у 2020 році.
Братковський,

16

Для профілювання доступу до даних (саме там, де більшість часу є вузьке місце) перевірте django-live-profiler . На відміну від панелі інструментів налагодження Django, вона збирає дані за всіма запитами одночасно, і ви можете запустити їх у виробництві, не надто витрачаючи продуктивність та не розкриваючи внутрішні елементи програми.

Перегляньте цей знімок екрана


19
не підтримує версію 1.6 і вище, жодної діяльності більше року.
Хан Хе

14

Тут безсоромний штекер, але я нещодавно зробив https://github.com/django-silk/silk для цього. Це дещо схоже на панель інструментів django, але з історією, профілюванням коду та більш чітким контролем над усім.


Отримання випуску проміжного програмного забезпечення „Не вдається знайти обробників для реєстратора" silk.middleware "'
Naveen Agarwal


5

Для всіх вас, шанувальників 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

Коли подання не є HTML, наприклад JSON, використовуйте прості проміжні методи для профілювання.

Ось кілька прикладів:

https://gist.github.com/1229685 - зафіксувати всі виклики sql, що потрапили у поле зору

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


0

Нещодавно мені потрібно було скласти профіль програми Django і спробувати багато з цих пропозицій. Я замість цього використав pyinstrument , який можна додати до програми Django за допомогою одного оновлення списку проміжного програмного забезпечення та надає представлення часу на основі стеку.

Короткий підсумок мого досвіду роботи з іншими інструментами:

  • Панель інструментів налагодження Django чудово підходить, якщо проблема пов’язана із запитами SQL і працює добре в поєднанні зpyinstrument
  • django-silk працює добре, але вимагає додавання диспетчера контексту або декоратора до кожної частини стека, де ви хочете таймінги підзапитів. Він також забезпечує простий спосіб отримати доступ до cProfileтаймінгу та автоматично відображає таймінги Ajax, що може бути дуже корисним.
  • djdt-flamegraph виглядав багатообіцяючим, але сторінка ніколи насправді не відображалася в моїй системі.

Порівняно з іншими інструментами, які я пробував, pyinstrumentбуло значно простіше встановити та використовувати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.