【问题标题】:Active Record Could not obtain a database connection within 5.000 secondsActive Record 无法在 5.000 秒内获得数据库连接
【发布时间】:2020-05-25 19:54:01
【问题描述】:

从最近几周开始,我看到了这个错误“在 5.000 秒内无法获得数据库连接”。我尝试了以下解决方案。

根据 Sidekiq Docs,我已将并发数减少到 10,并将 MySql 数据库池大小增加到 12。但我仍然收到此错误,因此我将数据库池大小增加到 27。但问题仍然存在。来自thisthis 答案的尝试解决方案。我的 Sidekiq 服务器机器没有运行任何其他可以消耗 AR 连接的进程。我没有从外面纺任何线。以下是我的配置

Sidekiq version - 3.4.2
Rails version - 4.2.4
Active Record version - 4.2.4
Database pool size - 27
Sidekiq concurrency - 10

我们将不胜感激。

【问题讨论】:

  • 您是否达到了 mysql 的最大总连接数? SHOW VARIABLES LIKE "max_connections",默认为 151
  • @Vasfed 我没有达到最大总连接数。我有最多 10000 个可用连接。
  • 请提供GLOBAL STATUSVARIABLES。说明:mysql.rjweb.org/doc.php/mysql_analysis#tuning
  • 如果通过主机名连接,是否是某种形式的 DNS 故障(尝试通过 IP 连接)。
  • 不是 DNS 故障。据我研究和谷歌搜索,我确信这与 ActiveRecord 有关。不知何故,连接没有被检出回连接池。

标签: mysql ruby-on-rails activerecord sidekiq


【解决方案1】:

我怀疑这是服务器端的连接泄漏。

Sidekiq::Middleware::Server::ActiveRecord 是中间件,负责在作业完成后将连接返回到池中。这应该默认包含在内。

当您使用-v 标志启动服务器时,

bundle exec sidekiq -v -C config_file

它将打印所有将被调用的中间件。你能检查一下这个中间件是否存在于列表中吗?

【讨论】:

  • 是的,它存在,我还在此处提到的配置中设置连接池 - stackoverflow.com/a/41259300/4614833。我同意这可能是连接泄漏。我也尝试过监控线程数,如果某个地方有任何线程在连接上,但找不到太多。
猜你喜欢
  • 2015-03-04
  • 1970-01-01
  • 1970-01-01
  • 2016-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多