2011-06-26 98 views
25

我試圖在Nginx和其他一些程序上運行一個小型VPS(512MB RAM)上的RabbitMQ。我已經能夠毫無困難地調整所有其他內存使用情況,但我似乎無法讓RabbitMQ使用更少的RAM。降低RabbitMQ內存使用率

我想我需要減少線程二郎用來RabbitMQ的數目,但我沒有能夠得到它的工作。我還嘗試將vm_memory_high_watermark設置爲低於默認值(40%)的幾個不同值,即使低至5%也是如此。問題的

部分可能是,VPS提供商(MEDIATEMPLE)讓我去了我分配的內存,因此,使用免費或頂部時,它表明服務器有大約900MB。

任何建議通過的RabbitMQ來減少內存使用量,或限制二郎將創建的線程數?我相信Erlang正在使用30個線程,基於我在進程命令中看到的-A30標誌。

理想情況下,我希望RabbitMQ mem的使用率低於100mb。

編輯:

隨着vm_memory_high_watermark設置爲5%(或在配置文件中0.05),在RabbitMQ的日誌報告的RabbitMQ的內存限制設置爲51MB。我不確定51mb是從哪裏來的。當前VPS分配的內存爲924mb,因此5%應該在46mb左右。

根據HTOP /免費啓動的RabbitMQ之前,我坐在各地使用的RAM 453mb,並開始後的RabbitMQ我在周圍650MB。增加近200mb。難道200mb是RabbitMQ的下限嗎?

編輯2

的ps aux的Here are some screenshots和自由前和開始的RabbitMQ和表示開始的RabbitMQ當存儲器尖峯圖形之後。

編輯3

我也沒有插件檢查啓用,這使差別很小。看起來我擁有的插件(管理及其先決條件)僅添加了大約8mb的RAM使用量。

編輯4

我不再有這樣的服務器進行測試,然而,有一個CONF設置,設置爲16默認據我所知delegate_count,這產卵16燮proc for rabbitmq。在較小的服務器上降低此數量可能有助於減少內存佔用量。不知道這是否真的有效,或者它如何影響性能,但這是可以嘗試的。

回答

9

適當的方式在RabbitMQ的內存使用情況是使用vm_memory_high_watermark限制。你說:

我也試過 vm_memory_high_watermark設置爲默認(的 40%)以下幾 不同的值,甚至低至5%。

這個應該工作,但它可能不會像你期望的那樣行事。在日誌中,你會發現一條線,告訴你絕對內存限制是什麼,這樣的事情:

=INFO REPORT==== 29-Oct-2009::15:43:27 === 
Memory limit set to 2048MB. 

您需要調整爲所需的內存限制 - 兔子可能會看到您的系統爲具有如果您在VPS環境中運行,則會有比您想象的更多的RAM。

有時候,兔子不知道你在使用什麼系統,並且使用1GB作爲基點(所以默認情況下你得到了410MB的限制)。

此外,請確保您運行的是支持vm_memory_high_watermark設置的RabbitMQ版本 - 理想情況下,您應該使用最新的穩定版本運行。

+0

當我使用'vm_memory_high_watermark'時,它報告日誌中的正確內存限制(基於VPS的實際900mb,而不是我購買的512mb)。設置爲5%時,日誌顯示爲45mb,但每個產生的erlang進程使用20到25mb的內存,這很快使我超過了我的512mb分配。 –

+0

當你說'每個erlang進程'是你的意思,OS erlang進程還是erlang內部進程? –

+0

當我運行htop時,我看到大約30個'/usr/lib/erlang/erts-5.7.4/bin/beam.smp -W w -K true -A30 -P 1048576',然後是一些與RabbitMQ相關的標誌和Mnesia的。 –

1

確保設置適當的QoS預取值。默認情況下,如果有一個客戶端,Rabbit服務器會將它擁有的用於該客戶端隊列的消息發送給客戶端。這導致在服務器上的客戶端&上廣泛的內存使用。

將預取限制降到合理的數值,比如說100,Rabbit會將剩餘的消息保留在服務器上的磁盤上,直到客戶端真的準備好處理它們,並且您的內存使用率將會降低客戶端&服務器。

請注意,100的建議只是一個合理的開始 - 它肯定會跳動無窮大。要真正優化這個數字,您需要考慮您的客戶端能夠處理的消息/秒數,網絡延遲時間以及每條消息平均有多大。