2016-03-26 11 views
4

過去数ヶ月間、私のサイト(Rails 4 with Herokuで動作しています)は何の問題もありませんでした。トラフィックは安定しており、応答時間は500ミリ秒以下です。Rails 4 Appがランダムにタイムアウトする理由を理解してください

今日は無作為に応答時間が20,000 ms以上に達しました。

Heroku response times

私のログを見ると、私はSELECT DISTINCT COUNTを実行するために非常に時間がかかりActiveRecordのに気づきました。実際、これは低速の負荷を引き起こしているように見えました。

(5029.1ms) SELECT DISTINCT COUNT(DISTINCT "impressions"."session_hash") FROM "impressions" WHERE "impressions"."impressionable_id" = $1 AND "impressions"."impressionable_type" = $2 [["impressionable_id", 826], ["impressionable_type", "Article"]] 

私は、これは私が記事の数を表示するために使用していますが、私はわからない印象派の宝石と私のカウンターキャッシュによって引き起こされていると言いたいです。

私は今も、初めての私のログにこのエラーを見ています:

PG::DuplicatePstatement: ERROR: prepared statement "a9" already exists 

何が起こっているか理解するすべてのヘルプは素晴らしいだろう。問題に関する文書を見つけることができないようです。非常に奇妙なことに、私のアプリは今何ヶ月もしっかりと動いており、今日は下り坂に入ることに決めました。

私はHerokuでRack Timeout gemも使用しています。私はこの宝石が直接的または間接的に上記のエラーを引き起こす可能性があると聞きましたが、なぜこのようなことが起こっているのか、私の頭を抱くことができます。私が提供できる他の情報や指標があれば教えてください。

1日以降の更新:

応答時間は、自分の(< 500ミリ秒)に正常に戻って行きました。そのようなランダムなスパイクがなぜ発生するのか理解できません。

そして、ちょうど参考のために、上記SELECT DISTINCT COUNTクエリは単にセッションに固有の感想をカウントしている私の記事ショーのページにこのコードから実行されていた:あなたが用意しているので、

<%= @article.impressionist_count(filter: :session_hash) %> 
+1

有料版のHerokuを使用していますか、無料ですか? – CheeseFry

+0

標準2X Dynoと趣味基本DB(10m行)で実行中です。@CheeseFry – Kathan

+0

そのクエリを生成するRubyコードを投稿できますか? – spickermann

答えて

0

このエラーPG::DuplicatePstatement: ERROR: prepared statement "a9" already existsが起こりました文が有効になりました。私はこのエラーの正確な原因は何か分かりません。私はテストビルドや他の場所でそれを無作為に見ました。私は一般的にあなたにいくつかの本当の問題を救うことができるので、準備されたステートメントを無効にすることをお勧めします。より多くのトラフィックを取得し、dynosを拡大しようとすると、pg gemからメモリエラーが発生することがあります。ちょうどあなたはまた、他の環境のためにそれを無効にすることができ、あなたのdatabase.ymlの

production: 
    adapter: postgresql 
    prepared_statements: false 

にこれを追加し無効にするには

最初の問題に戻ると、一般にCOUNTのクエリはPostgresでは遅く、特にDISTINCTで遅くなるので、おそらく最適化を試みるべきです。しかし、それはランダムなスパイクなので、私はそれがAUTOVACUUMによって引き起こされたと確信しています。おなじみでない場合は、AUTOVACUUMはガベージコレクタのようにディスクから削除された行を削除し、統計情報などを収集します。実行すると、IOトラフィックが多く発生し、他のクエリが遅くなります。デフォルトでは、テーブルの行の20%が変更された後に呼び出され、発生するタイミングを正確に予測することはできません。夜間や低トラフィック時に手動で実行することは可能です。 psqlにVACUUM ANALYZE table_name;と入力してください。

自動バキュームに関連するデータベースの統計情報(前回の実行時、変更された行の数など)も表示されます。最も簡単な方法は、https://github.com/heroku/heroku-pg-extrasをインストールして実行することです。heroku pg:vacuum-stats

関連する問題