
У меня есть сервер PostgreSQL 9.4, который, похоже, ограничивает количество подключений до меньшего значения, чем я определил в max_connections.
У меня max_connections установлен на 300.
SHOW max_connections;
max_connections
-----------------
300
Однако я обнаружил, что новые соединения начинают отключаться сразу после того, как количество активных соединений достигает 100, согласно измерениямSELECT count(*) from pg_stat_activity;
Пока это число меньше 100, новые соединения работают. Как только оно достигает 100, новые соединения прекращаются: PG::ConnectionBad: could not connect to server: Connection timed out
(библиотека Ruby pg)
Похоже, что для подключений суперпользователей (т. е. для меня, подключающегося через PgAdmin) есть исключение, поскольку таким образом я могу превысить порог в 100, хотя приложения, не использующие суперпользователей, продолжают отключаться по тайм-ауту.
Я не могу точно определить, в чем может быть основная причина.
Некоторые настройки конфигурации:
max_connections = 300
superuser_reserved_connections = 2
shared_buffers = 1024MB
effective_cache_size = 2048MB
work_mem = 8MB
maintenance_work_mem = 256MB
Я попробовал немного повозиться с этими значениями, но безрезультатно.
Другие детали:
- Ubuntu 14.04 64-бит
- 4 ГБ линейного VPS
- PostgreSQL 9.4.1
- По сути, при той же конфигурации на PostgreSQL 9.2 такой проблемы не возникло.
- Базы данных были перенесены из Postgres 9.2 через pg_dumpall
- Использование памяти, похоже, не является проблемой,
free
отображается 2,1 ГБ свободно, 3,5 ГБ, включая буферы/кэш. - Подключения предназначены для многих различных ролей ко многим различным базам данных, ни одна отдельная база данных не имеет более 5 или 6 активных подключений, и к каждой базе данных обращается ее собственная отдельная роль. Кажется, не нарушает никаких ограничений на подключение к отдельным базам данных или ролям.
решение1
Вы также увеличили максимальный размер сегмента ядра?
Пытаться:
sysctl -w kernel.shmmax=1258291200
решение2
Возможно ли, что вы ограничили максимальное количество подключений пользователей?Ролевые привилегии
Вы можете изменить это с помощью
ИЗМЕНИТЬ РОЛЬ имя_роли ПРЕДЕЛ ПОДКЛЮЧЕНИЯ 300;