RabbitMQ内存使用量逐渐上升并阻止呼叫......为什么?

时间:2012-10-26 21:01:45

标签: rabbitmq

我正在使用RabbitMQ来处理应用程序日志(Windows Server 2008安装)。应用程序向交易所发送消息。我有一个专门的队列,可以将消息转发给它。然后我有一个连接到该队列的Windows服务,关闭消息,并将它们保存到DB。我有n个客户端实时连接到交换机以锁定流,因此一次有n个连接。其中一些客户端可能无法在代码中关闭()它们的连接。许多客户都有长期的联系。

当消息从队列中拉出时,它们是自动确认的,因此队列中没有任何未确认的消息。然而,我看到兔子的记忆随着时间的推移而增长。它在第一次打开时从32K左右开始然后爬升直到超过阈值并阻止传入连接。

我有.NET和Java客户端 - 但都是auto-ack。

阅读文档,我没有看到有关Rabbit如何使用内存的任何描述 - 即。我不明白为什么随着时间的推移记忆会膨胀。这些消息正在被取消,并且在我看来这意味着Rabbit不会再持有它,因此可以释放相关的内存,从而导致稳定的mem使用情况。

我不知道如何摆弄Rabbit中的记忆拨号也会有所帮助 - 随着时间的推移,使用只是向上爬行:最终我会超过它。

我的猜测是,我的客户出现了一些问题,导致内存随着时间的推移而增长,但我想不出为什么会这样。

 why does Rabbit memory usage creep up when no messages are kept on any queues? 

 what coding practices could cause the RabbitMQ server to 
 retain (and grow) memory?

1 个答案:

答案 0 :(得分:1)

是否有可能将其他队列绑定到交换机?检查交换下的Rabbit管理页面,单击您的交换机,并检查绑定到它的队列。可能是您的一个客户在声明交换时无意中将未命名的(系统随机命名的)队列绑定到交换机,并且消息堆积在那里。

要检查的另一件事是QoS设置 - 如果您将QoS设置为默认值(无限),那么Rabbit将立即向任何客户端发送消息,无论他们已经拥有多少消息。这导致了大量的簿记,例如哪个客户端在服务器上有哪个消息,以及客户端上的大缓冲区。

确保将您的QoS预取限制设置为更合理的内容,例如100。这样,如果您有1M消息且只有1个预取为100的客户端,Rabbit将仅向客户端发送100并保持服务器上的其他999900磁盘,并没有使用几乎相同的内存。

这是我的应用程序内存膨胀的一个重要原因,现在我已经解决了预取问题,一切都很好。