2012-04-19 7 views
2

私は私のログに例外をたくさん見ています:EC2でMongo :: OperationFailureが何度も起こっています。どうしたらいいですか?

A Mongo::OperationFailure occurred in foo#bar: 

Mongo::OperationFailure 
mongo (1.6.2) lib/mongo/util/tcp_socket.rb:76:in `read' 

私はRubyドライバーとしてMongoidを使用しています。

これは、接続プールに関連しているかどうかわからないが、ちょうどそれがある場合には、これは私のmongoid.yml:

production: 
    host: xxx 
    port: 27017 
    username: xxx 
    password: xxx 
    database: foo 
    logger: false 
    pool_size: 200 
    max_retries_on_connection_failure: 5 
私はEC2は、一時的なネットワークの問題を持つことができます理解し

が、これはほとんどとなってきていますノルムこの問題を解決する最良の方法は何ですか?

私はJRuby 1.6.7をバックグラウンド情報として使っています。

+1

mongodログに警告/エラーはありますか? – Gregor

+0

'mongostat'のスナップショットを共有できますか? – DhruvPathak

答えて

0
  • MongoDBをどのように実行していますか?少なくともm1.largeである必要があります。
  • MongoDBクラスタにはいくつのサーバがありますか?少なくとも2 + 1のアービタが必要です。どのように構成されていますか?
  • TCP keepaliveタイムアウトを300 secondsに設定しましたか?
  • topmongostatを使用してデータベースサーバーの基本統計を調べましたか?
  • 10genのfree MongoDB Monitoring Serviceをインストールして使用しましたか?

いくつかの監視ツールを使用していた場合、彼らはあなたに何を伝えましたか?あなたがしていない場合は、よく、それらを使用し、あなたが見つけるものを報告します。

0

これはlib/mongo/util/tcp_socket.rbconnectため

# Connect nonblock is broken in current versions of JRuby 

という事実に関連おそらくです:エラーが発生したherelink to file

def connect 
    # Connect nonblock is broken in current versions of JRuby 
    if RUBY_PLATFORM == 'java' 
    require 'timeout' 
    if @connect_timeout 
     Timeout::timeout(@connect_timeout, OperationTimeout) do 
     @socket.connect(@socket_address) 
     end 
    else 
     @socket.connect(@socket_address) 
    end 
    else 
    ... # nonblocking connect 

rescue Errno::EINTR, Errno::EIO, IOError 
    raise OperationFailure 
end 

だからおそらくEIO/IOErrorでしょう。

JRubyの代わりにRubyを使用してみてください。

これが役に立ちます。

(私はおそらく全くと言って後悔する無学推測を行う必要がある場合、それはJRubyのではなく、非ブロック1のブロッキングソケットconnectを使用しているので、EIO/IOErrorread中に発生したことだろうと思います読み込み/接続の量が多い場合)

関連する問題