【问题标题】:Heroku Postgres Connections on Rails 3Rails 3 上的 Heroku Postgres 连接
【发布时间】:2019-02-04 17:03:40
【问题描述】:

一直在阅读它,但不确定我是否完全理解在 Rails 中与 Postgres 的连接是如何工作的。我有多达 5 个网络测功机,每个运行 5 个进程(独角兽),所以最多可以有 25 个连接,然后通过 delay_job 最多可以有 50 个工作测功机,所以这将是 75。

但是当工作队列增长并且我正在运行所有 50 个工作人员测功机时,似乎我达到了 128 的 Postgres 连接限制,我想这不会很好。

web dynos 是否可以为每个进程打开多个连接?工人也可以这样做吗?

如果它与池数据库设置有关,对于 Unicorn 来说,是每个工作进程或每个 dyno 的连接池吗?这对我来说不是很清楚(根据 Corey 的 cmets),尽管它似乎是每个 Unicorn 工作进程。

有没有办法设置delayed_job worker dynos pool 设置?我猜这也是 5 的默认值。

任何好的资源或解决方案都会非常有帮助。似乎 PGbouncer 是一种选择,或者将池从默认的 5 设置为更低的值,例如 1 或 2。

编辑:我错误地将 NewRelic 日志读取为每个事务的毫秒数,但该类别的总毫秒数,因此不会减慢 Postgres 的速度,但达到连接限制仍然不理想。

【问题讨论】:

    标签: ruby-on-rails postgresql heroku


    【解决方案1】:

    尽管有 GIL,但 Rails 的单个实例可以使用线程处理多个传入请求,因此默认配置是打开到数据库的多个连接(每个线程一个)并使用连接池管理对它们的访问。默认情况下,Rails 配置为在此池中维护最多 5 个连接,但您可以根据需要调整大小。

    通常我会在答案中提供此信息,但有很多因素需要考虑,因此我将提供您应该查看的两个文档的链接:

    1. Concurrency and Database Connections in Ruby with ActiveRecord
    2. Deploying Rails Applications with Unicorn

    最后,我要给你一些来之不易的建议:放弃 Unicorn 和 DelayedJob,转而支持 Puma 和 Sidekiq。 Puma + Sidekiq 都是多线程的,并且在开发时考虑到了性能。 Puma 是 Rails 5 中的默认应用服务器,Heroku 也推荐它。 Sidekiq 是 Ruby 社区中事实上的后台作业处理库,并享有广泛的支持和商业支持。

    【讨论】:

    • 谢谢科里。我今天一直在审查这两个链接。所以如果我没有在任何地方设置游泳池,我应该假设它是 5,有没有办法检查?我仍然不完全确定数据库连接是如何工作的。似乎我可以将池设置设置为 1 或 2(如并发/数据库连接文章中所建议的那样),而且我不应该遇到这个限制,对吧?
    • 是的,如果database.yml 中没有任何内容并且您没有以其他方式设置配置,您可以放心地假设池中的最大连接数为 5。关于将池的最大大小设置为 1 或 2,这取决于您的 Unicorn 配置;如果您使用工作人员,则每个工作人员都需要连接,否则您最终会在请求等待连接时造成延迟。
    • 知道了。我检查了一下,它是 5,但将其更新为 2,然后看看情况如何。我在 Unicorn 配置文件中设置了它,所以我相信它只会影响每个 Unicorn 进程。每个工人仍然会得到一个连接,对吧?不确定我是否理解这一点。
    • @Lev 如果您有 5 个工作人员和最大大小为 2 的连接池,则每个进程将只有 2 个连接,导致您可以有 3 个请求在等待数据库连接的进程中。这是一个坏主意。说真的,使用 Puma 和 Sidekiq。它们旨在解决这些问题。
    • 不是每个工作进程的池吗?我误解了吗?我也看不到 Puma/Sidekiq 如何解决数据库连接问题。我知道它们可能具有更好的性能并使用更少的测功机,但它们仍会使用相同数量的数据库连接,不是吗?
    猜你喜欢
    • 2023-03-03
    • 2017-11-06
    • 2018-07-12
    • 1970-01-01
    • 2016-10-29
    • 2018-08-18
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    相关资源
    最近更新 更多