2013-01-04 15 views
9

あまりにも多くのMySQL接続を開いているRails 2.3アプリがあります。 1日も経たないうちに(〜400rpmで)、1つのプロセスに2つのmysqlサーバへの接続が確立されました。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;を実行できます。アプリサーバーでは、pidあたりの接続数をsudo netstat -ntp | grep 3306 | grep ESTABLISHED | awk '{print $7}' | sort | uniq -c | sort -nでカウントできます。

+0

83とは何ですか?あなたがパニックになっているのはそれが8300のようなものです。 – tadman

+1

84のRailsアプリケーションがあり、私たちのmysqlサーバには最大2000の接続があります。したがって、すべてのRailsアプリケーションが23以上の接続を持つ場合、私たちは使い果たされます。私たちの解決策は現在、5時間ごとにレールアプリのインスタンスを再起動することです。 –

+0

database.yml configに "wait_timeout:300"を追加して解決しました。これは、5分後に未使用のmysql接続を閉じます。 –

答えて

6

私たちのdatabase.ymlに "wait_timeout:300"を追加することでこれを修正しました。それは未使用のmysql接続を閉じますが、どこから来たのか説明しません。

+0

データベースクエリでスレッドを使用していますか?例えば'Thread.new {#ActiveRecord query}'。これは私がやっている問題ですが、wait_timeoutを低く設定することは本当に私にとっては解決策ではありません。 – Kache

1

ランダムなアイデア:mysql2 gemをフォークし、デバッグをMysql2 :: Client#initializeに追加し、通常の方法でアプリケーションを実行します。クライアントが初期化されたときにスタックのいくつかの行を出力し、漏洩の原因を追跡することができます。


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 

今の接続がレールによって正しく処理されています。

関連する問題