1

最近、トラフィックが多いときに mySQL の「接続が多すぎます」というエラーが発生するようになりました。私の Rails アプリは、共有ホスト上に 2 つのインスタンスを持つ mongrel クラスターで実行されます。それを促進している可能性のある最近の変更:

  • サイトへのトラフィックが増加しました。現在、1 日平均約 4K ページです。
  • データベースのサイズが増加しました。私の最大のテーブルには最大 100K 行あります。一部の関連付けは、最悪の場合、数百のインスタンスを返す可能性がありますが、ほとんどの関連付けははるかに少ないものです。
  • 一部のアクションでデータベース呼び出しの数とサイズを増やす機能をいくつか追加しました。

データベース呼び出しの削減、SQL クエリの最適化、欠落しているインデックスの追加、熱心な読み込みのための :include の使用について、コード レビューを行いました。ただし、私のメソッドの多くは、依然として 5 ~ 10 個の個別の SQL 呼び出しを行っています。ほとんどのアクションの応答時間は約 100 ミリ秒ですが、最も一般的なアクションの 1 つは平均 300 ~ 400 ミリ秒であり、ランダムにピークが 1000 ミリ秒を超えるアクションもあります。

エラーはランダムに発生するように見えるか、少なくとも、呼び出されているアクションまたはアクセスされているデータに関連するパターンが表示されないため、ログはほとんど役に立ちません。

mongrel インスタンスを追加することでエラーを軽減できますか? または、サーバーによって mySQL 接続が制限されているため、トラフィックを分割するプロセスの数とは関係ありませんか?

これは私のコーディングの問題である可能性が高いですか、それとも共有サーバーの容量を増やす/負荷を減らすようにホストに圧力をかける必要がありますか?

4

3 に答える 3

2

ActiveRecord は Rails 2.2 以降、データベース接続をプールしており、それが過剰な接続の原因になっている可能性があります。その環境の の値を下げてみてくださいpool(database.ymlデフォルトは 5 です)。

ドキュメントはここにあります。

于 2011-03-15T22:26:11.963 に答える
1

何かキャッシュしていますか?これは、アプリケーションとデータベースの負荷を軽減する重要な部分です。Rails ガイドには、キャッシングに関するセクションがあります。

于 2011-03-15T20:36:07.100 に答える
1

何かが間違っている。Mongrel インスタンスは一度に 1 つのリクエストを処理するため、2 つの Mongrel インスタンスがある場合、(少なくとも mongrel からの) 2 つ以上のアクティブな MySQL 接続が表示されることはありません。

SHOW STATUS LIKE 'Threads_connected' の出力を経時的にログまたはグラフ化できます。

PS: これはあまり多くの Mongrel ではありません。2 つ以上の同時リクエストを処理できるようにしたい場合は、さらに多くのリクエストが必要になります。...メモリが不足している場合は、Phusion Passenger と REE に切り替えることができます。

于 2011-03-15T20:43:20.480 に答える