2014-04-08 61 views
3

我在Heroku上運行Rails應用程序。併發數據庫連接Heroku Unicorn rails應用程序

我有一個測功機。我使用的是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

在我看來,你需要每個數據庫連接一個「獨角獸」工人。每個工作人員都有一個連接。當然,我從來沒有使用過獨角獸,這就是它使用fork的樣子。 –

回答

1

當你使用有限的愛好計劃時,假定數據庫可能是瓶頸,這是公平的。不管(如下面的代碼),你可以做一些優化來幫助改進連接池。然而,當這確實是瓶頸時,你會期望經常發現超時,而不僅僅是緩慢。爲了更好地瞭解問題所在,我建議接下來添加NewRelic插件。

NewRelic Stark計劃(推薦) - 或Wayne計劃(在我看來有點太有限)是免費的,它將幫助您將應用性能和跟蹤錯誤可視化。您可能會發現,測試儀排隊時間和內存消耗會導致您獲得的速度變慢,並且有幾種方法可以提高數據庫連接性能。改善代碼響應時間並限制數據庫命中(通過緩存)是很好的研究領域。如上所述,我建議將下面的代碼添加到您提到的文章中描述的獨角獸文件中。

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 
+0

我將該文件的哪部分放入?最後? –

+1

是的,只是追加到你的'before_fork'塊之後的文件結尾 – blotto

+0

對不起,我不清楚,我是否替換當前的after_fork塊或將其放在當前的after_fork塊之下? –

0

Heroku提供託管Postgres數據庫。 不同的分層數據庫有不同的連接限制。 入門級「Dev」和「Basic」數據庫僅限於20個連接。

和一個工人需要連接。 如果你有超過20名工人,你可以使用像pgbouncer這樣的連接池來處理這個問題。 如果您使用pgbouncer,則在您的環境中使用事務池模式,以便服務器可以在工作人員之間重用。

相關問題