2010-01-30 294 views
9

PostgreSQL有管理掉線(postgresql.conf中)3個存活設置:如何在Postgresql中使用tcp_keepalives設置?

tcp_keepalives_count
tcp_keepalives_idle
tcp_keepalives_interval

默認情況下,這些都爲0

我想的行爲是Postgresql在一段時間後丟棄客戶端連接,如果客戶端失去其網絡連接或進入休眠狀態。

我目前使用這些值:

tcp_keepalives_count = 1
tcp_keepalives_idle = 60
tcp_keepalives_interval = 60

我在Mac OS X上運行的PostgreSQL 8.4,但它似乎並不具備任何效果。我的測試是我鎖定表中的一行(使用SELECT FOR UPDATE)並從網絡上斷開工作站。但在Postgresql中,我仍然可以看到那個工作站持有鎖。

我認爲在時間過去後(在這種情況下爲60秒),連接將被終止並且鎖定將被釋放。

要麼我做錯了什麼,要麼我完全誤解了這應該如何工作。

有什麼建議嗎?

+0

無。我一直在想我有什麼......然後什麼也沒有。 – pestilence669 2010-01-30 04:57:16

+0

我確實在一夜之間離開了服務器,當我檢查AM時,鎖被釋放。我不知道連接終止需要多長時間,但顯然它沒有查看我的新設置(並且,是的,我重新啓動了服務器)。 – 2010-01-30 17:48:21

回答

9

我認爲你需要配置操作系統來代替。目前還沒有廣泛支持通過程序改變Keepalive參數。這應該會對你有所幫助:
Using TCP keepalive to Detect Network Errors

另外你的參數選擇不好。如果tcp_keepalives_count=1工作,那麼即使丟失一個Keepalive數據包也會丟失連接。單個數據包經常丟失。我會使用以下中/etc/sysctl.conf MacOSX上/ FreeBSD的:
net.inet.tcp.keepidle = 60000
net.inet.tcp.keepintvl = 10000
然後 OS將下降至多140秒(60秒的連接空閒+8個保持連接的數據包,間隔10秒)。