【问题标题】:Rails, Puma, Sidekiq how to calculate total DB connections?Rails、Puma、Sidekiq 如何计算总数据库连接数?
【发布时间】:2020-02-14 00:19:23
【问题描述】:

我一天收到一次或两次ActiveRecord::ConnectionTimeoutError。有人可以帮我计算我的应用程序与我的数据库建立了多少连接吗?以及优化我的连接的建议?

这是我的配置

AWS

Database : Mysql   
Version  : 5.7.23   
Provider : AWS RDS (db.m5.large, vCPU: 2, RAM: 8GB)

3台服务器配置如下

# database.yml
  pool: 20

# puma.rb 
  RAILS_MAX_THREADS : 5
  WEB_CONCURRENCY   : 2

1 台 sidekiq 服务器,配置如下

# sidekiq 
  concurrency:  25

我试图获得我的数据库能够处理的最大连接数

# MySQL Max connections ("show global variables like 'max_connections';")
  624

【问题讨论】:

    标签: ruby-on-rails database amazon-web-services ruby-on-rails-5 puma


    【解决方案1】:

    与数据库的连接总数等于每台服务器的连接数乘以服务器数。

    数据库连接总数 = 每台服务器的连接数 * 服务器计数。

    每台服务器的连接数 = AR 数据库池大小 * 每台服务器的进程数(通常使用 WEB_CONCURRENCY 或 SIDEKIQ_COUNT 设置)

    所以对于您拥有的网络服务器:

    AR 数据库池大小 = 20

    每台服务器的进程数 = 2

    服务器计数 = 3

    数据库连接总数(Web 服务器)= 20 * 2 * 3 = 120

    sidekiq 服务器:

    AR 数据库池大小 = 20

    每台服务器的进程数 = 1

    服务器计数 = 1

    数据库连接总数(Sidekiq 服务器)= 20 * 1 * 1 = 20

    因此,预期的数据库连接总数应为140,远低于 RDS 实例的限制。

    我的猜测是您获得了ActiveRecord::ConnectionTimeoutError,因为您的 Sidekiq 并发设置高于 AR 连接池值。所有 Sidekiq 线程都需要一个 ActiveRecord 数据库连接,因此将 AR 池大小设置为 小于 比 Sidekiq 的并发性意味着一些 Sidekiq 线程将被阻塞,等待一个空闲的数据库连接。在您的情况下,在某个时间点,您可能有 25 个线程试图通过最多可以使用 20 个连接的数据库池访问数据库,如果一个线程在 5 秒内无法获得免费的数据库连接,您将获得一个连接超时错误。

    在 Sidekiq 中,数据库连接总数应该是

    最小(需要数据库连接的线程,AR 数据库池大小)* 每个服务器的进程(WEB_CONCURRENCY 或 SIDEKIQ_COUNT)* 服务器计数。

    另外,Sidekiq documentation 声明

    从 Rails 5 开始,RAILS_MAX_THREADS 可用于配置 Rails 和 Sidekiq 并发。请注意,ActiveRecord 有一个连接池,需要在 config/database.yml 中正确配置它才能很好地处理高并发。设置pool等于线程数pool: <%= ENV['RAILS_MAX_THREADS'] || 10 %>

    这个答案的大部分是基于来自Nate BerkopecSidekiq in Practice电子邮件系列

    【讨论】:

    • RAILS_MAX_THREADS : 5 会做什么?
    • RAILS_MAX_THREADS 定义在 Rails 进程中运行的线程数量
    • @Aparichith你能解决这个问题吗?我也面临同样的问题。
    猜你喜欢
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 2022-12-05
    相关资源
    最近更新 更多