我有一个自定义的Ruby on rails安装,并使用puma作为web服务器(由Nginx -socket支持)
我要连接的数据库是rds媒体(所以限制296个连接)。我的puma设置是线程1:32和4个工作线程。具有128个连接池。
我有一个高负载300个请求/秒,假设每1000个请求,进行一个更长的计算,大约需要3秒(获取所有事件,进行一些计算并更新它们)。
我得到了错误
ActiveRecord::ConnectionTimeoutError: could not obtain a database connection within 5.000 seconds (waited 5.016 seconds)
但是,如果我查看rds数据库,则只打开了43个连接。我的内存是7000MB中的2000MB(双核处理器是100%),我想知道为什么我得到一个连接超时,即使我所有的连接都没有打开(当然,puma配置是正确的)?
感谢您的帮助!
编辑:
在我的puma.rb中,我有:
on_worker_boot do
ActiveRecord::Base.connection_pool.disconnect!
ActiveSupport.on_load(:active_record) do
config = Rails.application.config.database_configuration[Rails.env]
config['reaping_frequency'] = ENV['DB_REAP_FREQ'] || 10 # seconds
config['pool'] = ENV['DB_POOL'] || 128
ActiveRecord::Base.establish_connection
end
end
发布于 2015-02-12 18:51:56
正如这里在rails configuration guide about database pooling中提到的,当所有数据库连接耗尽时,ActiveRecord将等待一个空闲,我假设您增加的数量是http连接限制,而不是数据库连接限制。
您可以编辑database.yml
并将连接限制增加到296
,这是rds实例的限制
production:
adapter: mysql2
database: /path/to/sock
pool: 296
# username, password, etc
https://stackoverflow.com/questions/28485245
复制相似问题