Назад | Перейти на главную страницу

Django: CONN_MAX_AGE сохраняет соединения, но не использует их повторно с PostgreSQL

У меня есть настройка django с использованием Django 1.6.7 и Postgres 9.3 на Ubuntu 14.04 LTS.

В любой момент времени сайт получает около 250 одновременных подключений к базе данных PostgreSQL, которая представляет собой четырехъядерный процессор Xeon E5-2670 с частотой 2,5 ГГц и имеет 16 ГБ оперативной памяти. Средняя нагрузка на эту машину в течение дня составляет от 20 до 30.

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

Поскольку мы используем Django 1.6, у нас есть встроенный пул. Однако, когда я устанавливаю CONN_MAX_AGE на 10 секунд или 60 секунд, почти сразу количество одновременных подключений подскакивает до максимально разрешенного значения (что примерно вдвое больше, чем мы обычно видим), и подключения начинают отклоняться.

Итак, похоже, по какой-либо причине связи ЯВЛЯЮТСЯ настойчиво, но они НЕ используется повторно.

Что могло быть причиной этого?

PS. Мы также используем gunicorn с --worker-class = eventlet. Может, в этом источник наших бед?

Проведя еще несколько экспериментов, я обнаружил, что причиной нашей проблемы действительно был рабочий класс eventlet gunicorn. Каждый микропоток создавал собственное постоянное соединение, и не было возможности повторно использовать какой-либо из них.

Отключение eventlet увеличило нагрузку на наши веб-серверы (но не намного), но теперь загрузка postgres в среднем снизилась до 3. С 30.