Я не понимаю, какую информацию вы предоставляете, но могу ответить на вопрос:
Если клиентский процесс PostgreSQL умирает без закрытия соединения с базой данных (и TCP), серверный процесс PostgreSQL («бэкэнд-процесс »), что серверы этого соединения не сразу поймут это.
Конечно, как только сервер пытается связаться с клиентом, например, чтобы вернуть некоторые результаты, TCP обнаружит, что партнер ушелпрочь и вернет ошибку.
Однако, часто внутренний процесс бездействует, ожидая, пока клиент отправит следующий запрос.В этом случае он никогда не заметит, что его партнер умер.В конечном итоге это может привести к исчерпанию max_connections
из-за разорванных соединений.
Поскольку это распространенная проблема в сети, TCP предоставляет функцию «keepalive»: когда соединение некоторое время простаивает (2 часапо умолчанию), операционная система отправит так называемый «пакет активности» и будет ждать ответа от другой стороны.Отправка пакетов поддержки активности повторяется несколько раз (по умолчанию 5 раз) с короткими интервалами (по умолчанию 1 секунда), и если ответ не получен, соединение закрывается операционной системой, серверный процесс получает сообщение об ошибке и завершается.
PostgreSQL предоставляет параметры , с помощью которых вы можете настроить следующие параметры на стороне сервера: tcp_keepalives_idle
, tcp_keepalives_count
и tcp_keepalives_interval
.Если вы установите для tcp_keepalives_idle
более короткое значение, мертвые соединения будут обнаруживаться и удаляться быстрее за счет небольшого добавленного сетевого трафика.