【发布时间】:2016-05-19 23:24:43
【问题描述】:
我正在开发一个 Rails 项目,作为 iPhone 应用程序的服务器和后端数据库。在我尝试进行负载测试时,我开始收到错误消息,说 db:connections 太多,当我使用 pg:info 检查时,我发现这是真的(Connections: 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
【问题讨论】:
-
你能分享你的
puma.rb文件吗?您的 Heroku 配置是否为DB_POOL设置了单独的值?您是否有任何工作进程,即 Sidekiq 或 Rescue,正在运行?检查heroku ps,看看您是否有任何您不希望闲逛的测功机。 -
@RobertNubel 在上面发布了 puma.rb 文件。 ENV["DB_POOL"] 似乎没有在 heroku 中定义,并且除了调度程序之外没有工作进程。刚刚将 reaper 添加到我的 database.yml 中,但它看起来并没有做任何事情
-
谢谢。这一切听起来都不错。让我们看看我们是否可以隔离问题。如果您缩小到只有一个测功机并重新启动所有设备,您的数据库上打开了多少个连接?
-
下降到一个 1x-dyno 连接后减少到 3/120。我应该提一下,当我看到最高的数据库连接时,我正在以相对较重的负载(每分钟 30 次点击/秒)进行测试,但即使在测试完成后,如果不重新启动服务器,连接数也不会减少。
-
如果你用一些负载测试来打那个测功机,连接会增加吗?
标签: ruby-on-rails database postgresql heroku puma