Как увеличить максимальное количество подключений в postgres?

111

Я использую Postgres DB для своего продукта. При выполнении пакетной вставки с помощью Slick 3 я получаю сообщение об ошибке:

org.postgresql.util.PSQLException: FATAL: извините, уже слишком много клиентов.

Моя операция пакетной вставки будет содержать более тысячи записей. Максимальное количество подключений для моих postgres - 100.

Как увеличить максимальное количество подключений?

Jet
источник
Используйте пул соединений, например pgBouncer или pgPool
Фрэнк Хейкенс
2
1. Сначала проверьте, не поддерживает ли ваше промежуточное ПО слишком много открытых подключений или нет ли их утечки. 2. (возможно) затем использовать пул подключений. 3. (почти) никогда не увеличивайте количество разрешенных соединений для этого типа проблем, в большинстве случаев это только усугубит ситуацию. (кроме случаев, когда вы абсолютно уверены)
joop

Ответы:

223

Просто увеличение max_connections- плохая идея. Вам нужно увеличить shared_buffersи kernel.shmmaxтоже.


Соображения

max_connectionsопределяет максимальное количество одновременных подключений к серверу базы данных. По умолчанию обычно 100 подключений.

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

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

Хорошо написанное приложение обычно не требует большого количества подключений. Если у вас есть приложение, которому требуется большое количество подключений, подумайте об использовании такого инструмента, как pg_bouncer, который может объединять подключения для вас. Поскольку каждое соединение потребляет оперативную память, вы должны стремиться минимизировать их использование.


Как увеличить максимальное количество подключений

1. Увеличение max_connectionиshared_buffers

в /var/lib/pgsql/{version_number}/data/postgresql.conf

изменение

max_connections = 100
shared_buffers = 24MB

к

max_connections = 300
shared_buffers = 80MB

shared_buffersПараметр конфигурации определяет , сколько памяти будет посвящен в PostgreSQL использовать для кэширования данных .

  • Если у вас есть система с 1 ГБ или более ОЗУ, разумное начальное значение shared_buffers составляет 1/4 объема памяти в вашей системе.
  • маловероятно, что вы обнаружите, что использование более 40% ОЗУ для работы лучше, чем меньшее количество (например, 25%)
  • Имейте в виду, что если ваша система или сборка PostgreSQL 32-разрядная, может быть нецелесообразно устанавливать shared_buffers выше 2 ~ 2,5 ГБ.
  • Обратите внимание, что в Windows большие значения shared_buffers не так эффективны, и вы можете найти лучшие результаты, оставив их на относительно низком уровне и вместо этого больше используя кеш ОС. В Windows полезный диапазон составляет от 64 МБ до 512 МБ .

2. Измените kernel.shmmax

Вам нужно будет увеличить максимальный размер сегмента ядра, чтобы он был немного больше, чем размерshared_buffers .

В файле /etc/sysctl.confустановите параметр, как показано ниже. Он вступит в силу при postgresqlперезагрузке (следующая строка устанавливает максимальное значение ядра 96Mb)

kernel.shmmax=100663296

Ссылки

Максимальное количество подключений и общие буферы Postgres

Настройка сервера PostgreSQL

Анкит
источник
отличный ответ. пара вопросов .. как 100663296 равно 96Мб? и почему мы меняем shmmax, что это делает?
Robbo_UK 05
3
100663296 Байт = 96 МБ (в двоичном формате). shmmax - максимальный размер сегмента разделяемой памяти . Теперь, поскольку мы увеличили размер общих буферов, нам нужно изменить shmmax, чтобы приспособить увеличенную память для кеширования.
Ankit 05
1
@Robbo_UK 96 * 1024 * 1024 = 100663296
skrebbel
6
Вы можете использовать PGTune, чтобы помочь вам определить эти настройки для вашей системы
Йоан Турнад
12
Перед изменением проверьте текущую настройку kernel.shmmax ( cat /proc/sys/kernel/shmmax). В современных системах он уже установлен смехотворно высоким, и его не следует менять. Mine 18446744073692774399по умолчанию установлен в Ubuntu 18.04.
Карл Зулауф 08
31

Добавляя к отличному ответу Винни,

Если кто-то не может найти расположение файла postgresql.conf в вашей настройке, вы всегда можете спросить сам postgres.

SHOW config_file;

Для меня изменение только max_connections сделало трюк.

Джинксер Альбатрос
источник
2
Спасибо. В Ubuntu 18.04 это так/etc/postgresql/11/main/postgresql.conf
gies0r 01
1

измените переменную max_connections в файле postgresql.conf, расположенном в / var / lib / pgsql / data или / usr / local / pgsql / data /

Арчана
источник
2
Почему pg_hba.conf? У него нет никаких параметров о количестве подключений, только способ подключения. postgresql.conf с другой стороны .... Но сотни соединений - плохая идея, не делайте этого, не используйте пул соединений или страдайте от проблем с производительностью. PostgreSQL 8.3 является EOL в течение многих лет, пожалуйста, используйте последнюю версию.
Фрэнк Хейкенс,