Як збільшити максимум з'єднань у постгресах?


108

Я використовую DB Postgres для свого продукту. Під час виконання пакетної вставки за допомогою slick 3 я отримую повідомлення про помилку:

org.postgresql.util.PSQLException: FATAL: вибачте, занадто багато клієнтів вже є.

Операція моєї пакетної вставки складе більше тисяч записів. Максимальне з'єднання для моїх постгрес - 100.

Як збільшити максимум з'єднань?



Використовуйте пул підключень, наприклад pgBouncer або pgPool
Frank Heikens

2
1. Спочатку перевірте, чи ваше проміжне програмне забезпечення не підтримує занадто багато з’єднань відкритими чи не протікає. 2. (можливо) наступне використання підключення з'єднання. 3. (майже) ніколи не збільшуйте кількість дозволених з'єднань щодо подібного типу проблем, у більшості випадків це погіршить ситуацію. (за винятком випадків, коли ви абсолютно впевнені)
joop

Відповіді:


220

Просто збільшення 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

Список літератури

Постгреси Максимальні з'єднання та спільні буфери

Налаштування сервера PostgreSQL


чудова відповідь. пара питань .. як 100663296 дорівнює 96 МБ? і чому ми змінюємо shmmax, що це робить?
Robbo_UK

3
100663296 байт = 96 МБ (у двійкових). shmmax - максимальний розмір сегмента спільної пам'яті . Тепер, оскільки ми збільшили розмір загальних буферів, нам потрібно змінити shmmax, щоб забезпечити збільшення пам’яті для кешування.
Анкіт

1
@Robbo_UK 96 * 1024 * 1024 = 100663296
skrebbel

6
Ви можете використовувати PGTune, щоб допомогти вам визначити ці налаштування для вашої системи
Yoan Tournade

11
Перевірте свій поточний параметр kernel.shmmax ( cat /proc/sys/kernel/shmmax) перед його зміною. У сучасних системах це вже встановлено смішно високим рівнем і його не слід міняти. У 18446744073692774399Ubuntu 18.04 за замовчуванням встановлено значення Mine .
Карл

30

Додавши чудову відповідь Вінні,

Якщо хтось не в змозі знайти місце розташування файлу postgresql.conf у вашому налаштуванні, ви завжди можете запитати сам postgres.

SHOW config_file;

Для мене лише зміна max_connections зробила трюк.


2
Дякую. В Ubuntu 18.04 це/etc/postgresql/11/main/postgresql.conf
gies0r

1

зміни змінної max_connections у файлі postgresql.conf, який знаходиться в / var / lib / pgsql / data або / usr / local / pgsql / data /


2
Чому pg_hba.conf? У ньому немає жодного параметра про кількість підключень, лише як підключити. postgresql.conf з іншого боку .... Але сотні з’єднань - це погана ідея, не робіть цього, використовуйте пул з'єднань або страждаєте від проблем продуктивності. PostgreSQL 8.3 є EOL протягом багатьох років, будь ласка, використовуйте оновлену версію.
Френк Хайкенс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.