2009-12-05 46 views
2

我在我們的服務器上使用ejabberd + mochiweb。我保持ejabberd和mochiweb運行的時間越長,消耗的內存就越多(昨晚它消耗了35%的內存,現在略高於50%)。我認爲這只是一個mnesia垃圾回收問題 - 所以我安裝了Erlang R13B3並重新啓動了ejabberd。這雖然沒有解決它。Ejabberd內存消耗(或泄漏?)

所以我注意到,現在在位全內存消耗的50%以上,它看起來像ejabberd的開始「放手」的記憶,留在50%左右。這是正常的嗎?爲〜50%ejabberd閾值,這樣,當它到達它,它說,「哎時候居然讓一些記憶去......」,也許它保留其餘各地的快速訪問(比如緩存的Mnesia?)

我很欣賞任何輸入。謝謝!

回答

1

事實證明,有(耶!)Ejabberd佔用了唯一< 40MB沒有內存泄漏。最後,當我看到EngineYard上的使用圖時,我看到了燈光 - 實際上只有288MB被使用,550MB正在被緩衝,而175MB被緩存。我的ejabberd服務器每隔2.5秒從每個客戶端更新一次,這樣可以解釋爲什麼這麼多內容正在被緩衝/緩存。

感謝您的幫助。

1

每隔一段時間在shell中運行erlang:memory().。您也可以嘗試使用allocated_areasallocator來給erlang:system_info(Type).。 這些應該給你一個什麼樣的內存泄漏提示。

您還可以設置memsup要提醒你分配了太多的記憶過程。在Erlang進程

+0

erlang:memory()顯示我使用〜30MB。 (現在頂部顯示〜1.0GB)。我注意到,在今天的某個時刻,內存「刷新」了下來,大約300MB被釋放了。我不知道這個內存在哪裏,但是我認爲ejabberd/erlang可以在需要時以某種方式釋放它。 難道這也是因爲我在Erlang R13B03上運行ejabberd 2.1.0? – ewindsor 2009-12-07 06:15:18

+0

更正:頂部顯示使用的TOTAL內存約1.0GB,但erlang僅使用1.7GB的2.0%。 TOP中的數字不加起來。我沒有必要重置ejabberd,並且總內存似乎不會超過1.0GB。 (它波動〜20MB)。 我有2個進程執行每分鐘來「清理」和「重組」的東西。我讀到,ejabberd只在閒置3分鐘時纔在某些進程上進行休眠。這可能與它有關嗎? – ewindsor 2009-12-07 08:45:56

0

新創建的原子得到從未垃圾收集。這可能是一個問題,當進程由一個算法註冊時,該算法從隨機創建原子名稱。隨機創建字符串。

+2

完整的原子表會殺死虛擬機,所以會有一個清楚的跡象表明這一點。 – Zed 2009-12-06 16:38:05