Apache-2.2

頁面掛在等待查詢,消耗記憶體,需要 2 小時才能失敗

  • February 29, 2016

請參閱 Fusion Reactor 的附加圖片,顯示仍在執行的頁面。時間已經上升到數百萬,我讓他們看看他們是否會完成,但那時只有 2 或 3 個。

現在我得到了幾十頁,只是永遠不會完成。這是不同的查詢,我看不到任何巨大的模式,除了它似乎只適用於我的 7 個數據庫中的 3 個。

top顯示融合 CPU 使用率約為 70-120%,深入研究 Fusion Reactor 詳細資訊頁面顯示所有時間都僅用於 Mysql 查詢。

show processlist沒有返回任何異常,除了處於睡眠狀態的 10 - 20 個連接。

在此期間,許多頁面確實完成了,但是隨著掛起的頁面數量的增加,它們似乎永遠不會完成伺服器最終只會返回白頁。

唯一的短期解決方案似乎是重新啟動 Coldfusion,這遠非理想。

最近添加了一個 Node.js 腳本,它每 5 分鐘執行一次,並檢查要處理的批處理 csv 文件,我想知道這是否會導致竊取所有 MySQL 連接的問題,所以我禁用了它(該腳本沒有 connection.end () 方法)但這只是一個快速的猜測。

不知道從哪裡開始,有人可以幫忙嗎?

最糟糕的部分是頁面永遠不會超時,如果他們這樣做了也不會那麼糟糕,但過了一段時間沒有任何服務。

我正在執行一個 CentOS LAMP 堆棧,其中 Coldfusion 和 NodeJS 作為我的主要腳本語言

永遠不會失敗的長請求

在實際發布之前更新

在寫這篇文章的過程中,我在禁用 Node 腳本並重新啟動 Coldfusion 後開始寫這篇文章,問題似乎已經消失了。

但是我仍然需要一些幫助來確定頁面為什麼會超時並確認 Node 腳本需要類似的東西connection.end()

它也可能只在負載下發生,所以我不能 100% 確定它已經消失

更新

仍然有問題,我剛剛複制了一個目前在 Fusion Reactor 中長達 70 秒的查詢,並在數據庫中手動執行它,它在幾毫秒內完成。查詢本身似乎不是問題。

另一個更新

其中一頁的堆棧跟踪仍在執行。伺服器有一段時間沒有停止服務頁面,所有節點腳本目前都被禁用

http://pastebin.com/D6ycJf3X

更多更新

我今天又多了幾個——它們實際上完成了,我在 FusionReactor 中發現了這個錯誤:

Error Executing Database Query. The last packet successfully received from the server was 7,200,045 milliseconds ago. The last packet sent successfully to the server was 7,200,041 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.

更多更新

探勘程式碼,我嘗試尋找“2 h”、“120”和“7200”,因為我覺得 7200000 毫秒超時太巧合了。

我找到了這段程式碼:

// 3 occurrences of this
createObject( "java", "coldfusion.tagext.lang.SettingTag" ).setRequestTimeout( javaCast( "double", 7200 ) );

// 1 occurrence of this 
<cfsetting requestTimeOut="7200">

引用這些程式碼行的 4 個頁面很少執行,從未出現在超過 2 小時超時的日誌中,並且處於密碼保護區域,因此無法被抓取(它們用於文件上傳和 CSV 處理,現在移至nodejs)。

這些設置是否可能以某種方式由一個頁面設置但存在於伺服器中,並影響其他請求?

1)發布堆棧跟踪。

我保證他們會掛在 Socket.read() (或類似的)上

發生的是 1/2 到 db 的 tcp 連接被關閉,讓 cf 等待它永遠不會得到的響應。

cf box 和 db 之間存在網路問題。

Java db 驅動程序通常不擅長處理這個問題


感謝堆棧跟踪

這證實了我的假設,它是 tcp 連接關閉的 1/2。

我懷疑以下其中之一 1) mysql 在 linux 上並且 TCP 堆棧中有一個錯誤,所以你需要在那個盒子上升級 linux - 是的,我之前見過這個 2) Coldfusion 在 linux 上 .. . 按照 1 ) 3) 任何一個盒子上或之間的電纜/硬體有故障 4) 如果您正在執行 Windows 禁用 TCP 解除安裝!!!

3)是最難的。您需要在兩個盒子上執行wireshark並證明封包遺失。更簡單的解決方案是將 Rackspace VM 移動到不同的物理主機並查看它是否消失。(您的程式碼極少有可能非常糟糕,並且您正在使 CF 盒和 MySQL 盒之間的網路飽和,但我不確定是否可以編寫那麼糟糕的程式碼)

引用自:https://serverfault.com/questions/729125