2016-05-10 4 views
0

RailsとMySQL RDSインスタンスに問題があります。私は自分のレールアプリをdatabase.ymlファイルから10(今5)の接続プールに接続しています。先日、データベースの別のユーザーがストアドプロシージャを実行しようとしましたが、実行されませんでした。実行するのを待っているだけで止まってしまった。ユーザーはプロセスを見て、私たちのレールユーザーが約30回のアイドルプロセスを抱えていることに気づいた。ストアドプロシージャはそれから始まり、問題なく走った。DB接続を長時間保持するレールが長すぎるため、ストアドプロシージャを実行できません

私たちはr3.xlargeインスタンス上にあり、問題の時点​​で〜100プロセスがありました。これは私にとっては驚くほど高くはないようで、なぜプロセスがいくつかのプロセスを解放せずに実行されないのかどうかはわかりません。私の質問は、x秒後にこれらのアイドル状態の接続のいくつか、またはこれらの接続をより良く制御する方法をリリースするように私のレールアプリに指示する方法はありますか?私はそれらを解放するcronを書くことができるが、私はそれをレール/最善の方法でやりたい。

ありがとうございました!

答えて

0

は、あなたのdatabase.ymlのファイルにreaping_frequencyを設定してみてください:

reaping_frequency:定期的にプログラマ場合に発生する可能性が死者のスレッドからの接続を見つけ、回復しようと死神、 、 を実行する頻度(秒単位)スレッドまたはスレッドの末尾の で接続を閉じるのを忘れると、予期せずに終了します。この 設定にかかわらず、Reaperはすべてのブロック待機の前に呼び出されます。 (死神のスケジュールを設定しないことを意味デフォルトはnil、)ドキュメント上

から:http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/ConnectionPool.html

0

あなたのMySQLインスタンスの最大接続数の制限をヒットしている可能性があることに私には思えます。あなたのMySQL上でselect @@max_connectionsを実行して制限を調べることができます。

Railsに割り当てられたdb接続を強制的にクローズする方法がわかりません。 各サーバープロセスでは、プールサイズ接続(ご使用の場合は10または5)(最大スレッド数は)まで使用できます。スレッドとプロセスの区別は重要です。たとえば、複数の作業者が別々のプロセスとして実行しているレールアプリケーションに対応している場合(たとえば、プーマはそのように構成できます)、プロセスごとに最大5または10の接続を割り当てることができます。バックグラウンドプロセス(sidekiqなど)を使用する場合は、この量まで接続を使用することもできます。

ConnectionPool死者スレッドから割り当てられたDB接続を解放するために使用することができますが、あなたのアプリケーションは、いくつかの大きなトラブルを抱えている場合を除き、これは通常、(あなたのスレッドはよりおそらくアイドルよりも助けにはなりませんreaperを提供死んだ)。

したがって、すべてのレールプロセスが必要とする可能性のある最大接続数を見積もり、MySQL接続制限に近いかそれを上回っている場合は、接続プールサイズを小さくするか、実行可能なRailsプロセス(ワーカー)の数

さらに詳しいヘルプが必要な場合は、Railsアプリケーションの実行に使用するアプリケーションサーバーとその構成方法を指定してください。

関連する問題