2

ログに多くの例外が表示されます。

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 を実行しています。

4

2 に答える 2

0
  • MongoDBを実行しているEC2インスタンスの種類は何ですか?それらは少なくとも。である必要がありm1.largeます。
  • MongoDBクラスターにはサーバーがいくつありますか?少なくとも2人と1人のアービターが必要です。それらはどのように構成されていますか?
  • TCP keepaliveタイムアウトを300秒に設定しましたか?
  • topとを使用してデータベースサーバーの基本的な統計を調べましたmongostatか?
  • 10genの無料のMongoDBMonitoringServiceをインストールして使用しましたか?

いくつかの監視ツールを使用したことがある場合、それらは何を教えてくれましたか?まだ使用していない場合は、それらを使用して、見つけたものを報告してください。

于 2012-04-22T04:21:32.937 に答える
0

これはおそらく

# Connect nonblock is broken in current versions of JRuby

for connectin lib/mongo/util/tcp_socket.rb:ファイルへのリンク

 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 はconnect非ブロックソケットではなくブロックソケットを使用する必要があるため、大量の読み取り/接続EIO/IOError中に発生した. read)

于 2012-04-22T05:42:46.847 に答える