Как использовать настройки tcp_keepalives в Postgresql? - PullRequest
11 голосов
/ 30 января 2010

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, но, похоже, это не дает никакого эффекта. Мой тест состоит в том, что я блокирую строку в таблице (используя SELECT FOR UPDATE) и отключаю рабочую станцию ​​от сети. Но в Postgresql я все еще вижу, что рабочая станция удерживает блокировку.

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

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

Любой совет?

1 Ответ

10 голосов
/ 02 февраля 2010

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

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

...