Heroku:为什么这么多数据库连接?

时间:2016-02-09 20:04:20

标签: ruby-on-rails database postgresql heroku puma

我正在使用rails项目充当iPhone应用程序的服务器和后端数据库。在我尝试进行负载测试时,我开始收到错误,说有太多的db:连接,当我用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

1 个答案:

答案 0 :(得分:2)

在寻找一段时间后尝试了几件事(减少heroku dynos / puma workers / threads,启用rails 'reaper'等),最终修复我的问题的是PgBouncer

不太确定是什么导致了潜在的问题,但看起来ActiveRecord / Postgres正在打开连接以供将来使用(预期的行为)。但是,当新进程开始运行并请求连接到数据库时,AR / PG将创建新连接,而不是重用旧的(意外行为)。我可能是错的,但这就是我的看法,PgBouncer似乎已经照顾到了这一点。希望这可以帮助其他人解决同样的问题。