Как рассчитать max_connections для PostgreSQL и default_pool_size для pgbouncer?

17

Есть ли правило или что-то, что я могу использовать для вычисления хорошего числа max_connections, default_pool_sizeи max_client_conn?

Значения по умолчанию странные. PostgreSQL по умолчанию имеет значение max_connections = 100, а pgbouncer по умолчанию - default_pool_size = 20. Разве default_pool_size не должен всегда быть выше, чем max_connections? Иначе какой смысл? Я думал, что pgbouncer предназначен для того, чтобы мы могли обрабатывать больше соединений, снижая их издержки (путем повторного использования соединений PostgreSQL). Я не совсем понимаю.

Я ищу совет, подобный тем, которые можно найти в вики PostgreSQL , например, «этот параметр должен составлять ~ 50% вашей памяти».

Я помню, что для MySQL существовала электронная таблица, которая позволяла бы вам рассчитывать параметры такого рода. Было бы здорово иметь что-то подобное для PostgreSQL / pgbouncer.

ChocoDeveloper
источник

Ответы:

12

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

Во-вторых, вы смотрите на это неправильно.
Количество памяти (или любого другого ресурса), которое у вас есть, не определяет количество установленных вами соединений, а количество необходимых вам соединений определяет, насколько мощным является сервер, который вы должны приобрести.
Требования к ресурсам для каждого соединения подробно изложены в руководстве , а также обсуждены в вики, с которой вы связаны. Выясните, в чем нуждается ваша среда (или сделайте обоснованное предположение), и убедитесь, что оборудование, на котором вы собираетесь работать, сможет справиться с тем, что вы намереваетесь использовать.


В частности, в отношении ограничений на соединения и размера пула у вас должно быть «достаточно» соединений для удовлетворения требований вашего приложения - либо на одном сервере, либо через пул / баунсер.

«Достаточно» - это относительное число: приложение, которое устанавливает (и постоянно использует) одно соединение, требует только одного соединения. Приложение, которое устанавливает соединение для каждого конечного пользователя, который входит в систему, требует столько же подключений к БД, сколько и пользователей.

Значения по умолчанию для Postgres и pgbouncerявляются значениями по умолчанию :

  • 100 подключений к базе данных - это много для обычного человека, бросающего Postgres в среду.
    Разработчикам, вероятно, не понадобится больше 10. Любой другой будет знать достаточно, чтобы увеличить число.

  • 20 подключений pgbouncerк одному пулу БД означают, что вы можете получить 4 пула, указывающих на один сервер, и не превышать установленное по умолчанию ограничение на количество соединений Postgres
    Можно pgbouncerуказывать несколько объединенных ресурсов для указания на одну внутреннюю базу данных, и вам всегда нужны некоторые доступные соединения на ваших внутренних серверах.

Если значения по умолчанию не подходят для вашей среды, вы должны их изменить.

Помните, что пул соединений не означает «всегда связывать каждое доступное соединение с базой данных».
Смысл, pgbouncerкак вы заметили, заключается в повторном использовании соединений. Прибыль эффективности здесь не требует, чтобы вы связывали каждое доступное соединение, просто вы не отсоединяете, повторно соединяете, повторно согласовываете SSL, повторно аутентифицируетесь в базе данных и повторно запускаете запросы на установление соединения каждый раз.

voretaq7
источник
8
Я не вижу смысла покупать больше оборудования, прежде чем настраивать все правильно. «Любой другой будет знать достаточно, чтобы увеличить число» . Ну, где я могу научиться знать достаточно? Я не нахожу много материала о связях. Это просто метод проб и ошибок? Электронная таблица, которую я упоминал для MySQL, работала как шарм. Использование большего количества соединений, чем указано в нем, приведет к нехватке памяти на сервере. Прямо сейчас у меня есть 4 ГБ, я ожидал, чтобы увеличить значения по умолчанию. Кроме того, 20x4 = 80, для чего остальные 20?
ChocoDeveloper
1
@ChocoDeveloper Пожалуйста, перечитайте мой ответ полностью (вы спрашиваете некоторые вещи, которые я уже рассмотрел), и потратьте несколько минут с документацией, с которой я связан. Вы все еще смотрите на это задом наперед (см. Первый абзац моего ответа). Имейте в виду, что Postgres - это НЕ MySQL: вам нужно забыть все, что вы думаете из опыта настройки MySQL. Postgres больше похож на Oracle. Изучите руководство и действуйте в соответствии с инструкциями, которые оно вам дает.
voretaq7
1

Обратите внимание на определение документацииdefault_pool_size

Сколько соединений с сервером разрешено для каждой пары пользователь / база данных.

Таким образом, если конфигурация по умолчанию имеет размер пула 20, из 100 соединений в общей сложности это означает, что 5 различным парам пользователь / база данных придется максимально увеличить свой размер пула, прежде чем они достигнут общего предела. И наоборот, если, например, вы используете pgbouncer для маршрутизации в одну базу данных через одного пользователя, ваш эффективный лимит соединения составляет 20, а не 100, поэтому вы должны соответствующим образом установить размер пула для этого варианта использования. YMMV.

Иосип Роден
источник