Heroku:为什么有这么多数据库连接?
Heroku: Why so many database connections?
我正在开发一个 rails 项目,作为 iPhone 应用程序的服务器和后端数据库。在我尝试进行负载测试时,我开始收到错误消息,说 db:connections 太多了,当我检查 pg:info 时,我发现这是真的(连接数:160/120)。
这在测试期间对我来说有些意义,但在测试结束后它仍然显示许多打开的连接,这让我很困惑。我的问题
1) 为什么这些数据库连接在进程完成后仍保持打开状态 运行?
2) 是不是我的配置中有什么东西导致了这个?
rails: 4.2.4
Postgres: 9.4.4
Heroku dynos: five 1x-dynos
Web Server: Puma
Puma Workers: 2
Puma Threads: 9
Database Pool: ENV["DB_POOL"] || ENV['MAX_THREADS'] || 6 (so probably also 9 as MAX_THREADS is set to that)
3) 有什么方法可以将连接设置为在进程完成后关闭 运行?
这是我第一次尝试设计可扩展的东西,如果这太基础了,我很抱歉,如果有什么我忘了包括的,请告诉我。
puma.rb
workers Integer(ENV['WEB_CONCURRENCY'] || 2)
threads_count = Integer(ENV['MAX_THREADS'] || 6)
threads threads_count, threads_count
preload_app!
rackup DefaultRackup
port ENV['PORT'] || 3000
environment ENV['RACK_ENV'] || 'development
on_worker_boot do
# Worker specific setup for Rails 4.1+
# See: https://devcenter.heroku.com/articles/deploying-rail-applications-with-the-puma-web-server#on-worker-boot
ActiveRecord::Base.establish_connection
end
在寻找了一段时间并尝试了几件事之后(减少 heroku dynos/puma workers/threads,启用 rails 'reaper', etc.), what ended up fixing my issue was PgBouncer。
不太确定是什么导致了根本问题,但看起来 ActiveRecord/Postgres 正在让连接保持打开状态以供将来使用(预期行为)。然而,当一个新进程开始 运行 并请求连接到数据库时,AR/PG 将创建一个新连接而不是重用旧连接(意外行为)。我可能是错的,但在我看来就是这样,PgBouncer 似乎已经解决了这个问题。希望这对遇到同样问题的其他人有所帮助。
我正在开发一个 rails 项目,作为 iPhone 应用程序的服务器和后端数据库。在我尝试进行负载测试时,我开始收到错误消息,说 db:connections 太多了,当我检查 pg:info 时,我发现这是真的(连接数:160/120)。
这在测试期间对我来说有些意义,但在测试结束后它仍然显示许多打开的连接,这让我很困惑。我的问题
1) 为什么这些数据库连接在进程完成后仍保持打开状态 运行?
2) 是不是我的配置中有什么东西导致了这个?
rails: 4.2.4
Postgres: 9.4.4
Heroku dynos: five 1x-dynos
Web Server: Puma
Puma Workers: 2
Puma Threads: 9
Database Pool: ENV["DB_POOL"] || ENV['MAX_THREADS'] || 6 (so probably also 9 as MAX_THREADS is set to that)
3) 有什么方法可以将连接设置为在进程完成后关闭 运行?
这是我第一次尝试设计可扩展的东西,如果这太基础了,我很抱歉,如果有什么我忘了包括的,请告诉我。
puma.rb
workers Integer(ENV['WEB_CONCURRENCY'] || 2)
threads_count = Integer(ENV['MAX_THREADS'] || 6)
threads threads_count, threads_count
preload_app!
rackup DefaultRackup
port ENV['PORT'] || 3000
environment ENV['RACK_ENV'] || 'development
on_worker_boot do
# Worker specific setup for Rails 4.1+
# See: https://devcenter.heroku.com/articles/deploying-rail-applications-with-the-puma-web-server#on-worker-boot
ActiveRecord::Base.establish_connection
end
在寻找了一段时间并尝试了几件事之后(减少 heroku dynos/puma workers/threads,启用 rails 'reaper', etc.), what ended up fixing my issue was PgBouncer。
不太确定是什么导致了根本问题,但看起来 ActiveRecord/Postgres 正在让连接保持打开状态以供将来使用(预期行为)。然而,当一个新进程开始 运行 并请求连接到数据库时,AR/PG 将创建一个新连接而不是重用旧连接(意外行为)。我可能是错的,但在我看来就是这样,PgBouncer 似乎已经解决了这个问题。希望这对遇到同样问题的其他人有所帮助。