Sidekiq - 在 5.000 秒内无法获得数据库连接

24
我在使用Rails 4和Sidekiq开发环境的Mac电脑上遇到了以下警告。
10:13:39 worker.1 | 2014-09-22T07:13:39.857Z 86981 TID-oug0oog10 WARN: could not obtain a database connection within 5.000 seconds (waited 5.002 seconds)
10:13:39 worker.1 | 2014-09-22T07:13:39.857Z 86981 TID-oug0oog10 WARN: /Users/me/.rvm/gems/ruby-2.1.3/gems/activerecord-4.1.6/lib/active_record/connection_adapters/abstract/connection_pool.rb:190:in `block in wait_poll'

我看到其他回答中提到要减少给Sidekiq的并发数,以便为其他事情留出更多的资源,但是

worker: bundle exec sidekiq -c 10 

它仍然不起作用。

我正在使用Postgres.app。

在本地主机中,数字/并发应该是多少?


PostgreSQL服务器错误日志中是否有错误?如果有,是什么错误? - Craig Ringer
我只看到了worker/sidekiq的错误。我应该在哪里看到PG错误日志? - Nick Ginanto
它的确切位置取决于操作系统以及PostgreSQL的安装/配置方式。如果你卡住了,可以在安装文档中查找或搜索。 - Craig Ringer
Postgres.app 将日志存储在 /Users/YOUR_NAME/Library/Application Support/Postgres/var-9.4/postgres-server.log 文件中。 - yaru
@NickGinanto 有什么新消息吗?我遇到了同样的问题,想知道这个修复方法是否有效以及原因。 - nacho c
3个回答

40

我将数据库池设置为Sidekiq并发,现在它对我有用了。

bundle exec sidekiq -c 10

在我的 database.yml 文件中

development:
  adapter: postgresql
  ...
  host: localhost
  pool: 10

似乎解决了我一个月以来无法修复的问题,那些试错都没有用。madoxer,我由衷地感谢你。 - yaru
谢谢,它解决了我的问题。 - Prakash Laxkar
减少并发数据库可能会有所帮助。 - James Tan
@JamesTan 为什么减少并发数据库可能有帮助?我遇到了同样的问题,不确定为什么这样做会有帮助。显然,#池 > #线程。 - nacho c
@IgnacioChiazzo 我认为这是因为内存不足或者postgresql连接限制。 - James Tan

5

这个问题与数据库池的大小有关,应该设置为'sidekiq_concurrency' + 2。如果您将此设置放入sidekiq初始化器中,通常可以解决问题:

Sidekiq.configure_server do |config|
     config = ActiveRecord::Base.configurations[Rails.env] ||
         Rails.application.config.database_configuration[Rails.env]
     config['pool'] = Sidekiq.options[:concurrency] + 2
     ActiveRecord::Base.establish_connection(config)
     Rails.logger.debug("Connection Pool size for Sidekiq Server is now: #{ActiveRecord::Base.connection.pool.instance_variable_get('@size')}")
end

你能给我们更多的信息吗?为什么是数字2?我也遇到了同样的问题,不确定它为什么会解决问题。 - nacho c
这与此相关:https://github.com/mperham/sidekiq/blob/master/4.0-Upgrade.md - Jacopo Beschi
似乎有所帮助。谢谢! - ZeDalaye
2
“+2”与Redis连接有关,而不是数据库连接。现在甚至变成了“+5”,请参见https://github.com/mperham/sidekiq/wiki/Using-Redis#complete-control。 - tsauerwein

1

如果我们使用的是 Rails < 5.2 版本,数据库连接池的大小应该是并发数加一。这里是相应的 GitHub 问题链接:https://github.com/mperham/sidekiq/issues/4252

如果有 5 个线程,则在 Rails < 5.2 版本中,数据库连接池的大小应为 6。


谢谢!这是我们代码库中的一个问题,由于您的回答和问题,我能够重现并修复它。我还留了一个评论 - https://github.com/mperham/sidekiq/issues/4252#issuecomment-576583244 - 其中包含有关Rails 5.2中修复的信息。 - Sergey Alekseev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接