2011-08-29 58 views
4

我正在使用resque gem來處理我的後臺進程。rails resque工作內存消耗

我已經爲每個工作人員設置了三個隊列。

任何人都可以解釋內存如何隨着隊列中工作人員的增加和減少而消耗掉。

我聽說每個工作人員加載單獨的Rails環境。真的嗎?

回答

2

據我所知,是的,每個工人都會啓動一個單獨的Rails環境,所以如果你有三個工人,你將會加載三個Rails環境。 擁有更多的員工不會讓你的隊伍變得更長,而是排隊等候的崗位數量。無論哪種方式,如果您沒有任何主要原因需要3個獨立的工作人員,那麼我建議您只有一個工作人員適用於所有隊列,並隨着您的應用程序隨時間變化將其分開。

+1

Resque不會加載rails環境,事實上不加載rails和低內存消耗正是主要項目的目標。看到這裏:https://github.com/blog/542-introducing-resque –

+0

@HenryMazza是的,它會加載Rails環境。運行Resque進程,然後更改應用程序代碼(更新工作人員),觸發工作人員並觀看Resque運行舊代碼。這就是爲什麼當您部署更改時,您必須重新啓動Resque進程。 –

-3

這是不正確的。正如我在我的評論中解釋的那樣,Resque的確切目標不是爲每個工作人員加載圍欄環境(請參閱https://github.com/blog/542-introducing-resque)。

由於ruby的綠色trheading解決方案造成的限制,您應該爲每個處理器內核至少啓動一個worker,以便能夠使用整個CPU。這就是爲什麼Resque的默認行爲是在單獨的進程中啓動每個工人。它意味着同時啓動N個並行進程,每個進程都獨立加載完整的寶石集。這是Resque和任何其他Ruby工具高內存使用的主要原因。您可以看到here使用JVM的本地線程可以讓事情變得更好。

因此,如果您希望保持您的Resque內存使用率,請儘可能降低您的員工依賴性。使用像God或Bluepill這樣的監控工具來關注整個過程始終是非常重要的。

+1

我認爲你讓工作人員感到困惑。當然,Resque不會爲每項工作加載環境,但它對每個工作人員都是如此。新作業排隊時進行什麼操作可以分散工作進程,因此無需再次加載環境,並且確保主作業進程在作業失敗時不會掛起。 – cicloon

+3

要澄清這一點,請查看Resque的自述文件:默認情況下,Resque將不知道您的應用程序的環境。也就是說,它將無法找到並運行你的工作 - 它需要將你的應用程序加載到內存中。 如果我們已經安裝Resque作爲一個Rails插件,我們可以從我們的RAILS_ROOT運行此命令: $ QUEUE = file_serve耙環境resque:「在默認情況下Resque不會知道你的應用程序的環境」工作 – cicloon

+0

- 它不會加載,除非你告訴它。如果你關心內存消耗,你不應該使用「環境」。例如,如果您將運行4個「環境」工作人員,它將在內存中加載4次導軌。 所以,如果你讓你的代碼欄依賴這是你的錯,而不是他們的錯。即使如此,您可以優化,如只加載活動記錄,如果你想要的是做數據庫作業。在我的日常使用中,一名工作人員從未使用超過20MB的空閒空間,並加載了所有的庫。單獨的Rails超過60MB。 –