首页 > 解决方案 > 很难根据允许的最大连接数正确设置 RAILS_MAX_THREADS

问题描述

我很难理解我必须做的数学运算,才能RAILS_MAX_THREADS根据我的基础设施找出正确的数量。

我正在使用多个容器来托管我的一份接受 HTTP 请求的 API 副本和一份运行 sidekiq(作业处理)的 API 副本。我正在使用的数据库的 max_connections 为 45。话虽如此,应该是多少RAILS_MAX_THREADS?我将 9 用于RAILS_MAX_THREADSAND WEB_CONCURRENCY。我读了几篇关于它的文章,但我无法完全理解它。

标签: mysqlruby-on-railsconnection-poolingpuma

解决方案


即使您没有使用 Heroku,Heroku 关于 puma 大小的文档也是最好的。

https://devcenter.heroku.com/articles/deploying-rails-applications-with-the-puma-web-server

在他们说“dyno”的地方,您可以只阅读“host”、“virtual machine”或“container”来进行非 Heroku 部署。

如果您使用 9 for RAILS_MAX_THREADS and WEB_CONCURRENCY,并且您的 heroku 配置设置为以正常方式使用这些设置 - 那么每个主机将有 9 个 puma 工作人员运行(WEB_CONCURRENCY),每个工作人员将运行 9 个线程(RAILS_MAX_THREADS),总共9*9=81 个线程。

您确实需要为每个线程提供足够的数据库连接,因此您的 45 个数据库连接已经增加了近 2 倍。这只是在一个容器上——如果你正在运行多个容器,每个容器都有这些设置,而不是用 81 乘以容器的数量——所以这对于你的数据库连接来说太多了!

因此,如果您无法更改最大数据库连接数,这是一个硬限制,您需要减少数量。

否则,主要限制因素是每个容器中有多少可用 RAM,以及多少个 vCPU。理想情况下,您在容器 ( ) 上运行的工作人员至少与WEB_CONCURRENCY您拥有的 vCPU 一样多——如果您有足够的 RAM 来执行此操作。工人占用大量内存。通常没有理由运行比 vCPU 更多的工作程序,因此 9 是否有意义或大于所需取决于您的基础架构。

RAILS_MAX_THREADS每个工作线程有多少线程(

所以我会尝试RAILS_MAX_THREADS3-5。然后尽可能多的 WEB_CONCURRENCY 而不用完 RAM(要查看应用程序在负载下运行一段时间后将占用多少 RAM,您可能需要让它在负载下运行一段时间)。只要容器 * RAILS_MAX_THREADS * WEB_CONCURRENCY 小于您的数据库最大连接数 - 如果不是,请减少您的值,或者增加您的数据库最大连接数。


推荐阅读