2016-04-14 43 views
6

根據API文檔,rails收割機的目的是查找和恢復來自死亡線程的連接。收割機根據收割頻率運行。Rails Reaper不能正常工作

我遇到了數據庫連接數超過指定限制的情況,並且在空閒狀態下存在連接但收割者沒有重置這些連接。我嘗試手動運行收割者,但它似乎沒有任何效果。

reaper = ActiveRecord::ConnectionAdapters::ConnectionPool::Reaper.new(ActiveRecord::Base.connection, 10) 
reaper.run 

它不會有任何影響使用

ActiveRecord::Base.connection.execute("SELECT * FROM pg_stat_activity WHERE pid <> pg_backend_pid()") 
PgHero.total_connections 

這是與ActiveRecord的收割者中的錯誤進行了驗證,或者它並不意味着這樣的工作嗎?如果是這種情況,編寫自定義收割者來恢復死連接的選擇如何? pg gem被用於連接到postgres數據庫。那是吃了連接的查詢是:

SHOW事務隔離級別

Rails的版本:4.2.3

PG寶石版本:0.17.1

Postgres的版本: 9.4.6

Rails應用服務器:Puma

+0

你檢查了連接到數據庫的進程的PID嗎?你有沒有確定沒有任何死紅寶石進程?通常你不必自己收穫連接。你在你的代碼中做任何分叉?你的美洲獅如何建立?您需要在puma配置中使用正確的'before_fork' /'after_fork'代碼。 –

+0

你可以給我們你的美洲獅配置,特別是你使用多少工人和線程? 'database.yml'中的連接池設置有多大? – BoraMa

回答

-1

請下面的代碼添加到config/deploy.rb

deploy.task :restart, :roles => :app do 
    run "touch #{current_path}/tmp/restart.txt" 
end 

案例2,如果使用Capistrano的(只要刪除腳本/進程目錄):

默認情況下,Capistrano的試圖啓動一個新的Rails進程中運行收割腳本。您應該自定義默認行爲。

假設您使用Passenger(mod_rails)運行Rails應用程序,請安裝以下Capistrano + Passenger(mod_rails)配方,Capistrano將在部署時正常重啓您的Passenger實例。

+0

部署後應用程序重新啓動沒有任何問題。它在每次部署後都會重新啓動。此外,該應用程序不運行在乘客,但彪馬。 – Akarsh

2

有兩點要注意第一:

  • 這可能不是SHOW TRANSACTION ISOLATION LEVEL查詢那就是「吃了」你的數據庫連接。 pg_stat_activity視圖只顯示活動或在您的情況下,0123'在每個連接上執行。所以統計數據中更重要的信息就是有太多的連接打開。

  • ConnectionPool::Reaper釋放分貝連接,但只從dead threads,即那些停止或意外終止。但它不會影響連接活動或睡眠線程。事實上,收割機不適合你的海事組織只是意味着這些線程可能正在睡覺,而不是死亡。

現在,可能有很多原因超過最大值。在數據庫服務器上允許連接數:

  • 你可能有在同一時間一個檢查連接到數據庫線程太多。 ConnectionPool通常保留一個連接到db每個線程,直到在database.yml中配置的pool大小。因此,如果您的池大小相當大,並且有很多線程,則可以超過最大值。數據庫連接。例如,美洲獅創造高達16 threads by default

  • 每個rails進程定義自己的連接池。因此,例如,如果池大小定義爲10,並且您有10個導軌進程,則連接到db的連接最多可以建立10 * 10 = 100連接。彪馬服務器允許運行multiple workers(這是獨立的進程),所以你可能有太多的美洲獅工人運行。

  • 相同的邏輯適用於所有後臺進程和線程。例如,Sidekiq默認爲後臺作業創建最多25個線程。因此,如果您在代碼中使用線程或在內部使用線程的任何gem,例如對於後臺作業功能,您必須瞭解它們的精確設置,以便不超過最大連接數。

  • 您可能患有db連接泄漏。當使用preload_app(應用程序預加載)時,Puma服務器需要特殊設置,以便db連接不會泄漏。這是例如記錄的herehere