Постоянные соединения Django с PgBouncer?
У нас есть проблемы с производительностью базы данных, и я рассматриваю возможность добавления PgBouncer для более эффективной обработки соединений и, надеюсь, решения этой проблемы.
Однако после его настройки я не знаю, как определить, обрабатывает ли PgBouncer соединения так, как задумано (если вообще обрабатывает), здоровым и эффективным способом.
Я думаю, что ключевым моментом является решение о том, какой параметр CONN_MAX_AGE
Djang должен быть установлен: 0
или None
. В этом ответе говорится, что для постоянных соединений следует установить значение None
. Но разве это не лишит PgBouncer цели объединения соединений? Разве мы не хотим установить значение 0
и вместо этого отпускать соединения обратно в пул?
Я установил уровень многословия PgBouncer на 3, позвольте мне вставить мой лог, когда CONN_MAX_AGE
является None
и когда он является 0
, надеюсь, он расскажет вам что-то важное, чего я сам не вижу:
CONN_MAX_AGE = None
CONN_MAX_AGE = 0
На первый взгляд, я не вижу разницы в журнале, но в нем также много чего регистрируется.
По крайней мере, я развеял свои сомнения по поводу того, использовался ли PgBouncer вообще, так как я вижу некоторые упоминания о запросах и транзакциях в журнале, когда тестирую это на staging. Все, что потребовалось, это изменить порт на порт PgBouncer.
Если это имеет значение, то вот мои настройки PgBouncer:
[databases]
template1 = host=localhost port=5432 dbname=dbname
[pgbouncer]
auth_type = md5
auth_file = /etc/pgbouncer/userlist.txt
logfile = /etc/pgbouncer/pgbouncer.log
pidfile = /etc/pgbouncer/pgbouncer.pid
pool_mode = transaction
max_client_conn = 250
min_pool_size = 10
reserve_pool_size = 10
reserve_pool_timeout = 2
Числа кажутся немного произвольными, я установил default_pool_size
на 250
, потому что в упомянутом ответе говорится, что оно должно быть ниже максимального количества соединений Postgres, которое в моем случае составляет 300
.
Затем они также установили max_client_conn
на 1000
, потому что у них есть установка Gunicorn с eventlet, что также является моим случаем. Я запускаю его с 17 рабочими, но eventlet однопоточный, если я не ошибаюсь, поэтому максимальное количество соединений также не будет равно 17? Как они могут быть такими высокими? Я определенно что-то упускаю.
Подведем итоги:
Нужно ли установить CONN_MAX_AGE на
0
или наNone
?Показывают ли мои журналы PgBouncer здоровое поведение?
Какие значения я должен использовать для PgBouncer
default_pool_size
иmax_client_conn
, если я запускаю 17 рабочих Gunicorn?
Редактирование: я только что понял, что каждый рабочий eventlet обрабатывает до 1000 соединений. Означает ли это потенциально 17000 одновременных соединений с базой данных, если бы не max_connections
Postgres?