我刚刚在 Heroku 上升级了 Postgres 的数据库计划。在新计划中,我们有更多的联系,我正在努力确保我们大规模地充分利用它们。
假设我们为 Puma 服务器配置了 40 个线程:
puma -t 40:40
...我将池大小设置为 60(只是为了一点缓冲区)。我的理解是,因为我预先分配了 40 个 Puma 线程,所以每个线程都会保留一个连接,从而产生 40 个活动连接。但是,如果我检查活动连接,只有 5 个。
我完全误解了它是如何工作的吗?
我远非 Puma 专家,所以我只是分享我自己的知识。
首先,如果您将线程数设置为 40,那么您的 Puma Worker 将有 40 个线程。不过要小心,由于 GIL(或 GVL),您的 Puma 工作线程一次只能有一个线程执行 Ruby 任务。剩下的 39 个线程只是闲置着。除非他们正在执行 I/O(访问数据库等)。
基本上常识是,在 5 个线程之后,增加线程数量就不再有任何好处。如果您的应用程序确实是面向 I/O 的,也许可以将其推至 10,但我不会更进一步..
真正的并发度由 Puma 工作线程的数量决定(如果以集群模式启动 Puma)。如果您将 Puma 工作人员的数量设置为 40,那么您的应用程序一次至少可以处理 40 个用户。
但是 40 个工作人员需要一个巨大的 Heroku Dyno,以及相当多的 RAM。此外,如果您为每个 Puma Worker 添加 5 个线程,那么您需要 200 个数据库连接!
实时数据库连接怎么样
由于上述原因,很难让一个具有 40 个线程的工作线程同时访问数据库。这可能就是为什么您的实时数据库连接只有 5 个(除非您在更改后没有重新部署应用程序)。 我有一个小应用程序,并且还看到不同时间的不同数量的实时数据库连接。
缓冲区
切勿进行缓冲。您只是阻止了您的应用程序无法访问的连接。线程池应该等于最大线程数。
我的问题:为什么有这么多数据库连接?
您增加数据库连接的目标是什么?更多并发?如果您有一个小型应用程序,带有一个小型网络测功机,那么后面有一个大型数据库计划是没有意义的。
如果您想扩展您的应用程序。获得更大的网络测功机。添加更多 Puma 工作线程,同时将线程数保持为 5。
当worker数量乘以线程数超过允许的数据库连接数时,就需要升级数据库了。
Nota Bene:Rails 可能会在其内部使用一些连接。因此,如果您有一个具有 20 个连接的数据库,一个具有 3 个工作进程和 5 个线程的 Puma 配置。最好在添加第四个工人之前升级。
我们有一个应用程序在 2 或 6 个 ec2 c5x.large AWS 实例中运行。 我们的配置是: 4 个工作线程 5 个线程
通常我们使用两个实例,但在特定时间我们会向用户发送推送通知,最终导致许多用户同时进入,从而产生这种情况。
我们有 8 个实例,有 4 个工作线程和 5 个线程,但数据库连接数约为 40 个。但在 1 分钟内,我们从 50-60 个连接增加到 120 个连接。产生数据库 CPU 使用率峰值并以较差的响应时间结束。
所以我们正在努力防止这个问题。我们假设当数据库 CPU 忙于生成新连接时,我们的查询处于等待状态,从而在响应时间上产生问题。
一旦创建连接并且数量请求不太大,响应时间就会恢复到正常结果。
对此有什么建议吗?
谢谢