如何調試不斷攀升的 Ruby 進程?

如何調試不斷攀升的 Ruby 進程?

幾天前,我的所有 4 個應用程式伺服器都開始出現問題。這是在我部署了一些程式碼之後發生的,但我所做的只是更新了儲存一些 IP 位址的本機資料庫文件,因此我沒有進行任何實際的程式碼更改。似乎就在那個時候,我的 ruby​​ 流程現在已經失控了。它們會在一段時間內表現良好,然後突然間它們會在一個 CPU 上迅速攀升至 100% CPU。由於我使用的是乘客,最終另一個執行緒會做同樣的事情,並最大化另一個 CPU,依此類推,直到 Web 伺服器無法再處理流量並停止回應。

我已經做了很多挖掘(我不擅長),但我至少發現,當在進程上運行 strace 時,它們開始看起來很正常,然後當它們像上面描述的那樣變得瘋狂時,這只是不間斷的洪水般的clock_gettime(CLOCK_REALTIME, {1518938625, 9566131}) = 0呼叫。就像我說的那樣,正常的過程不會不斷地吐出東西,例如,僅當有網路請求進入時,但隨後某些東西會觸發它,然後它就會變得瘋狂,直到我終止該過程,或重新啟動乘客,或重新啟動伺服器。然後在一兩個小時內又出現問題。

我已經花了幾天時間照顧它,不停地重新啟動東西以使其保持一瘸一拐的狀態,但我迫切需要一些想法。我注意到一些非常舊的帖子,例如 2013 年的帖子,討論了與 Clock_gettime 相關的 100% cpu 問題,並且我已經嘗試了與我見過的幾篇帖子相關的兩個建議。一個是設定 TZ 變量,另一個是修復某種閏秒錯誤。我不明白所提議的修復背後的原因,但遺憾的是它們沒有起作用。

我正在運行以下堆疊: ruby​​ 2.2.0 Passenger 獨立版:Gem 版本:4.0.58(並嘗試在一個伺服器上升級到 5.2.0,行為沒有變化) MySQL CentOS 6.9

相關內容