代码之家  ›  专栏  ›  技术社区  ›  Shaunak

节点:PASGRESPG承诺:仅在Azure WebApp容器中泄漏活动句柄

  •  2
  • Shaunak  · 技术社区  · 7 年前

    我有一个节点应用程序,它使用 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安装中都能完美地执行和扩展,所以很难调试为什么会发生这种情况。

    这是我希望你能帮助的想法,调试,监测或线索,为什么会发生这种情况。

    已执行调试:

    1. 这与套接字无关。通过把它们从等式中去掉来确认。
    2. 大多数PARGRESS设置是相同的。在azure上制作postgres要比以前强得多。
    3. 尝试没有ssl连接。
    4. 确认所有代码在相关查询需要时正确使用任务。
    5. 在非azure安装上正确收集活动句柄。
    6. 所有异常都得到正确处理,并消除了此类泄漏的可能性。
    7. 发生这种情况时,azure上没有可见的异常或错误。应用内和Postgres日志。
    8. 当PM2重新启动时,活动句柄将恢复正常。

    image

    环境

    • PG承诺版本: 8.4.0

    • 操作系统类型(linux/windows/mac):在linux、mac和windows上运行良好。但不开 azure node docker container .

    • node.js版本:8.10.0(azure上的9.4.0)

    1 回复  |  直到 7 年前
        1
  •  1
  •   vitaly-t    7 年前

    This was the issue ,它是从 node-postgres 驱动程序,这意味着如果使用最新版本的 pg-promise (8.4.4目前),应该不会再有这样的问题了。