Everything you wanted to know
about the Django framework

Поиск узких мест производительности проекта на Django

Вступление

При оптимизации производительности веб-приложения распространенная ошибка — начинать с оптимизации самой медленной страницы (или API). Помимо учета времени отклика, мы также должны учитывать трафик, который он получает, чтобы определить порядок оптимизации.

В этой статье мы расскажем о веб-приложении Django, найдем узкие места с высокой эффективностью, а затем приступим к их оптимизации для повышения производительности. Посмотрите также совет, как узнать, какие SQL запросы выполняет ваш проект на Django и сколько они занимают времени.

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

django-silk — это инструмент для профилирования с открытым исходным кодом, который перехватывает и сохраняет данные HTTP-запросов. Установим его с помощью pip:

pip install django-silk

Добавим silk в установленные пакеты и в миддлвар в настройках проекта:

MIDDLEWARE = [
    ...
    'silk.middleware.SilkyMiddleware',
    ...
]

INSTALLED_APPS = (
    ...
    'silk'
)

Запустите миграцию, чтобы Silk мог создавать необходимые таблицы базы данных для хранения данных профилирования:

$ python manage.py makemigrations
$ python manage.py migrate
$ python manage.py collectstatic

На странице запросов silk (http://host/silk/requests/) мы можем видеть все запросы и сортировать их по общему времени или времени, потраченному на базу данных.

Узкие места (Bottlenecks)

Silk создает таблицу silk_request, которая содержит информацию о запросах, обработанных Django.

$ pgcli

library> \d silk_request;

+--------------------+--------------------------+-------------+
| Column             | Type                     | Modifiers   |
|--------------------+--------------------------+-------------|
| id                 | character varying(36)    |  not null   |
| path               | character varying(190)   |  not null   |
| time_taken         | double precision         |  not null   |
...

Мы можем сгруппировать данные этих запросов по пути, рассчитать количество запросов, среднее время выполнения и коэффициент влияния каждого пути. Поскольку мы учитываем время отклика и трафик, фактор влияния будет являться произведением среднего времени отклика и количества запросов по этому пути.

library> SELECT
     s.*, round((s.avg_time * s.count)/max(s.avg_time*s.count) over ()::NUMERIC,2) as impact
 FROM
     (select path, round(avg(time_taken)::numeric,2) as avg_time, count(path) as count from silk_request group by PATH)
     s
 ORDER BY impact DESC;

+-------------------------+------------+---------+----------+
| path                    | avg_time   | count   | impact   |
|-------------------------+------------+---------+----------|
| /point/book/book/       | 239.90     | 1400    | 1.00     |
| /point/book/data/       | 94.81      | 1900    | 0.54     |
| /point/                 | 152.49     | 900     | 0.41     |
| /point/login/           | 307.03     | 400     | 0.37     |
| /                       | 106.51     | 1000    | 0.32     |
| /point/auth/user/       | 494.11     | 200     | 0.29     |
...

Мы видим, что /point/book/book/ оказывает наибольшее влияние, хотя это не самая посещаемая ссылка и не самое медленное отображение (view). Оптимизация этого представления в первую очередь приводит к повышению общей производительности веб-приложения.

Заключение

В этой статье мы узнали, как легко начать профилирование веб-приложения Django и выявлять узкие места для повышения производительности. В следующей статье мы узнаем, как оптимизировать эти узкие места, подробно рассмотрев их.

Поделитесь с другими:

Представления-классы
(Class-Based Views)

Детальное описание и структура классов Django.

Добавление пользовательской аутентификации в Django

Нам необходимо добавить пользовательский бэкенд аутентификации в наш проект Django. Механизм аутентификации по умолчанию в Django требует, чтобы пользователь предоставил имя пользователя и пароль. Рассмотрим сценарий, в котором вы создаете банковское приложение. У каждого клиента есть customer_id. Возможно, вы захотите поддержать аутентификацию клиента с помощью имени пользователя и customer_id.

Выпущены релизы безопасности Django: 3.0.3, 2.2.10 и 1.11.28

В соответствии с политикой безопасности, команда Django выпускает Django 3.0.3, Django 2.2.10 и Django 1.11.28. Эти выпуски решают проблему безопасности, подробно описанную ниже. Мы призываем всех пользователей Django обновиться как можно скорее.

Релиз исправления Django: 3.0.2

Сегодня выпущен релиз исправления ошибок Django 3.0.2. Пакет релиза и контрольные суммы доступны на странице загрузок, а также из индекса пакетов Python. Идентификатор ключа PGP, использованный в этом выпуске: Mariusz Felisiak: 2EF56372BA48CD1B.

Как переключиться на пользовательскую модель User в существующем проекте

Документация по Django рекомендует всегда начинать ваш проект с пользовательской модели User (даже если она идентична Django с самого начала), чтобы упростить настройку позже, если вам нужно. Но что делать, если вы не видели этого при запуске проекта, или если вы унаследовали проект без пользовательской модели User, и вам нужно добавить ее?

Выпущены релизы безопасности Django: 3.0.1, 2.2.9 и 1.11.27

В соответствии с политикой безопасности, команда Django выпускает Django 3.0.1, Django 2.2.9 и Django 1.11.27. Эти выпуски решают проблему безопасности, подробно описанную ниже. Мы призываем всех пользователей Django обновиться как можно скорее.

Django: WebSocket`ы и Channels

WebSockets — это технология, которая позволяет открывать сеанс интерактивной связи между браузером пользователя и сервером. С помощью этой технологии пользователь может отправлять сообщения на сервер и получать управляемые событиями ответы, не требуя длительного опроса, то есть без необходимости постоянно проверять сервер на предмет ответа. Подумайте, когда вы отвечаете на электронное письмо в Gmail, и в нижней части экрана вы видите всплывающее предупреждение «1 непрочитанное сообщение от [...]» от человека, на которого вы только что отвечали. Такая обратная связь в режиме реального времени обусловлена такими технологиями, как WebSockets!

Выпуск Django 3.0

Команда Django рада объявить о выпуске Django 3.0: движение к тому, чтобы сделать Django полностью асинхронным, предоставляя поддержку для работы в качестве приложения ASGI, теперь официально поддерживает MariaDB 10.1 и выше, а также много других новых функций и возможностей.

Выпущены релизы безопасности Django: 2.2.8 и 2.1.15

В соответствии с политикой безопасности, команда Django выпускает Django 2.2.8 и Django 2.1.15. Этот выпуск решает проблему безопасности, подробно описанную ниже. Мы призываем всех пользователей Django обновиться как можно скорее.

Путь от request до response в Джанго

Веб-приложение или веб-сайт вращаются вокруг цикла запрос-ответ, и приложения Django не являются исключением. Но это не просто двухэтапный процесс. Наши приложения Django должны пройти различные стадии, чтобы вернуть конечному пользователю результат. Чтобы лучше понять структуру Django, мы должны понимать, как инициируются запросы и как конечный результат передается конечному пользователю. В статье объясняются различные этапы запросов и используемое там программное обеспечение или код.

Выпущен релиз-кандидат Django 3.0

Кандидат 1 релиза Django 3.0 - это последняя возможность для вас испытать множество новых функций перед выпуском Django 3.0.