【问题标题】:How do Puma threads interact with Postgres connection pools?Puma 线程如何与 Postgres 连接池交互?
【发布时间】:2018-03-11 17:57:55
【问题描述】:

我有一个在 OSE 上运行的 Rails 应用,5 个 pod,每个 pod 1 个容器。 Rails 应用程序使用具有默认线程设置的 Puma Web 服务器(最小值:0,最大值:16)。在我的 database.yml 中,我定义了 10 个连接 pool:

我想知道我的最大 PG 连接占用空间是多少?

我目前的理论是:

5 pods x 1 container x 16 threads x 10 connection pool = 800 possible PostgreSQL connections

但是,我质疑 16 个 Puma 线程中的每一个是否都共享同一个 PG 连接池?在这种情况下,公式为:

5 pods x 1 container x 10 connection pool = 50 possible PostgreSQL connections

(当然,如果这个数学是正确的,拥有 Puma 16 线程将是一个问题,因为我的应用程序可能请求比可以提供的连接数多,每个线程 1 个,比池提供的多 6 个.)

任何人都可以指出有关该主题的权威文档吗?谢谢!

【问题讨论】:

    标签: ruby-on-rails multithreading postgresql openshift puma


    【解决方案1】:

    如果连接池在进程内,并跨线程分配数据库连接,如果所有数据库连接都忙,则线程等待,那么第二个是正确的。如果没有,第一个。不管怎样,它实际上可能会更糟。如果您使用滚动部署,则在重新启动时可能会有一个额外的 pod 处于活动状态。

    看看在 PostgreSQL 数据库实例前使用 pgbouncer (https://pgbouncer.github.io/)。我的理解是,它提供了额外的灵活性,能够管理数据库连接池,而无需在应用程序中执行任何操作,而是在 pgbouncer 中处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-05
      • 2017-10-31
      • 1970-01-01
      • 1970-01-01
      • 2017-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多