节点,postgres pg-promise:仅在 azure webapp 容器中泄漏活动句柄

Node, postgres pg-promise: Leaking active handles ONLY in azure webapp container

我有一个使用 pg-promise lib to talk to postgres. It is setup exactly according to best practices prescribed , and using the pg-promise-demo 的节点应用程序。

申请背景: 使用 postgis 数据库对各种 table 和 return 分析进行大约 40 个并行查询。每个并行查询(任务)都是 returned over API 和套接字事件。基本上将一个多边形作为感兴趣的区域,并在处理每个事件的数据后 returns 40 个事件。我们使用 pm2 来 运行 节点进程并监控它们。

好消息,这在本地 machines 或 VM 安装上运行得非常好而且速度超快。当将其部署到 Azure 节点 Web 应用程序容器时,问题就开始了。

预期行为

每个请求(感兴趣的区域)启动 41 个活动句柄(如下面的屏幕截图所示),对应于池从 postgres 签出的连接。现在在所有测试中,除了 azure,active handles 一次上升 41,根据负载需要更多。

处理数据后,postgres 最终(大约 30 秒)断开连接(由 pg_stat_activity 验证)。最终 active handles 节点进程按预期下降。

实际行为

仅在 azure webapp 上 节点应用程序中的这些活动句柄 永不掉落! 随着时间的推移它们不断攀升,最终应用程序崩溃.我已经确认 postgres 正确地断开了连接。只是那个节点不恢复这些句柄。由于代码在所有非 Azure 安装中都能完美执行和缩放,因此很难调试为什么会发生这种情况。

在这里,我希望您能提供想法、调试、监控或提供有关为什么会发生这种情况的线索。

调试已经执行:

  1. 这与套接字无关。通过将它们排除在等式之外来确认。
  2. 大多数 postgres 设置都是相同的。 Azure 上的生产 postgres 更加强大。
  3. 在没有 SSL 连接的情况下尝试过。
  4. 已确认所有代码在相关查询需要的地方正确使用任务。
  5. 在非 Azure 安装上正确收集活动句柄。
  6. 所有异常都得到正确处理并消除了此类泄漏的可能性。
  7. 发生这种情况时,azure 上没有可见的异常或错误。在应用程序和 postgres 日志中。
  8. 重启 pm2 后活动句柄恢复正常。

环境

This was the issue, which was fixed since version 7.4.2 of the node-postgres driver, which means if you use the latest version of pg-promise(目前是8.4.4),应该不会再出现这个问题了。