Как использовать tcp_keepalives настройки в Postgresql?

Postgresql имеет 3 настройки проверки активности для управления выделенными соединениями (в postgresql.conf):

tcp_keepalives_count
tcp_keepalives_idle
tcp_keepalives_interval

По умолчанию это 0.

Поведение, которое я хотел бы, состоит в том, чтобы Postgresql отбросил соединения клиента после промежутка времени, должен клиент терять его сетевое соединение или заснуть.

Я в настоящее время использую эти значения:

tcp_keepalives_count = 1
tcp_keepalives_idle = 60
tcp_keepalives_interval = 60

Я выполняю PostgreSQL 8.4 на Mac OS X, но это, кажется, не имеет эффекта. Мой тест - то, что я блокирую строку в таблице (использующий ИЗБРАННЫЙ FOR UPDATE) и разъединяю рабочую станцию от сети. Но в Postgresql я все еще вижу что рабочая станция, содержащая блокировку.

Я ожидал бы, что после того, как время передало (60 секунд в этом случае), соединение было бы завершено, и блокировка будет выпущена.

Или я делаю что-то не так, или я полностью неправильно понимаю, как это, как предполагается, работает.

Совет?

11
задан Paul Lefebvre 1 February 2010 в 13:41
поделиться

1 ответ

Я думаю, вам нужно вместо этого настроить операционную систему. Изменение параметров поддержки активности программами пока не имеет широкой поддержки. Это должно помочь вам:
Использование TCP keepalive для обнаружения сетевых ошибок

Также ваши параметры выбраны неправильно. Если tcp_keepalives_count = 1 работал, то даже один потерянный пакет keepalive разорвет ваше соединение. И отдельные пакеты часто теряются. Я бы использовал следующее в /etc/sysctl.conf на MacOSX / FreeBSD:
net.inet.tcp.keepidle = 60000
net .inet.tcp.keepintvl = 10000
ОС будет разрывать соединения максимум за 140 секунд (60 секунд простоя + 8 пакетов поддержки активности с 10-секундными интервалами) после потери соединения.

10
ответ дан 3 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: