2013-04-24 82 views
2

我遇到了rabbitmq 2.8.5的問題。有3個消息發佈到隊列中,消費者相對較快地消費它們。所以排隊並不大。 每個隊列有3個交換。 但是rabbitmq上的內存在不斷增長。RabbitMQ內存使用增長過高

我試着運行兩個不同的命令來了解內存發生了什麼,但是當我運行它時,rabbitmq會掛起。

rabbitmqctl eval '[[{pid, R}, M | process_info(R)] || {M, R} <- 
lists:sublist(lists:reverse(lists:sort([{process_info(P, memory), P} || 
P <- erlang:processes()])), 10)].' 

'lists:sublist(lists:reverse(lists:sort([{process_info(Pid,memory), Pid, 
sys:get_status(Pid,infinity)} || Pid <- [element(7, Q) || Q <- 
rabbit_amqqueue:list()]])), 10).' 

然後我試着觀察到的RabbitMQ是在其上運行的虛擬機二郎內存使用,它9235(我認爲它以字節爲單位)。

因此,如果隊列和交流不是很大,而且Erlang Ram遠低於rabbitmq,那麼原因可能是什麼?

隨着內存使用量的持續增長,它最終會達到最大內存水印並且不會再發布。

+0

在消費者獲取消息之前,檢查消息大小和消息在隊列中消耗的時間。另外,你用什麼技術來獲取消息:'polling'或'subscription'?如果您的中間件中的進程正在輪詢消息的服務器,那麼根據輪詢速率和輪詢線程的數量,RABBITMQ將接受許多傳入請求,因此與訂閱技術相比使用大量內存。通過用戶,我們注意到RABBITMQ使用的資源較少。 – 2013-04-25 06:47:23

+0

消費者是基於訂閱的。但即使是這種情況,我會懷疑當流量低時,我的內存應該會縮小,但是它的大小不會減小。 – sqwale 2013-05-10 11:26:19

+0

現在,我認爲'RABBITMQ'使用了一些'disc_copies' mnesia表。另外,它取決於消息傳遞技術。如果消息的接收者不爲他們發送「ACK」,我想'RABBITMQ'會在數據庫中保留一個副本。確保收到的每條消息都發送一個「ACK」。那麼,你的隊列是否「耐用」呢?消息「持久」還是交換「持久」?你看,'RABBITMQ'有很多概念。試試這個,讓消息和隊列「不耐用」,並確保每條消息都有一個「ACK」發送給它。你有多少「交流」或「排隊」? – 2013-05-10 16:10:29

回答

0

也許你應該檢查你的每郵件大小作爲有效載荷。所有消息將被存儲在內存中。

如果太大,最好重新設計消息。

+1

消息並不大。即使隊列空了,內存仍然是曾經的。即我的RAM永遠不會縮小,只能增長。 – sqwale 2013-05-10 11:24:25