代码之家  ›  专栏  ›  技术社区  ›  Erowlin Peter

乘客使用的PostgreSQL连接比预期的多

  •  6
  • Erowlin Peter  · 技术社区  · 6 年前

    这个难题在生产中发生了很长时间,我们不知道它是从哪里来的。有时可以在本地主机上复制它,Heroku企业支持部门对此没有什么线索。

    • 乘客独立,线程禁用,最多25个进程。无最小设置。
    • 3个卷筒dynos

    SELECT * FROM pg_stat_activity GROUP BY client_addr 统计每个实例的连接数表明,在我们的高峰时段,一个乘客进程打开了多个PSQL连接。

    • 单个地址是关于单个Dyno的(由Heroku工作人员确认)
    • 乘客在同一时间不会产生超过25个进程(经确认) passenger-status 在那些高峰期)

    下面是屏幕截图 SELECT * FROM pg_stat_activity; :

    enter image description here 45 psql连接

    日志看起来并不奇怪,没有提到dyno崩溃/进程崩溃。

    以下是同一个dyno的乘客状态截图(不同的时间,只是为了证明为一个dyno创建的进程不超过25个): enter image description here

    最后,我们从Heroku支持部门得到了一个回应(顺便说一句,令人惊讶的支持)

    我也看到过以前的报道,乘客使用的连接比预期的要多,但不幸的是,由于复制困难,大多数都关闭了。

    在Passenger文档中,解释了Passenger自己处理ActiveRecord连接。

    任何线索都很感激。谢谢!

    各种信息:

    • Ruby版本: 2.4.x
    • Rails版本: 5.1.x
    • 5.3.x
    • PG版本: 10.x
    • ActiveRecord版本: 5.1.x条

    最后一件事

    更新1(01/10/2018):

    1 回复  |  直到 6 年前
        1
  •  0
  •   Erowlin Peter    6 年前

    修复

    /cable ,然后将Procfile更改为:

    web: bundle exec passenger start -p $PORT --max-pool-size $PASSENGER_MAX_POOL_SIZE
    

    web: bundle exec passenger start -p $PORT --max-pool-size $PASSENGER_MAX_POOL_SIZE --unlimited-concurrency-path /cable
    

    解释

    但套接字实际上不应该占用整个过程。一个进程可以处理许多打开的套接字连接(许多是在同一时间超过10万(一些大牌)。幸运的是,我们有更低的套接字连接,但仍然。

    更改后,我们基本上告诉乘客不要用一个完整的过程来处理一个套接字连接,而是用一个完整的过程来处理所有的套接字连接。

    文档

    一些指标,修复3周后

    • 乘客上的分叉进程数 显著减少(从75道工序减少到~15道工序)
    • 网络动态显著减少(与前一点分叉乘客过程相关)
    • PSQL连接的全局数 急剧下降,并已稳定了两天(即使在部署后)(从150到30个连接)
    • PSQL连接数 每dyno急剧减少(从~50每dyno到小于10每dyno)
    • Redis连接数 减少并稳定了两天(即使在部署之后)
    • PostgreSQL上的平均内存使用率 急剧下降,已经稳定了两天。