2016-05-10 26 views
0

我遇到了Rails和MySQL RDS實例的問題。我有我的rails應用程序連接到它通過我們的database.yml文件與10(現在5)連接池。有一天,數據庫的另一個用戶嘗試運行一個存儲過程,但它不會執行。它只是掛在等待執行。用戶查看了這些進程,發現我們的rails用戶有大約30個空閒進程,所以他們殺死了其中的一些進程。存儲過程隨即啓動並正常運行。Rails堅持數據庫連接時間過長,無法運行存儲過程

我們在一個r3.xlarge實例上,並且在出現問題時有大約100個進程。這對我來說似乎並不令人驚訝,我不確定爲什麼這個程序不能在沒有釋放某些過程的情況下執行。我想我的問題是,有沒有辦法告訴我的Rails應用程序在x秒後釋放一些空閒連接,還是更好地控制這些連接的方法?我可以寫一個可以釋放它們的cron,但是我很樂意用rails/best的方式來做它。

感謝您的幫助!

回答

0

嘗試在你的database.yml文件設置reaping_frequency

reaping_frequency:頻率秒定期運行收割機, 它試圖找到並從死線程恢復連接, 可如果程序員發生忘記關閉一個線程或線程末端的連接 意外死亡。不管這個設置如何,收割者在每次阻塞等待之前都會被調用。 (默認值爲零,這意味着不調度收割機)

以上內容來自文檔:http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/ConnectionPool.html

0

在我看來,你可能已經擊中了MySQL實例的最大連接數限制。你可以在你的MySQL上運行select @@max_connections來找出限制。

我不知道強制Rails關閉其分配的數據庫連接的方法。 每個服務器進程可能會使用最多池大小連接(即10或5在你的情況下)到db爲其線程。線程和進程之間的區別非常重要:例如,如果您有多個服務於您的rails應用程序的worker作爲單獨的進程運行(例如puma可以像這樣配置),那麼每個進程可以分配多達5或10個連接。如果你使用後臺進程(sidekiq等),他們也可能使用最多的連接數量。

ConnectionPool還提供了一個reaper,可用於從線程釋放分配數據庫連接,但除非你的應用有一些大的麻煩,這通常不會幫助(你的線程更可能空閒死了)。

因此,我會給出一般性建議來嘗試估計所有rails進程可能需要的最大連接數,並且如果它接近或高於MySQL連接限制,則可以降低連接池大小或減少可能運行的Rails進程(工作人員)的數量。

如果您需要更多幫助,請指定您使用哪種應用程序服務器來運行Rails應用程序,以及它如何配置,以及對於任何後臺作業人員。

相關問題