2016-06-13 4 views
0

私は奇妙なバグの原因を突き止めようとしています。Rails:SQLクエリのプロダクションサーバが永久にハングする

私は(コントローラのアクションによって呼び出される)モデルでのコード行を持っている:予想通り

# it always works 
self.deliveries.create(subscriptions.pluck('DISTINCT endpoint').collect {|e| {endpoint: e}}) 

すべては私のローカルマシン上で、本番サーバー上で、さらに何千ものと(作品配送)。

ブースト性能をするためには私は生のSQLと上記の行を置き換えています

# it hangs forever on the production server if you have many deliveries 
inserts = subscriptions.pluck('DISTINCT endpoint').collect do |e| 
    "(#{self.id}, #{ActiveRecord::Base::sanitize(e)})" 
end 
ActiveRecord::Base.connection.execute("INSERT INTO deliveries (notification_id, endpoint) VALUES #{inserts.join(', ')}") 

でも配達の何千もの私のローカルマシン上で期待通り、この作品。しかし、私の生産サーバー上の(2GB RAM/2コア)この2番目のバージョンは、挿入するレコードがいくつかある場合のみ動作し、それ以外の場合は2000個の配送があるため、要求は永久にハングします

は、より正確には:

  • ブラウザが応答とHTTPリクエストが永遠に
  • 配達が行は次のデータベース
  • 保存されているハング取得していませんexecuteは実行されません

コードの3番目のバージョンを使用して、元のSQLをactiverecord-import gemと交換すると、まったく同じバグが発生します。

このバグの原因は何ですか?

私はそれがアプリケーションをクラッシュさせる長い出力メッセージ(大規模なSQLクエリ)(これはlogz.ioを使用している)である可能性があるのか​​疑問に思っています。

+0

なぜあなたは、このすべてにRailsのが関与していますか? SQLの単純な 'insert into ... select ...'ビットは、より良い出発点でしょうか? –

答えて

0

私の容疑者は正しかったです。

この問題は、ログメッセージが長すぎるとlogstash-logger gemが原因で発生します。

レールコンソールから、私はこの問題を再現することができて、私は(1つのクエリに対して)得た:

LogStashLogger::Device::UDP - Errno::EMSGSIZE - Message too long 
LogStashLogger::Device::UDP - Errno::EMSGSIZE - Message too long 
LogStashLogger::Device::UDP - Errno::EMSGSIZE - Message too long 
LogStashLogger::Device::UDP - Errno::EMSGSIZE - Message too long 
... [and many many more] 
関連する問題