11

Heroku で時折リクエストのタイムアウトが発生することがあります。残念ながら、一貫して再現できないため、デバッグが非常に困難です。リクエストごとの膨大な数のデータベース クエリを削減したり、キャッシングを追加したりするなど、パフォーマンスを改善する機会はたくさんありますが、プロファイリングを行わない場合、それは暗闇の中でのショットです。

New Relic の分析によると、多くのリクエストはサーバー上で 1 ~ 5 秒かかります。遅すぎることはわかっていますが、タイムアウトに必要な 30 秒にはほど遠いものです。

New Relic のエラー タブには、タイムアウトが発生したいくつかの異なるデータベース クエリが表示されますが、これらは特に遅いクエリではなく、クラッシュごとに異なるクエリである可能性があります。また、同じ URL に対して、データベース クエリが表示される場合と表示されない場合があります。

これらの特定のケースで何が起こっているかを知るにはどうすればよいですか? たとえば、エラーが発生していないときにデータベースで費やした時間とは対照的に、タイムアウトが発生したときにデータベースで費やしていた時間をどのように確認できますか?

私が持っている 1 つの仮説は、データベースがロックされる場合があるというものです。おそらく読み書きの組み合わせ。

4

3 に答える 3

7

すでにご覧になっているかもしれませんが、Heroku には、リクエストのタイムアウトに関する優れた背景が記載されたドキュメントがあります。

リクエストに時間がかかり、リクエストが完了する前にそれらを処理するプロセスが強制終了されていない場合、時間がかかりすぎた個々のトランザクションに関する詳細を提供するトランザクション追跡を生成する必要があります。

Unicorn を使用している場合、リクエストが Unicorn のタイムアウトに達するほど時間がかかっているため、これが発生していない可能性があります(その後、これらのリクエストにサービスを提供するワーカーは、New Relic エージェントに十分な情報を与えずに強制的に殺されます)。戻って報告する時間)。

2段階のアプローチをお勧めします。

  1. タイムアウトが Heroku の 30 秒未満になるように、 rack-timeoutミドルウェアを構成します。これが機能する場合、 を発生させることにより、タイムアウトよりも長くかかっているリクエストを終了しますTimeout::Error。そのようなリクエストは、New Relic でトランザクション トレースを生成する必要があります。
  2. それでも何も得られない場合 (rack-timeout は、いくつかの制限Timeoutがある Ruby の stdlib クラスに依存しているため、そうなる可能性があります)、Unicorn リクエスト処理タイムアウトをデフォルトの 60 秒から上げてみることができます (Unicorn を使用していると仮定します)。この場合、実行時間の長いリクエストは Unicorn ワーカーを長時間拘束することに注意してください。これにより、サイトがさらに遅くなる可能性があるため、これは最後の手段として使用してください。
于 2013-04-09T05:43:44.230 に答える
1

ここで2年遅れ。Ruby の経験はほとんどありませんが、Django の場合、Gunicorn の問題は、リクエストが事前にバッファリングされていないため、Heroku で低速のクライアントを適切に処理できないことです。つまり、サーバー接続が待機状態 (ブロック) になる可能性があります。この記事は、主に Gunicorn と Python に適用されますが、役に立つ記事かもしれません。

于 2015-03-10T22:29:04.980 に答える
0

実行時間の長いリクエストで問題が発生していることは明らかです。http://artsy.github.com/blog/2013/02/17/impact-of-heroku-routing-mesh-and-random-routing/をチェックして、NewRelic RPM 3.5.7.59 にアップグレードしてください。正確に報告すること。

于 2013-02-21T06:21:25.523 に答える