Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RabbitMQ内存使用率逐渐上升并阻止调用。。。为什么?_Rabbitmq - Fatal编程技术网

RabbitMQ内存使用率逐渐上升并阻止调用。。。为什么?

RabbitMQ内存使用率逐渐上升并阻止调用。。。为什么?,rabbitmq,Rabbitmq,我正在使用RabbitMQ处理应用程序日志(windows server 2008安装)。应用程序向exchange发送消息。我有一个专用队列,可以将消息转发给它。然后,我有一个windows服务连接到该队列,提取消息,并将它们持久化到DB。我有n个客户端实时连接到exchange以锁定流,因此一次有n个连接。这些客户机中的一些可能无法在代码中关闭它们的连接。许多客户端都有长时间运行的连接 当消息从队列中拉出时,它们会自动确认,因此队列中没有任何未确认的消息。然而,我看到兔子的记忆随着时间的推移

我正在使用RabbitMQ处理应用程序日志(windows server 2008安装)。应用程序向exchange发送消息。我有一个专用队列,可以将消息转发给它。然后,我有一个windows服务连接到该队列,提取消息,并将它们持久化到DB。我有n个客户端实时连接到exchange以锁定流,因此一次有n个连接。这些客户机中的一些可能无法在代码中关闭它们的连接。许多客户端都有长时间运行的连接

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

我有.NET和Java客户端,但都是自动确认的

阅读文档时,我没有看到任何关于兔子如何使用内存的描述——也就是说,我不明白为什么内存会随着时间的推移而膨胀。这些消息正在被删除和确认,在我看来,这意味着兔子将不再持有它,从而可以释放相关的内存,从而产生稳定的内存使用情况

我也看不出摆弄记忆拨入兔子会有多大帮助——随着时间的推移,它的使用率会逐渐上升:最终我会超过它

我的猜测是,我对我的客户做了一些错事,导致记忆随着时间的推移而增长,但我想不出为什么会这样

 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?

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

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

确保将QoS预取限制设置为更合理的值,例如100。这样,如果您有1M条消息,并且只有一个预取为100的客户机,Rabbit将只向客户机发送100条消息,并将其他999900条消息保留在服务器上的磁盘上,而不使用几乎同样多的内存


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

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

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

确保将QoS预取限制设置为更合理的值,例如100。这样,如果您有1M条消息,并且只有一个预取为100的客户机,Rabbit将只向客户机发送100条消息,并将其他999900条消息保留在服务器上的磁盘上,而不使用几乎同样多的内存


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

@metaforge:谢谢你的建议。不,那不会发生。@metaforge:谢谢你的建议。不,那不会发生。