Django: CONN_MAX_AGE зберігає з'єднання, але не використовує їх повторно з PostgreSQL


17

У мене в налаштуваннях джанго використовуються Django 1.6.7 та Postgres 9.3 на Ubuntu 14.04 LTS.

У будь-який момент сайт отримує близько ~ 250 одночасних підключень до бази даних PostgreSQL, яка є Quad Core Xeon E5-2670 на 2,5 ГГц і має 16 ГБ оперативної пам’яті. Середнє навантаження на конкретній машині протягом дня становить приблизно від 20 до 30.

Іноді я отримуватиму повідомлення електронною поштою про часові розв’язки з'єднань із базою даних, і я думаю, що включення певного об'єднання з'єднань допоможе пом'якшити цю проблему, а також трохи зменшить навантаження на базу даних.

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

Таким чином, виявляється , для того, що коли - небудь причини, з'єднання ARE зберігаються, але вони НЕ повторного використання.

Що може бути причиною цього?

PS. Ми також використовуємо gunicorn з --worker-class = eventlet. Можливо, це джерело наших неприємностей?

Відповіді:


18

Проводячи ще кілька експериментів, я виявив, що причиною нашої проблеми був справді клас робітників "артилерійських". Кожен мікропоток зробив власне стійке з'єднання, і взагалі не було можливості повторно використовувати будь-який з них.

Якщо вимкнути eventlet, навантаження на наші веб-сервери збільшилося (але не на багато), але завантаження після розсилки знизилося в середньому до 3. З 30.


2
Ти щойно врятував нас тонну часу! Ми спостерігаємо абсолютно таку ж поведінку і використовуємо eventlet. Спробуємо переключитися на об'єднання груп і побачити, як воно буде працювати.
мовчанець

3
Оновлення: об'єднання баз даних з pgBouncer, здавалося, вирішило проблему (ми все ще використовуємо eventlet)
silentser

Мабуть, є і психокорінка: pypi.python.org/pypi/psycogreen/1.0 (Я не пробував це, як тільки я встановив CONN_MAX_AGE нульовим, для нашої системи потрібно 20 мс для з'єднання з БД, тому нам просто не потрібно об'єднання)
Даррен

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