2013-01-04 164 views
9

我有一個Rails 2.3應用程序,它保持打開太多的MySQL連接。不到一天(〜400rpm)後,一個進程與我們使用的兩臺mysql服務器有83個ESTABLISHED連接。Rails MySQL太多連接

我們使用的是mysql2 gem(0.2.18),而mysql客戶端是:mysql Ver 14.12 Distrib 5.0.77, for redhat-linux-gnu (i686) using readline 5.1

如何解決這些泄漏發生的位置?在我們的測試中,我們永遠無法泄漏連接,只有在生產中。

在MySQL中,我們可以運行show processlist;來查看打開的連接。在應用程序服務器上,我們可以使用sudo netstat -ntp | grep 3306 | grep ESTABLISHED | awk '{print $7}' | sort | uniq -c | sort -n來計算每個pid的連接數。

+0

83怎麼了?你恐慌的方式就像是8300. – tadman

+1

有84個Rails應用程序,我們的mysql服務器最多有2000個連接。所以如果所有的Rails應用程序都有超過23個連接,我們就用完了。我們目前的解決方案是每5小時重新啓動一次rails應用程序實例。 –

+0

我們通過在我們的database.yml配置文件中加入「wait_timeout:300」來解決這個問題。 5分鐘後關閉未使用的mysql連接。 –

回答

6

我通過給我們的database.yml添加「wait_timeout:300」來解決這個問題。雖然這確實關閉了未使用的mysql連接,但它並不能解釋它們來自哪裏。

+0

你對數據庫查詢使用任何線程嗎?例如'Thread.new {#ActiveRecord query}'。這也是我遇到的一個問題,但將wait_timeout設置得太低並不是真正的解決方案。 – Kache

1

一個隨機的想法:fork mysql2 gem,添加一些調試到Mysql2 :: Client#初始化,並像平常一樣運行你的應用程序。當客戶端初始化時,您可以打印幾行堆棧,並追蹤誰造成泄漏。


0

對於它的價值,我們的登臺服務器上發生了同樣的問題 - 它達到了連接到mysql的max_connections數量。我發現直接從命令行運行服務而不是使用啓動腳本以某種方式解決了這個問題。

我還沒有找到它在導致問題的啓動腳本中是什麼。

0

我得到了錯誤太多的連接,因爲我使用了establish_connection來訪問多個模型中的其他數據庫。

我有這些模型

class InternetReference < ActiveRecord::Base 
    establish_connection :db_webserver 
end 

class InternetEmployee < ActiveRecord::Base 
    establish_connection :db_webserver 
end 

解決的辦法是打開的抽象模型的連接,並從這個模型繼承:

class AppsWebserver < ActiveRecord::Base 
    self.abstract_class = true 
    establish_connection :apps_webserver 
end 

class InternetReference < AppsWebserver 
end 

class InternetEmployee < AppsWebserver 
end 

現在的連接是由Rails的正確處理。