2013-05-24 12 views
11

私の質問は、次のようなものですが、少し異なる状況下で起こっています。Heroku/Unicornの定期的なレールエラー - 「実行期限切れ」、ActionView :: Template :: Error

Rails: execution expired on time_zone_select

私のセットアップは次のとおりです。3.2.13

  • ユニコーン

    • のRails 4.6.2
    • Mongoid 3.0.22
    • 原付1.4.2

    ヘロク・シーダーで走る。 MongoDBはMongoLabでホストされています。

    エラーはバッチで発生し、Herokuプロセスの再起動によって解決されることがよくあります。最初は通常以下のものです:

    An ActionView::Template::Error occurred in [controller]#[action]: 
    
    execution expired 
    vendor/bundle/ruby/1.9.1/gems/moped-1.4.2/lib/moped/sockets/connectable.rb:46:in `read' 
    

    次はスタックトレースの最上位ビットです。必要に応じてさらにお楽しみください!答えはタイムアウトを増やすことであるならば、それは大丈夫です -

    vendor/bundle/ruby/1.9.1/gems/moped-1.4.2/lib/moped/sockets/connectable.rb:46:in `read' 
    vendor/bundle/ruby/1.9.1/gems/moped-1.4.2/lib/moped/sockets/connectable.rb:46:in `block in read' 
    vendor/bundle/ruby/1.9.1/gems/moped-1.4.2/lib/moped/sockets/connectable.rb:118:in `handle_socket_errors' 
    vendor/bundle/ruby/1.9.1/gems/moped-1.4.2/lib/moped/sockets/connectable.rb:46:in `read' 
    vendor/bundle/ruby/1.9.1/gems/moped-1.4.2/lib/moped/connection.rb:177:in `read_data' 
    vendor/bundle/ruby/1.9.1/gems/moped-1.4.2/lib/moped/connection.rb:99:in `block in read' 
    vendor/bundle/ruby/1.9.1/gems/moped-1.4.2/lib/moped/connection.rb:202:in `with_connection' 
    vendor/bundle/ruby/1.9.1/gems/moped-1.4.2/lib/moped/connection.rb:97:in `read' 
    vendor/bundle/ruby/1.9.1/gems/moped-1.4.2/lib/moped/protocol/query.rb:163:in `receive_replies' 
    vendor/bundle/ruby/1.9.1/gems/moped-1.4.2/lib/moped/connection.rb:135:in `block in receive_replies' 
    vendor/bundle/ruby/1.9.1/gems/moped-1.4.2/lib/moped/connection.rb:134:in `map' 
    vendor/bundle/ruby/1.9.1/gems/moped-1.4.2/lib/moped/connection.rb:134:in `receive_replies' 
    vendor/bundle/ruby/1.9.1/gems/moped-1.4.2/lib/moped/node.rb:553:in `block (2 levels) in flush' 
    vendor/bundle/ruby/1.9.1/gems/moped-1.4.2/lib/moped/node.rb:129:in `ensure_connected' 
    vendor/bundle/ruby/1.9.1/gems/moped-1.4.2/lib/moped/node.rb:551:in `block in flush' 
    vendor/bundle/ruby/1.9.1/gems/moped-1.4.2/lib/moped/node.rb:566:in `logging' 
    vendor/bundle/ruby/1.9.1/gems/moped-1.4.2/lib/moped/node.rb:550:in `flush' 
    vendor/bundle/ruby/1.9.1/gems/moped-1.4.2/lib/moped/node.rb:539:in `process' 
    vendor/bundle/ruby/1.9.1/gems/moped-1.4.2/lib/moped/node.rb:349:in `query' 
    vendor/bundle/ruby/1.9.1/gems/moped-1.4.2/lib/moped/cursor.rb:138:in `block in load_docs' 
    vendor/bundle/ruby/1.9.1/gems/moped-1.4.2/lib/moped/session/context.rb:105:in `block in with_node' 
    vendor/bundle/ruby/1.9.1/gems/moped-1.4.2/lib/moped/cluster.rb:250:in `with_secondary' 
    vendor/bundle/ruby/1.9.1/gems/moped-1.4.2/lib/moped/session/context.rb:104:in `with_node' 
    vendor/bundle/ruby/1.9.1/gems/moped-1.4.2/lib/moped/cursor.rb:137:in `load_docs' 
    vendor/bundle/ruby/1.9.1/gems/moped-1.4.2/lib/moped/cursor.rb:25:in `each' 
    vendor/bundle/ruby/1.9.1/gems/moped-1.4.2/lib/moped/query.rb:76:in `each' 
    vendor/bundle/ruby/1.9.1/gems/moped-1.4.2/lib/moped/query.rb:76:in `each' 
    vendor/bundle/ruby/1.9.1/gems/mongoid-3.0.22/lib/mongoid/contextual/mongo.rb:132:in `block in each' 
    vendor/bundle/ruby/1.9.1/gems/mongoid-3.0.22/lib/mongoid/contextual/mongo.rb:556:in `selecting' 
    vendor/bundle/ruby/1.9.1/gems/mongoid-3.0.22/lib/mongoid/contextual/mongo.rb:131:in `each' 
    vendor/bundle/ruby/1.9.1/gems/mongoid-3.0.22/lib/mongoid/contextual.rb:18:in `each' 
    

    ラック::タイムアウトは10秒(私はそれは私が読んで、キャッシングのチュートリアルのいずれかによって示唆されたと考えている)のために設定されています。しかし、これはクエリの問題が遅いのではないかと思います。この現象は、Unicornのプロセスのうち、ハングアップするプロセスの1つであることを示しているようです(これがpsの再起動が原因です)。

    ご意見やご要望があれば幸いです。

  • +1

    をコミットして展開し、その後、バンドル、あなたのGemfileに1.9.3にルビーのバージョンを設定してみてください。 – nont

    +0

    これは問題の解決策ではありませんが、若干の回避策(とはいえ必ずしも良いことではありません) - 私はPumaのためにUnicornを交換し、Herokuの2つのDynosにぶつかり、問題は大きな要因で減少しました。しかし、まだ解決されていないし、私はまだ一握りの '実行期限切れ'エラーを1日に取得しています(これは一時間から数えています)。私の欠点は、これがMongoid/MongoLabの問題であると言うことです - 遅いクエリ応答か、非ローカルデータベースとのオープンな接続を吊るします。 – nlh

    +0

    更新#2:ユニコーンの代わりに2dynos&pumaを使っても、まだまだ多くのことが起こっています。一口。 – nlh

    答えて

    1

    これはherokuのファイルシステムまたはネットワークシステムの問題です。 modped readメソッドは、 'Kernel :: select'を呼び出します。これを選択すると、IOオブジェクトが読み込み可能になるのを待つシステムブロッキング呼び出しが行われます。この場合、MongoLabへの外部接続を行うのはTCPポートです。 TCPポートが判読不能になる理由はいくつでもあります。ネットワーキングとファイルの問題が気になります。私はそれが長い実行中のクエリだと思うが、selectのためのクエリの実行中にソケットが読み込み可能なので、スクリプトの実行をブロックしません。問題が解決しない場合、私はherokuから、あるいはおそらく別のネットワーク上の外部データベースから移動することを検討します。 AWSは、箱(ボックス)間の待ち時間が非常に短いため、常に良い選択です。 HTH

    0

    は、私は非常によく似たスタックでEC2上で、これと同じ問題/スタックトレースを見ている再び