6

次の例外が断続的に発生します。

An ActionView::Template::Error occurred

execution expired
vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.13/lib/active_support/dependencies.rb:251:in `require'

これは完全なトレースです:

vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.13/lib/active_support/dependencies.rb:251:in `require'
vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.13/lib/active_support/dependencies.rb:251:in `block in require'
vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.13/lib/active_support/dependencies.rb:236:in `load_dependency'
vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.13/lib/active_support/dependencies.rb:251:in `require'
vendor/bundle/ruby/1.9.1/gems/tzinfo-0.3.37/lib/tzinfo/timezone.rb:103:in `get'
vendor/bundle/ruby/1.9.1/gems/tzinfo-0.3.37/lib/tzinfo/timezone_proxy.rb:80:in `real_timezone'
vendor/bundle/ruby/1.9.1/gems/tzinfo-0.3.37/lib/tzinfo/timezone_proxy.rb:52:in `period_for_utc'
vendor/bundle/ruby/1.9.1/gems/tzinfo-0.3.37/lib/tzinfo/timezone.rb:458:in `current_period'
vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.13/lib/active_support/core_ext/object/try.rb:36:in `try'
vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.13/lib/active_support/values/time_zone.rb:212:in `utc_offset'
vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.13/lib/active_support/values/time_zone.rb:226:in `<=>'
vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.13/lib/active_support/values/time_zone.rb:334:in `sort'
vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.13/lib/active_support/values/time_zone.rb:334:in `all'
vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.13/lib/action_view/helpers/form_options_helper.rb:507:in `time_zone_options_for_select'
vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.13/lib/action_view/helpers/form_options_helper.rb:612:in `to_time_zone_select_tag'
vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.13/lib/action_view/helpers/form_options_helper.rb:277:in `time_zone_select'
vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.13/lib/action_view/helpers/form_options_helper.rb:654:in `time_zone_select'

問題のページに移動すると、正常に読み込まれます。ほとんどの人にとっては問題なくロードされるようで、そのように断続的に(まれに)クラッシュするだけです。それが起こるときはいつでも、ユーザーエージェントはボットであることに気づきました。最新のものはMozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)です。でも、いつか人間に起こるのではないかと心配しているので、これについて何か知っている人はいないかと思います。

アップデート

これは、ユーザーがログインした状態で今日発生しました(幸い、そのユーザーは私でした...しかし、それを複製することはできませんでした)。

execution expired
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/visitors/visitor.rb:15:in `visit'

痕跡:

vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/visitors/visitor.rb:15:in `visit'
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/visitors/visitor.rb:5:in `accept'
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/visitors/emitter.rb:36:in `block in visit_Psych_Nodes_Sequence'
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/visitors/emitter.rb:36:in `each'
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/visitors/emitter.rb:36:in `visit_Psych_Nodes_Sequence'
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/visitors/visitor.rb:15:in `visit'
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/visitors/visitor.rb:5:in `accept'
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/visitors/emitter.rb:26:in `block in visit_Psych_Nodes_Document'
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/visitors/emitter.rb:26:in `each'
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/visitors/emitter.rb:26:in `visit_Psych_Nodes_Document'
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/visitors/visitor.rb:15:in `visit'
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/visitors/visitor.rb:5:in `accept'
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/visitors/emitter.rb:20:in `block in visit_Psych_Nodes_Stream'
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/visitors/emitter.rb:20:in `each'
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/visitors/emitter.rb:20:in `visit_Psych_Nodes_Stream'
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/visitors/visitor.rb:15:in `visit'
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/visitors/visitor.rb:5:in `accept'
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/nodes/node.rb:46:in `yaml'
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych.rb:243:in `dump'
vendor/bundle/ruby/1.9.1/gems/psych-1.3.4/lib/psych/core_ext.rb:14:in `psych_to_yaml'
/usr/local/lib/ruby/1.9.1/syck/rubytypes.rb:110:in `to_yaml'
vendor/bundle/ruby/1.9.1/gems/dalli-delete-matched-1.1.0/lib/dalli-delete-matched.rb:13:in `write_entry'
vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.13/lib/active_support/cache/strategy/local_cache.rb:140:in `write_entry'
vendor/bundle/ruby/1.9.1/gems/dalli-2.6.2/lib/active_support/cache/dalli_store.rb:102:in `block in write'
vendor/bundle/ruby/1.9.1/gems/dalli-2.6.2/lib/active_support/cache/dalli_store.rb:279:in `block in instrument'
vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.13/lib/active_support/notifications.rb:125:in `instrument'
vendor/bundle/ruby/1.9.1/gems/dalli-2.6.2/lib/active_support/cache/dalli_store.rb:279:in `instrument'
vendor/bundle/ruby/1.9.1/gems/dalli-2.6.2/lib/active_support/cache/dalli_store.rb:101:in `write'
vendor/bundle/ruby/1.9.1/gems/dalli-2.6.2/lib/active_support/cache/dalli_store.rb:78:in `fetch'
app/models/concerns/roleable.rb:11:in `roles'

繰り返しになりますが、どんな洞察も大歓迎です!

私はこれをHerokuでホストしており、https://blog.heroku.com/archives/2013/2/27/unicorn_railsの指示に従ってUnicornを使用しています。

4

3 に答える 3

3

2つのスタックトレースは完全に異なるため、ページレンダリングには一般に多くの時間がかかり、特定のスタックトレースに表示されるものとは関係ありません。ActionViewは、タイムアウトが発生した場所で停止します。

たとえば、キャッシュを使用して、レンダリングプロセスを高速化する必要があります。サーバーの負荷を軽減するために、ボットがキャッシュから提供される非動的コンテンツのみをヒットするようにします。大きなページをパーシャルに分割してキャッシュすることでさえ、少し役立つかもしれません。

それでもこれに遭遇する場合(特に非常にまれであるため)、この例外が発生したときにいつでもページの自動再レンダリングを行うことができます。サンプルコードについては、このブログエントリを参照してください。

于 2013-03-25T13:19:30.703 に答える
3

この質問に答える:

私はこれを修正することに本当に熱心ですが、どこから始めればよいのか本当にわかりません:/

このエラーの救済を開始し、ログに記録し、1通の電子メールを送信します。これは数回しか発生しないため、再試行します(「再試行」コマンドを使用)。この後、このIPが最後に実行したアクションをチェックして、関連しているかどうかを確認することをお勧めします。ログには、セッション変数もログに記録されます。

サーバーの使用率が高いとタイムアウトになる可能性があります。1つのツールlimenewrelicを使用するか、メモリ使用量、CPU使用率、ディスク使用量を他の情報と一緒に自分でログに記録してみてください。

編集:

これは1つのアクションだけではないため、次のようにApplicationControllerですべてのエラーを取得できます。

class ApplicationController < ActionController::Base
  rescue_from MyException, :with => :handle_my_exception

  def handle_my_exception
     grab_data
     send_mail
     retry
  end
 end

特定のアクションであると思ったので、ここで再試行が機能するかどうかはわかりません。ただし、再試行できない場合でも、この方法でより多くの情報を取得し、電子メールで自分に送信することができます。もちろん、再試行カウンターロジックを追加する必要があります。そうしないと、問題が発生します。

もう一度編集:

よく考えてみると、リクエストパラメータに基づいてredirect_toを使用して、そこからの再試行をシミュレートできます。この回答では、彼はそれを取得する方法を説明しています。パラメータも送信することを忘れないでください。

Ruby on Railsで現在の絶対URLを取得するにはどうすればよいですか?

于 2013-03-28T02:03:54.217 に答える
1

この問題(とにかくHerokuで)は、次のコードに要約されます。

ActiveSupport::TimeZone::MAPPING.each do |key,val|
  TZInfo::Timezone.get(val)
end

すべてのタイムゾーン情報は、かなり大きなファイルのセット(タイムゾーンごとに1つ)から読み込まれ、解析されます。何らかの理由で、この操作は非常に重いです。たぶん、RubyがファイルベースのIO(?)であまり効率的ではないことと、ファイルシステムにランダムな問題が発生するHerokudynoの組み合わせです。

私の現在の修正は、すべてのUnicornワーカー(after_fork)にタイムゾーン情報(基本的に上記のコードを実行)をプリロードすることです。今では、少なくとも問題はランダムに発生するのではなく、決定論的です...

于 2013-07-19T10:20:17.033 に答える