2017-06-03 75 views
3

我們運行紅寶石請求時,有很多免費的堆插槽

  • Sidekiq 4.2.9
  • 軌4.2.8
  • MRI 2.1.9

這是一個服務器更多的內存服務器定期從外部API中產生一定量的導入,對它們執行一些計算並將這些值保存到數據庫中。

大約3個星期前,服務器開始掛起,就像我從NewRelic看到的那樣(當ssh發現它時) - 它隨着時間消耗越來越多的內存,最終佔用所有可用內存,然後掛起服務器。爲什麼在~5:30 AM堆大小從〜2.3M跳到3M時,仍然有1M空閒堆插槽可用(GC設置爲默認)

enter image description here

類似的行爲,3:35 PM: enter image description here

所以,問題是:

  1. 如何讓Ruby填充空閒堆槽而不是從操作系統請求新插槽?
  2. 如何讓它釋放免費的堆槽到系統?
+0

值得一讀:https://blog.heroku.com/incremental-gc – Anthony

+0

你使用什麼服務器?美洲獅?獨角獸?瘦?生產中的webrick? –

+0

@JoshBrody,我們的Puma服務器很好,我說的是sidekiq服務器 –

回答

3

如何讓Ruby填充空閒堆槽而不是從操作系統請求新插槽?

您的圖形沒有「完整」保真度。假設GC.stat是由Newrelic調用的,或者恰好在恰當的時候調用了很多。

這是非常可能的,你跑完槽,堆增長,因爲堆不縮小在Ruby中,你有一個有點臃腫的堆堅持。

爲了減輕一些痛苦,你可以將RUBY_GC_HEAP_GROWTH_MAX_SLOTS限制爲一個合理的數字,比如100,000這樣做,我試圖遊說在覈心設置默認值。

而且

  • 創建的運行時間,他們跑(持續時間等)工作的一個持續日誌,之前收集GC.stat和作業後運行

  • 由分散你的工作隊列,運行1隊列中的服務器和其他排隊的另一個上,看哪個隊列和工作是負責這個問題你已經使用flamegraph

  • 簡介各種工作或其他分析工具

  • 減少作爲實驗運行的併發作業數量,或者在特定作業類型之間放置互斥量。有可能一次「工作一次」是好的,而一次20個併發的「工作」會使內存膨脹。

+0

謝謝,會試試看寫結果 –

+0

一定要升級到ruby 2.4之前的東西,有很多gc bugs全部高達2.3的方式可能會導致無保證的增長。 –