11

Heroku で Rails 3.2 アプリをホストしていますが、Rails アプリケーション内で毎日 2 ~ 3 回タイムアウトします。これらはH12 リクエストのタイムアウトではなく、Rails スタック内のどこかで発生するタイムアウトですしたがって、それらは実際にサイトで例外を生成し、Airbrake ログに表示されます。

タイムアウトが発生する場所は完全にランダムのようです。Formtastic のような gem 内、HAML ビュー内、または ActiveRecord コード内にある場合もあります。ここでいくつかのバックトレースの例を見ることができます: https://gist.github.com/dpmccabe/5238273

このサイトはトラフィックが少なく、2 つの dyno でうまく動作します (Adept Scale アドオンのおかげで、自動的にスケールアップします)。HTTP_X_HEROKU_QUEUE_WAIT_TIME ヘッダーは通常低いかゼロであるため、ルーティングの問題ではないと思います。Thin から Unicorn に切り替えても効果はありませんでした (私の unicorn.rb は上記の要点に示されています)。

これらのタイムアウト例外がアプリケーション全体でランダムに発生しているように見えるという事実は、私に先に進むことをあまり与えません. 私は New Relic を持っていますが、これをデバッグする方法がわかりません。何か案は?

4

3 に答える 3

1

heroku でホストされているアプリケーションでも同じ問題が発生していました。

ログを調べたところ、処理に 30 秒以上かかるリクエストはほとんどなく、heroku でタイムアウト エラーが発生したことがわかりました。私の場合、問題はログへの出力でした。大量の入出力データがサーバー ログに出力され、出力に 30 秒以上かかったステージング サーバーがありました。ログへのデータの出力がまだ完了していないため、リモート API から応答が受信されました。

そのため、入力 (コードによって構築された入力 xml データ) および出力 (API から受信した xml データ) データをログに出力するすべての print ステートメントを削除しました。

  1. そのため、ログを確認して、リクエストの処理に 30 秒以上かかっているかどうかを確認することをお勧めします。
  2. ログに出力するのに時間がかかるデータを (デバッグ目的で) 出力しているかどうかを確認します。

繰り返しますが、これはあなたの質問に対する答えではないかもしれませんが、これが私の解決方法です。それが役に立てば幸い!

于 2013-07-19T15:37:22.970 に答える
1

私も同じ問題に直面しています。まだ解決していませんが、これまで見てきたことでうまくいくと思いました。私はrack-timeout gemを使用しており(バックトレースに基づいて、あなたもそうであるように見えます)、タイムアウトを15秒に設定しています。new relic を見ると、どのリクエストに対してもアプリ サーバーの平均応答時間は 200 ミリ秒をはるかに下回っています。それでも、あなたと同じように、次のようなエラーが 1 日に 2 ~ 3 件発生します。

undefined method `result' for #<Timeout::Error: execution expired>

エラーはさまざまなアクションで発生しますが、エラーを生成する可能性が特に高いと思われるアクションはありません。このエラーは、単純な CRUD DELETE アクションでも発生します。Heroku の Cedar スタックで Rails 3.2 アプリを実行しています。それぞれ 3 つのユニコーン ワーカーを持つ 2 つの Web dyno を実行しています。それぞれ一貫して 512 MB の制限を下回っています。

これまでに見つけた唯一の手がかりは、ログのタイムアウト近くで次のようなものがよく見られることです。

[AMBER] LOG: process 21289 acquired ShareLock on transaction 105259 after 32366.132 ms

似たようなものが見えますか?レコードをロックしているDBアクションがタイムアウトを引き起こしている可能性がありますが、よくわかりません。

于 2013-04-26T02:51:36.690 に答える
0

Heroku Dev Centerによると、完了までに 30 秒以上かかる場合、ルーターはリクエストを終了します。Rack-timeout gemを使用して、ボトルネックを見つけることができます。タイムアウトを 30 秒未満にするだけです

Rack::Timeout.timeout = 15 # seconds

複数の並行リクエストがある場合は、Unicornの使用を検討してください

于 2013-04-20T10:07:15.710 に答える