Рекомендации по настройке и использованию
Pangolin Pooler используется для снижения количества соединений с БД, потому что каждая сессия БД потребляет ресурсы RAM и CPU.
Как правило, постепенное или неограниченное увеличение количества активных пользовательских сессий в БД приводит к следующим сценариям:
- Производительность СУБД перестает расти и начинает деградировать для большинства профилей нагрузки.
- Повышается утилизация CPU и RAM-сервера вплоть до OОM killer.
Оптимальное количество соединений с БД фиксируется параметром max_connections
, и его значение должно определяться на этапе нагрузочного тестирования, исходя из профиля нагрузки и возможностей КТС.
Настройка max_connections
Параметр max_connections
задает максимальное количество одновременных подключений к серверу СУБД. Для каждого подключения создается отдельный процесс в операционной системе. По умолчанию значение составляет 100, но оно может быть снижено, если ядро накладывает свои ограничения – это определяется во время инициализации кластера (initdb
). Параметр можно изменить только при запуске сервера.
При использовании репликации рекомендуется устанавливать одинаковое значение max_connections
как на Primary, так и на StandBy-серверах. Это связано с тем, что в случае переключения роли (например, при автоматическом failover), StandBy может стать новым Primary, и если у него установлено меньшее значение max_connections
, часть пользователей может не получить подключение.
Рекомендации по определению значения параметра
Параметр конфигурации СУБД max_connections
устанавливается как максимальное количество одновременных соединений, которое, будет использоваться при пиковой нагрузке. Каждое соединение использует shared_buffer
-память, а также дополнительную неразделяемую память.
Точное значение данного параметра вычисляется на нагрузочном тестировании (далее – НТ) для профиля нагрузки. Среднестатистически, при установке значения, вычисляется по этой формуле max_connections = GREATEST (5 x CPU cores, 100)
.
Pangolin Pooler рекомендуется использовать, когда приложение создает превышающее max_connections
количество клиентских подключений (max_client_conn > max_connections
) для оптимизации производительности СУБД и экономии ресурсов RAM и CPU-сервера.
Следует придерживаться следующих правил:
- Значение
max_db_connections <= max_connections - superuser_reserved_connections - 30
. - Выставление параметров
min_pool_size = default_pool_size
позволяет избежать накладных расходов на повторное открытие и закрытие соединений.
Пример сбалансированной конфигурации, когда один пользователь (ТУЗ) работает с одной БД:
max_client_conn = 1000
;pool_mode = transaction
;min_pool_size = 200
;default_pool_size = 200
;max_db_connections = 200
;max_user_connections = 200
.
Подобное соотношение позволяет эффективно использовать соединения к СУБД, одновременно обслуживая большое количество клиентов.
Стоит отметить, что эффективность использования пулера достигается тогда, когда значение max_db_connections
значительно меньше, чем max_client_conn
. В этом случае Pooler агрегирует множество клиентских соединений и переиспользует ограниченное число подключений к СУБД, тем самым снижая нагрузку и увеличивая масштабируемость.
Если же значения max_db_connections
и max_client_conn
равны или близки, то пулер фактически перестает выполнять свою функцию — каждое клиентское соединение напрямую транслируется в подключение к базе данных. Это приводит к тому, что Pooler становится просто промежуточным звеном замедляющим работу.
Стоит обратить внимание, что параметр default_pool_size
задается для пары пользователь/БД, поэтому для каждой созданной БД или подключаемого пользователя потенциально может открываться default_pool_size * total databases * total users
соединений. Это необходимо учитывать при настройке параметров max_db_connections
и max_user_connections
, которые задаются независимо от пользователя и БД соответственно. В таких случаях рекомендуется явно ограничивать количество подключений через параметр pool_size
в секции databases
для каждой созданной БД.
Pangolin Pooler является однопоточным приложением, поэтому важно следить за утилизацией ядра CPU, на котором оно работает. Также не исключается взаимовлияние серверных процессов и Pangolin Pooler друг на друга в случае работы на одном ядре.
Работа через Pangolin Pooler замедляет отклик от БД в среднем на 5%, так как весь входящий и исходящий трафик проходит через него.
Pangolin Pooler не рекомендуется использовать:
- Когда ядро, на котором работает Pangolin Pooler, нагружено более чем на 70%.
- В режимах работы
pool_mode = session/statement
. - В режимах работы
pool_mode = transaction
, при OLTP нагрузках с требованиями более 1000-10000 tps и длительностью операции менее 1-10мс из-за накладных расходов при работе с сокетом, который диагностируются ростомsys_time
на CPU. - В конфигурациях, когда количество клиентских подключений в пределе достигает количества подключений к БД (
max_client_conn = max_db_connections
при использовании одной БД). - Для OLAP-нагрузок, требующих большого трафика через Pangolin Pooler.
Пример потенциально нежелательной конфигурации, когда один пользователь (ТУЗ) работает с одной БД:
max_client_conn
= 1000 и более;default_pool_size
= 1000 и более;max_db_connections
= 1000 и более;max_user_connections
= 1000 и более.
Стоит обратить внимание, что перед настройкой параметров подключения Pangolin Pooler необходимо убедиться, что параметр СУБД max_connections
обеспечивает требуемое количество подключений и в случае необходимости изменить его.
При создании подключений через HikariCP на стороне приложения в максимальном количестве менее, чем max_connections
, рекомендуется подключаться напрямую к БД. Однако в случае, когда суммарное количество клиентских подключений превышает max_connections
, рекомендуется использовать Pangolin Pooler в связке с HikariCP, предварительно настроив параметры групп соединений и тайм-аутов с двух сторон:
- Параметр
max_client_conn
должен превышать сумму всех возможных подключений сHikariCP = hosts * maximum - pool_size
. - Тайм-аут на подключение на клиенте должен быть выше, чем на Pangolin Pooler.