Django 1.11 PostgreSQL - команда "SET TIME ZONE" на каждом сеансе - PullRequest
0 голосов
/ 18 апреля 2019

Мы решаем пару проблем с производительностью на одном из наших веб-сайтов, и мы заметили, что команда «УСТАНОВИТЬ ЗОНУ ВРЕМЕНИ« Америка / Чикаго »» выполняется так часто, что в течение 24 часов, просто на выполнение этой команды уходит менее 1 часа (или около 4% от общих ресурсов ЦП БД).

Обратите внимание, что параметр "USE_TZ" имеет значение False, поэтому, насколько я понимаю, все должно храниться в базе данных как UTC и преобразовываться в пользовательском интерфейсе в местный часовой пояс только при необходимости.

Есть ли у вас какие-либо идеи о том, как мы можем удалить это напряжение на сервере базы данных?

1 Ответ

3 голосов
/ 18 апреля 2019

Для postgres Django всегда устанавливает часовой пояс: либо локальный сервер (когда USE_TZ = False), либо UTC (когда USE_TZ = True).Таким образом, django поддерживает «живое переключение» settings.USE_TZ для базы данных postgreSQL DB.

Как вы на самом деле определили, что это узкое место?

Обычно SET TIME ZONE вызывается только при создании соединения с БД.Возможно, вам следует использовать постоянные соединения, используя settings.DATABASES[...]['CONN_MAX_AGE'] = GREATER_THAN_ZERO ( docs ).Таким образом, соединения будут использоваться повторно, и вы будете меньше звонить на SET TIME ZONE.Но если вы используете этот подход, вам также следует внимательно изучить конфигурацию PostgreSQL:

  • max_connections должно быть больше 1 + максимальный параллелизм сервера wsgi + максимальное количество одновременных заданий cron, которые используют django(если они у вас есть) + максимальный параллелизм рабочих из сельдерея (если они у вас есть) + любые другие потенциальные источники соединений с postgres
  • , если вы запускаете задание cron для вызова pg_terminate_backendзатем убедитесь, что CONN_MAX_AGE больше, чем «время ожидания простоя»
  • , если вы используете postgres на VPS, тогда в некоторых случаях могут быть ограничения на количество открытых сокетов)
  • , если выиспользуется что-то вроде pgbouncer , тогда он может уже повторно использовать соединения
  • , если вы убиваете сервер, обслуживающий ваш проект django с помощью sigkill (kill -9), то он может оставить некоторые незакрытые соединенияв БД (но я не уверен)

Я думаю, это также может произойти, если вы используете django.utils.timezone.activate.Но я не уверен в этом ... Это может произойти, если вы вручную вызываете это в своем коде или когда используете промежуточное ПО для этого

Другие возможные объяснения: как вы«профилирование» ваших запросов фактически показывает время всей транзакции

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