【问题标题】:Debugging Postgres ETIMEDOUT调试 Postgres ETIMEDOUT
【发布时间】:2018-08-11 02:04:08
【问题描述】:

在过去的几天里,我开始在生产中看到来自 Postgres (with node-postgres) 的 read ETIMEDOUT 错误,我很难找到问题的根源。

我不确定问题是数据库无法处理连接,还是无法从池中获取连接,更不用说写入套接字了。

我根本无法在开发中重新创建错误(我也无法在生产中可靠地重新创建)。但是 Postgres 错误日志中没有显示任何内容。

这是池配置:

pool: { 
  max: 50, 
  min: 0, 
  idle: 20000, 
  acquire: 20000 
}

据我所知,上个月我们同时拥有的最大连接数是 8,因此池永远不会耗尽。

Postgres 是否有任何类型的可配置查询超时,可以对其进行调整以确保长时间运行的查询不会导致这些超时?虽然仅供参考,但有时这些情况会发生在微小的插入或单行读取中。

我相当确定ETIMEDOUT 是系统错误,而不是高级 JavaScript 驱动程序抛出的错误。底层套接字的超时在哪里定义?

【问题讨论】:

  • 可能是防火墙之类的网络问题。 PostgreSQL 日志中有对应的条目吗?
  • @LaurenzAlbe 我认为这不太可能是防火墙问题,因为 99.9% 的查询都不会失败。我们目前也没有设置 Postgres 来记录单个查询,所以很遗憾,我无法匹配它们。

标签: node.js postgresql node-postgres


【解决方案1】:

Postgres 是否有任何类型的可配置空闲超时,可以对其进行调整以确保长时间运行的查询不会导致这些?

空闲超时和查询超时是两个不同的东西。

空闲超时时间是关于连接在连接池中挂起多长时间后由于未使用而被关闭,通过连接对象的属性idleTimeoutMillis进行配置。

查询超时定义了查询在超时之前可以运行多长时间,这是您所需要的。并且是通过连接对象的属性statement_timeout来配置的。

【讨论】:

  • 感谢您的提醒。我已经更新了这个问题。看起来默认的 statement_timeout 设置为无限制,所以我不确定这是否是问题所在。
  • @DanPrince 那么也许你需要这个:stackoverflow.com/questions/31904365/…
猜你喜欢
  • 2014-11-14
  • 2021-07-27
  • 1970-01-01
  • 2023-01-09
  • 2010-10-08
  • 2014-08-29
  • 1970-01-01
  • 1970-01-01
  • 2017-01-24
相关资源
最近更新 更多