在我们的生产数据库中,我们目前拥有以下设置:
- Passenger Standalone,线程禁用,最多限制为25个进程。没有最小设置。 - 3个Web Dynos
使用
SELECT * FROM pg_stat_activity GROUP BY client_addr
并计算每个实例的连接数,显示在我们的高峰期间,一个Passenger进程打开了超过1个PSQL连接。假设:
- 单个地址大约是单个Dyno(由Heroku工作人员确认) - Passenger在同时不会生成超过25个进程(在这些高峰期间通过
passenger-status
确认)这是一个
SELECT * FROM pg_stat_activity;
的截屏。
从截图中我们可以看到,有45个psql连接来自运行passenger的同一个dyno。如果按照以前的逻辑,每个Passenger进程不应该超过1个连接,所以应该是25个。
日志看起来并不异常,没有提到任何dyno崩溃/进程崩溃的情况。
以下是我们为同一dyno获取的passenger状态的屏幕截图(不同的时间,只是为了证明一个dyno不会创建超过25个进程):
最后,我们从Heroku支持团队得到的一个响应(非常好的支持团队):
我之前也见过关于Passenger使用比预期更多连接的报告,但大多数都因难以复制而关闭了。
在Passenger文档中,解释了Passenger如何处理ActiveRecord连接。
非常感谢任何线索!
各种信息:
- Ruby版本:
2.4.x
- Rails版本:
5.1.x
- Passenger版本:
5.3.x
- PG版本:
10.x
- ActiveRecord版本:
5.1.x
如果您需要更多信息,请在评论中让我知道,我会很乐意更新此帖子。
最后一件事:我们使用ActionCable。我在某个地方读到过,Passenger处理奇怪的套接字连接(打开一个有点隐蔽的进程以保持连接)。这是我们的其中之一线索,但到目前为止,在本地主机上无法复制它。如果有人可以确认Passenger如何处理ActionCable连接,将不胜感激。
更新1(01/10/2018):
实验:
- 按照此处所述,禁用NewRelic自动解释功能: https://devcenter.heroku.com/articles/forked-pg-connections#disabling-new-relic-explain
- 在本地运行Passenger服务器,并将最小和最大池大小设置为3(更多会使我的计算机过热),然后使用各种信号(SIGKILL、SIGTERM)杀死进程,以尝试查看连接是否正确关闭。它们是的。