Масштабирование Django: поиск узких мест

Django – это быстрая платформа Python для разработки современных веб-приложений.

По мере роста вашего приложения в производстве оно начнет получать больший объем данных, который со временем станет сложно обрабатывать. Это повлияет на производительность приложения.

Существует несколько способов решения этой проблемы. Для начала нужно найти узкие места – компоненты приложения, которые больше всего влияют на производительность в данной ситуации.

База данных

В локальной разработке обычно используется БД SQLite3. Иногда эта СУБД используется и в среде производства, однако она недостаточно мощная для этой среды.

В отличие от MySQL и PostgreSQL, SQLite3 не может поддерживать множество одновременных подключений (особенно если пользователь выполняет много операций записи в базе данных).

На VPS с небольшим объемом памяти (512 Мб) лучше использовать MySQL. Если на сервере больше памяти (2 Гб или больше), настоятельно рекомендуется рассмотреть PostgreSQL – это предпочтительный вариант СУБД для разработки в Django.

Режим отладки

Режим отладки абсолютно необходим при локальной разработке, но это замедлит работу сервера в производстве. Просмотрите файл settings.py и убедитесь, что строки DEBUG и TEMPLATE_DEBUG имеют значение False.

Использование инструментов отладки для устранения проблем с производительностью

На локальном компьютере разработки (не на сервере производства) включите панель инструментов Django Debug Toolbar. С помощью этих инструментов вы можете обнаружить проблемы производительности и устранить их.

Чтобы получить доступ к панели, установите модуль django-debug-toolbar, а затем добавьте следующую запись в словарь MIDDLEWARE_CLASSES:

MIDDLEWARE_CLASSES = (
# ...
'debug_toolbar.middleware.DebugToolbarMiddleware',
# ...
)

Затем создайте переменную INTERNAL_IPS и поместите в нее свой IP-адрес. Если вы ведете разработку локально, вашим IP будет 127.0.0.1. Добавьте в файл строку:

INTERNAL_IPS = ('127.0.0.1',)

После этого добавьте debug_toolbar как последний элемент INSTALLED_APPS:

INSTALLED_APPS = (
# ...
'debug_toolbar',
)

В документации по установке вы найдете дополнительные параметры конфигурации.

Примечание: Будьте внимательны, не вводите в производство непроверенные изменения.

Теперь при просмотре сайта сбоку от веб-страниц вы увидите черную панель. Здесь вы найдете статистические данные и множество дополнительной информации.

Опытные разработчики рекомендуют сосредоточиться на разделе SQL, так как обычно именно эта область является источником проблем.

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

Это может вызвать n+1 число SQL-запросов. Предположим, вы собираетесь заменить версию Twitter. Вы создаете модель для твитов, где каждая модель связана с моделью пользователя. На главной странице отображается 30 последних твитов вместе с именем пользователя, который их создал. Это может привести к выполнению как минимум 31 SQL-запроса: один запрос для получения списка твитов и по одному запросу для поиска имени каждого пользователя.

Решение этой проблемы – модель select_related. Это очень простая модификация запроса, которая заставляет Django выполнять объединение при извлечении данных. Используйте select_related в любом поиске, в котором нужно извлекать связанные поля.

Запрос, который выглядит так:

Entry.objects.get(id=5)

изменится таким образом:

Entry.objects.select_related().get(id=5)

Ознакомьтесь с документацией этого расширения и используйте его только в случае необходимости.

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

Читайте также:

Tags: