我在Heroku上运行一个rails应用程序。
我有一个dyno。我正在使用Hobby Basic数据库,每月9美元,连接限制为20。我的应用程序在Unicorn上运行。但是,当进行多个数据库调用时,它仍然非常慢。
这就是我在unicorn.rb文件中的内容:
# config/unicorn.rb
worker_processes 3
timeout 30
preload_app true
before_fork do |server, worker|
Signal.trap 'TERM' do
puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
Process.kill 'QUIT', Process.pid
end
defined?(ActiveRecord::Base) and
ActiveRecord::Base.connection.disconnect!
end
after_fork do |server, worker|
Signal.trap 'TERM' do
puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to sent QUIT'
end
defined?(ActiveRecord::Base) and
ActiveRecord::Base.establish_connection
end
本文讨论管理并发连接:https://devcenter.heroku.com/articles/concurrency-and-database-connections
但是,我仍然感到困惑。使用我当前的设置,如何同时允许多个数据库连接?在我的数据库允许的最大连接数(20)?我真的很感激,如果有人在Heroku上处理扩展rails应用程序,可能会指出我正确的方向。
答案 0 :(得分:1)
当您使用有限的业余爱好计划时,假设数据库可能成为瓶颈是公平的。您可以采取一些优化措施来帮助改善连接池(如下面的代码所示)。然而,当这确实是瓶颈时,你会发现经常发现超时,而不仅仅是缓慢。为了更好地了解问题所在,我建议您接下来添加NewRelic插件。
NewRelic Stark计划(推荐) - 或者Wayne计划(我认为有点太有限)是免费的,可以帮助您查看应用程序性能和跟踪错误。您可能会发现dyno排队时间和内存消耗导致您获得的速度变慢,并且有一些方法可以在不弄乱数据库连接的情况下提高。改善代码响应时间并限制数据库命中(通过缓存)是值得研究的好方法。
话虽如此,我建议您将以下代码添加到您的unicorn文件中,如您所提及的文章所述。
after_fork do |server, worker|
Signal.trap 'TERM' do
puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to sent QUIT'
end
# other settings
if defined?(ActiveRecord::Base)
config = ActiveRecord::Base.configurations[Rails.env] ||
Rails.application.config.database_configuration[Rails.env]
config['reaping_frequency'] = ENV['DB_REAP_FREQ'] || 10 # seconds
config['pool'] = ENV['DB_POOL'] || 2
ActiveRecord::Base.establish_connection(config)
end
end
答案 1 :(得分:0)
Heroku提供托管的Postgres数据库。 不同的分层数据库具有不同的连接限制。 Starter Tier“Dev”和“Basic”数据库限制为20个连接。
和on worker需要一个连接。 如果你有超过20的工人,你可以像pgbouncer一样使用连接池处理问题。 如果你使用pgbouncer,你可以在你的环境中使用事务池模式,这样服务器就可以在工作者之间重用。