2016-06-13 47 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核心)這第二個版本只適用於當我有幾個記錄插入,否則與2000交付或請求永遠掛起

爲了更精確:

  • 瀏覽器沒有得到迴應和HTTP請求掛起永遠
  • 的交付在數據庫
  • 以下行保存execute永遠不會執行

如果我使用第三個版本的代碼,並使用activerecord-import替換原始SQL,我會得到完全相同的錯誤。

什麼可以導致此錯誤?

我甚至想知道它是否可以是崩潰應用程序(我使用logz.io)生成的長輸出消息(大sql查詢)。

+0

你爲什麼涉及的Rails在這呢?一個簡單的'insert into ... select ...'SQL位將是一個更好的起點,不是嗎? –

回答

0

我的嫌疑人是正確的。

問題是由日誌消息太長時的logstash-logger gem造成的。

從鐵軌控制檯,我可以重現這個問題,我得到了(用於一個查詢):

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]