我有一个节点应用程序,它使用
pg-promise
Lib与Postgres交谈。它完全按照指定的最佳实践设置,并使用
pg-promise-demo
.
应用程序的一些背景:
使用postgis数据库对各种表和返回分析进行大约40次并行查询。每个并行查询(任务)都通过api和socket事件返回。基本上以多边形作为感兴趣区域,并在处理每个数据之后返回40个事件。我们使用PM2来运行节点进程并监控它们。
好消息,它在本地机器或VM设备上运行得非常好和超快。当这个问题部署到Azure节点Web应用程序容器时,问题就开始了。
预期行为
每个请求(感兴趣的区域)启动41个活动句柄(如下面的屏幕截图所示),对应于池从postgres签出的连接。现在在所有测试中,除了在azure上,
活动手柄
一次上升41,根据需要增加更多。
当处理数据时,postgres最终(大约30秒)断开连接(通过
pg_stat_activity
)。最终
活动手柄
按预期方式删除节点进程。
实际行为
仅在azure webapp上
节点应用程序中的这些活动句柄
永不放弃!
随着时间的推移,它们不断爬升,最终应用程序崩溃。我已经确认Postgres正确地断开了连接。只是那个节点无法恢复这些句柄。因为代码在所有非azure安装中都能完美地执行和扩展,所以很难调试为什么会发生这种情况。
这是我希望你能帮助的想法,调试,监测或线索,为什么会发生这种情况。
已执行调试:
-
这与套接字无关。通过把它们从等式中去掉来确认。
-
大多数PARGRESS设置是相同的。在azure上制作postgres要比以前强得多。
-
尝试没有ssl连接。
-
确认所有代码在相关查询需要时正确使用任务。
-
在非azure安装上正确收集活动句柄。
-
所有异常都得到正确处理,并消除了此类泄漏的可能性。
-
发生这种情况时,azure上没有可见的异常或错误。应用内和Postgres日志。
-
当PM2重新启动时,活动句柄将恢复正常。
环境