节点,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 安装中都能完美执行和缩放,因此很难调试为什么会发生这种情况。
在这里,我希望您能提供想法、调试、监控或提供有关为什么会发生这种情况的线索。
调试已经执行:
- 这与套接字无关。通过将它们排除在等式之外来确认。
- 大多数 postgres 设置都是相同的。 Azure 上的生产 postgres 更加强大。
- 在没有 SSL 连接的情况下尝试过。
- 已确认所有代码在相关查询需要的地方正确使用任务。
- 在非 Azure 安装上正确收集活动句柄。
- 所有异常都得到正确处理并消除了此类泄漏的可能性。
- 发生这种情况时,azure 上没有可见的异常或错误。在应用程序和 postgres 日志中。
- 重启 pm2 后活动句柄恢复正常。
环境
pg-promise 版本:8.4.0
OS 类型 (Linux/Windows/Mac):适用于 Linux、mac 和 windows。但不在 azure node docker container.
Node.js 版本:8.10.0(Azure 上为 9.4.0)
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),应该不会再出现这个问题了。
我有一个使用 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 安装中都能完美执行和缩放,因此很难调试为什么会发生这种情况。
在这里,我希望您能提供想法、调试、监控或提供有关为什么会发生这种情况的线索。
调试已经执行:
- 这与套接字无关。通过将它们排除在等式之外来确认。
- 大多数 postgres 设置都是相同的。 Azure 上的生产 postgres 更加强大。
- 在没有 SSL 连接的情况下尝试过。
- 已确认所有代码在相关查询需要的地方正确使用任务。
- 在非 Azure 安装上正确收集活动句柄。
- 所有异常都得到正确处理并消除了此类泄漏的可能性。
- 发生这种情况时,azure 上没有可见的异常或错误。在应用程序和 postgres 日志中。
- 重启 pm2 后活动句柄恢复正常。
环境
pg-promise 版本:
8.4.0
OS 类型 (Linux/Windows/Mac):适用于 Linux、mac 和 windows。但不在 azure node docker container.
Node.js 版本:8.10.0(Azure 上为 9.4.0)
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),应该不会再出现这个问题了。