В PostgreSQL кончились соединения
Ошибка too many clients already в PostgreSQL под Directum RX: база отказывает в новых соединениях. Как посмотреть, кто их занял, и что менять.
Что это значит
База дошла до лимита max_connections и отказывает новым сессиям. Сервисы RX получают отказ при подключении, пользователи видят ошибки при открытии и сохранении. Вариант той же ситуации: remaining connection slots are reserved for roles with the SUPERUSER attribute. Обычные места заняты, остались только резервные для администратора.
Причин обычно три. Лимит остался по умолчанию (100), а сервисов и экземпляров много. Сессии висят в состоянии idle in transaction и не освобождаются. Сервис после сбоя переподключается в цикле и плодит соединения.
Как проверить
Подключитесь под суперпользователем, для него места оставлены:
select count(*), state, application_name
from pg_stat_activity
where backend_type = 'client backend'
group by 2, 3 order by 1 desc;
Много строк idle in transaction означает, что соединения держит приложение. Много idle от одного сервиса означает слишком большой пул или утечку.
Что сделать
- Сейчас: завершить зависшие сессии через
select pg_terminate_backend(pid)для тех, кто простаивает в транзакции дольше получаса. - Поставить
idle_in_transaction_session_timeout, например 25 минут, чтобы такие сессии закрывались сами. - Поднять
max_connectionsс оглядкой на память: каждое соединение стоит около 10 МБ плюсwork_mem. Изменение требует перезапуска базы. - Если нужно больше 600 соединений, ставить перед базой пул (PgBouncer) вместо дальнейшего роста лимита.
Подобрать max_connections и work_mem под ваш сервер поможет калькулятор настроек PostgreSQL.