【问题标题】:How to use tcp_keepalives settings in Postgresql?如何在 Postgresql 中使用 tcp_keepalives 设置?
【发布时间】:2010-01-30 04:34:29
【问题描述】:

Postgresql 有 3 个 keepalive 设置用于管理断开的连接(在 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

我在 Mac OS X 上运行 PostgreSQL 8.4,但它似乎没有任何效果。我的测试是锁定表中的一行(使用 SELECT FOR UPDATE)并断开工作站与网络的连接。但在 Postgresql 中,我仍然看到那个工作站持有锁。

我希望在时间过去后(在这种情况下为 60 秒),连接将被终止并被释放。

要么我做错了什么,要么我完全误解了它应该如何工作。

有什么建议吗?

【问题讨论】:

  • 我确实让服务器通宵运行,当我在上午签到时,锁被释放了。我不确切知道连接终止需要多长时间,但显然它没有查看我的新设置(并且,是的,我已经重新启动了服务器)。
  • Linux 用户请使用sysctl net.ipv4.tcp_keepalive_time

标签: postgresql locking keep-alive


【解决方案1】:

我认为您需要配置操作系统。通过程序更改保活参数尚未得到广泛支持。这应该对您有所帮助:
Using TCP keepalive to Detect Network Errors

你的参数也选错了。如果tcp_keepalives_count=1 有效,那么即使一个丢失的保活数据包也会断开您的连接。单个数据包经常丢失。我会在 MacOSX/FreeBSD 上的 /etc/sysctl.conf 中使用以下内容:
net.inet.tcp.keepidle = 60000
net.inet.tcp.keepintvl = 10000
操作系统将在失去连接后最多 140 秒(60 秒的空闲 + 8 个以 10 秒为间隔的保活数据包)断开连接。

【讨论】:

    猜你喜欢
    • 2021-06-26
    • 1970-01-01
    • 2013-08-14
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 2010-09-19
    • 2011-07-20
    相关资源
    最近更新 更多