psycopg2.DatabaseError: SSL SYSCALL错误:连接超时

14
我们正在开发一个需要访问数据库的网站。访问单个页面没有问题,连续访问也没有问题。然而,如果等待了很长时间(似乎15分钟就足够了),访问另一个页面会卡顿很长时间(观察到10-20分钟)。之后,将打印出这个错误:this error
以下是相关代码:
if __name__ == "__main__":
conf = load_conf(sys.argv[1])

engine = create_engine('postgresql://%s:%s@%s:%s/%s' %
                       (conf['db']['user'], conf['db']['pw'], conf['db']['address'],
                        conf['db']['port'], conf['db']['database']), echo=False)

Session = sessionmaker(bind=engine)
session = Session()

app = make_app(session, conf)
app.listen(8888)
tornado.ioloop.IOLoop.current().start()

数据库位于不同的服务器上。我的个人机器在荷兰,而数据库位于德国的一台服务器上。我的合作伙伴的个人机器在意大利。

值得注意的是,这个问题仅存在于我运行Arch Linux的机器上。我们已经在另外两台机器上测试过,运行Windows和其他Linux(如果需要可以确认是否为Ubuntu)。目前为止,我们不知道如何继续调试。

当然,我会根据要求提供任何额外所需的信息。


连接超时。捕获异常并创建新会话,然后重试。 - Klaus D.
1
我们可以这样做,但正如我所说,即使异常被引发,也需要10-20分钟的时间,因此这并不能解决问题。 - Kahr Kunne
1
看起来好像有东西会在一段时间后中断你的连接。检查防火墙! - Laurenz Albe
我个人的电脑上没有使用任何防火墙。 - Kahr Kunne
2
经典原因是 NAT。它不一定在您的计算机上-它可以在您和服务器之间的任何地方。通常,VPN、网关或其他隧道技术使用NAT。近年来由于IPv4 IP耗尽,ISP已开始使用运营商级NAT。检查您的互联网连接-如果与服务器没有直接的层2路由连接,则可能是NAT的问题。 - univerio
15分钟的延迟可能来自TCP指数退避机制,当tcp_retries2内核参数设置为15时。您可以使用netstat检查TCP连接是否处于活动状态,并使用cat /proc/sys/net/ipv4/tcp_retries2命令检查tcp_retiries2参数。 - Sergei Nikiforov
1个回答

13

尚不清楚这个15分钟的超时限制来自何处,但其他评论者已经表明它很可能来自你的电脑和服务器之间的网络中的某些东西。无论它来自哪里,在SQLAlchemy中有几个选项可以解决它。

  • pool_pre_ping=True 选项会在重复使用连接之前发出一个简单的测试查询,使其能够检测到此问题并进行透明重新连接(以小幅度的性能成本为代价)
  • pool_recycle=600 选项告诉SQLAlchemy不要重复使用闲置时间超过10分钟的连接。这是更有效的解决方案,因为它不会增加任何新的查询,但它需要你计算出最佳的回收超时时间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接