PostgreSQL: too many clients already
Сообщение FATAL: sorry, too many clients already означает, что достигнут предел подключений. База при этом работает: она защищает себя от исчерпания памяти, потому что каждое соединение — это отдельный процесс со своими буферами.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Предел подключений мал для числа клиентов
Значение по умолчанию (100) рассчитано на скромную нагрузку. Несколько серверов приложений с пулами исчерпывают его быстро.
-
Приложение не закрывает соединения
Соединения в состоянии простоя копятся до предела. Признак — много записей с состоянием idle и давним временем начала.
-
Зарезервированные соединения для обслуживания исчерпаны
Часть подключений резервируется для суперпользователя. Если и они кончились, даже администратор не сможет подключиться.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Сколько соединений и в каких они состояниях.
sudo -u postgres psql -c 'SELECT count(*), state FROM pg_stat_activity GROUP BY state;'Подтверждение и время отказов.
sudo tail -20 /var/log/postgresql/postgresql-16-main.log | grep -i "too many"Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Значение по умолчанию (100) рассчитано на скромную нагрузку. Несколько серверов приложений с пулами исчерпывают его быстро.
- Как проверить
-
Посмотрите предел и текущие подключения.
sudo -u postgres psql -c 'SHOW max_connections;' -c 'SELECT count(*) FROM pg_stat_activity;'
- Как исправить
- Поднимать предел стоит осторожно: каждое соединение расходует память. Обычно правильнее поставить пул соединений перед базой.
- Почему происходит
- Соединения в состоянии простоя копятся до предела. Признак — много записей с состоянием idle и давним временем начала.
- Как проверить
-
Посмотрите состояния соединений.
sudo -u postgres psql -c "SELECT state, count(*) FROM pg_stat_activity GROUP BY state;"
- Как исправить
-
Настройте пул в приложении и ограничьте время простоя соединений параметром базы
idle_session_timeout.
- Почему происходит
- Часть подключений резервируется для суперпользователя. Если и они кончились, даже администратор не сможет подключиться.
- Как проверить
-
Посмотрите резерв и занятые подключения.
sudo -u postgres psql -c 'SHOW superuser_reserved_connections;' 2>/dev/null
- Как исправить
- Освободите соединения: завершите простаивающие сеансы средствами базы, затем разбирайтесь с источником.
Пример вывода
Предел подключений исчерпан. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
postgres[5100]: FATAL: sorry, too many clients already
app[1200]: error: connection to server at "127.0.0.1", port 5432 failed: FATAL: sorry, too many clients already
Связанные ошибки
- MySQL: Too many connections База отказывает в новых подключениях: исчерпан max_connections или предел дескрипторов службы.
- Connection refused в журнале службы Соединение отклонено: служба не может подключиться к базе, кешу или другому сервису. Порядок запуска, адрес, брандмауэр.
- Too many open files в журнале службы Служба исчерпала лимит файловых дескрипторов. Как правильно поднять LimitNOFILE и когда дело в утечке.
- Gunicorn: WORKER TIMEOUT в журнале службы Рабочие процессы Gunicorn убиваются по таймауту: медленные запросы, блокирующие вызовы, неверный тип обработчика.
- PostgreSQL: could not bind IPv4 address Кластер PostgreSQL не занимает порт: адрес занят другим экземпляром или остался файл сокета. Разбор.
- PostgreSQL: data directory has invalid permissions Кластер PostgreSQL не запускается из-за прав на каталог данных. Требование 0700 или 0750 и как вернуть владельца.
- PostgreSQL: долгий запуск и таймаут восстановления Кластер восстанавливается после аварийного завершения дольше таймаута systemd. Как правильно увеличить TimeoutStartSec.
- PostgreSQL: локаль кластера не совпадает с системой Кластер не запускается или сортировка ломается после обновления системы: несовпадение версии библиотеки локалей.
Где встречается чаще всего
Источники
- Документация PostgreSQL: настройка соединений
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено при max_connections=5 и пуле приложения на 20 соединений.