开始阅读它,但不确定我是否完全理解与Postgres的连接在Rails中如何工作。我最多有5个Web dynos,每个Web dynos运行5个进程(独角兽),因此最多可以有25个连接,然后通过delay_job最多可以有50个工人dynos,所以应该是75。
但是,当工作队列增加并且我正在运行所有50个工作dynos时,似乎我达到了Postgres连接限制128,并且我想那不可能很好。
Web dynos是否可以在每个进程中打开多个连接?工人可以照做吗?
如果与池数据库设置有关,那么对于Unicorn,是每个工作进程或每个dyno连接池?这似乎对我来说还不清楚(根据对Corey的评论),尽管似乎对每个Unicorn worker进程来说都是如此。
有没有一种方法可以设置delay_job worker dynos池设置?我猜这也是默认值5。
任何好的资源或解决方案将非常有帮助。似乎PGbouncer是一个选项,或者将池从默认的5设置为较低的值,例如1或2。
编辑:我错误地将NewRelic日志读取为每个事务的毫秒数,但是该类别的总毫秒数,因此它不会减慢Postgres的速度,但是达到连接限制仍然不理想。 < / p>
答案 0 :(得分:0)
尽管有GIL,单个Rails实例仍可以使用线程处理多个传入请求,因此默认配置是打开与数据库的多个连接(每个线程一个),并使用连接池管理对它们的访问。默认情况下,Rails配置为在该池中最多维护5个连接,但是您可以根据需要调整大小。
通常我会在答案中提供此信息,但是要考虑很多因素,因此,我将提供指向您应查看的两个文档的链接:
最后,我将为您提供一些来之不易的建议:沟纹独角兽和DelayedJob赞成Puma和Sidekiq 。 Puma + Sidekiq都是多线程的,并且在开发时会考虑性能。 Puma是Rails 5中的默认应用程序服务器,Heroku也建议使用它。 Sidekiq是Ruby社区中事实上的后台作业处理库,并得到了广泛的支持和商业支持。