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

时间:2018-06-21 01:31:13

标签: node.js postgresql azure azure-web-app-service pg-promise

我有一个节点应用程序,该应用程序使用pg-promise lib与Postgres对话。完全根据规定的最佳做法并使用pg-promise-demo进行设置。

应用程序的某些背景: 使用postgis数据库对各种表和返回分析进行约40个并行查询。每个并行查询(任务)都是通过API和套接字事件返回的。基本上将多边形作为关注区域,并在处理每个数据后返回40个事件。我们使用pm2运行节点进程并对其进行监视。

好消息,此方法在本地计算机或VM安装上非常漂亮且超级快速。将问题部署到Azure节点Web应用程序容器时,问题开始。

预期行为

每个请求(感兴趣的区域)都会启动41个活动句柄(如下面的屏幕截图所示),对应于该池从postgres签出的连接。现在,在所有测试中,除了天蓝色,活动手柄一次增加41个,并根据负载增加更多。

处理数据后,postgres最终(约30秒)断开了连接(由pg_stat_activity验证)。最终,节点进程中的活动句柄下降。

实际行为

仅在Azure Web应用程序上,它们在节点应用程序中的这些活动句柄永不下降!会随着时间的推移不断攀升,最终导致应用程序崩溃。我已经确认postgres正确地删除了连接。只是该节点无法恢复这些句柄。因为代码在所有非Azure安装中都能完美地执行和扩展,所以很难调试为什么会发生这种情况。

我希望在这里可以为您提供想法,调试,监视或提示可能发生这种情况的线索。

已执行调试:

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

image

环境

  • pg-promise版本:8.4.0

  • 操作系统类型(Linux / Windows / Mac):在Linux,mac和Windows上正常运行。但不在azure node docker container上。

  • Node.js版本:8.10.0(在Azure上为9.4.0)

1 个答案:

答案 0 :(得分:1)

This was the issue,此版本自node-postgres驱动程序的7.4.2版本开始已得到修复,这意味着如果您使用的是pg-promise的最新版本(目前为8.4.4),应该不再是这样的问题了。