我正在测试rabbitMQ,芹菜设置。Rabbitmq内存控制,队列已满并且不是分页。连接挂起
在当前的设置中有一个jobqueue(2GB RAM,65GB HD),只有一个工作人员将大量消息推送到队列中(稍后我们将添加一堆工作人员)。当jobqueue达到大约1100万条消息时,连接挂起(很确定这是blocking
由于基于内存的流量控制,如http://www.rabbitmq.com/memory.html)。但连接永远挂起,永远不会关闭连接,也不会分页到磁盘。这是不受欢迎的行为 - 导致芹菜工人变成僵尸过程。
在考虑系统可能实际需要的总大小时 - 我们希望队列能够承载10000次这样的负载 - 总共最多约300亿条消息在队列中一次。
下面是一些相关设置:
{vm_memory_high_watermark,0.8},
{vm_memory_high_watermark_paging_ratio,0.5}]
最初,我们改变了vm_high_watermark从1.4至2.8,这使得在队列中更多的消息,但仍然不够。
我们正在考虑当然系统在某些时候需要更多的RAM,虽然在这之前我们想了解当前的问题以及如何处理它。
现在,队列中只有11m任务,它使用2GB RAM的80%,整个系统只使用8GB的磁盘。考虑到我们将vm_memory_high_watermark
设置为.8,内存使用情况很有意义。尽管如此,磁盘使用对我来说毫无意义 - 并且表明分页没有发生。为什么不让RabbitMQ分页到磁盘以便让队列增长更多?虽然明显放慢了队列机器的运行速度,但这样可以避免死机 - 并且看起来像是理想的回退行为。 AFAIK这确实是整个分页的重点。
其他说明:
我们确认,连接吊,从那时起已在事实上被封锁41小时(通过检查rabbitmqctl report
的连接部分)。根据http://www.rabbitmq.com/memory.html这意味着“流量控制正在发生”。问题是 - 为什么不是将消息分页到磁盘?
其他详情:
的Ubuntu 12.04.3 LTS
的RabbitMQ 3.2.2,二郎R14B04
芹菜3.0.24
的Python 2.7.3
寻呼阈值如何?如果按照https://www.rabbitmq.com/memory.html命中寻呼阈值,RMQ是否会将队列分出来,是否持久? – mhamrah
@mhamrah是的,如果RabbitMQ正在遭受内存压力,那么即使这些消息最初没有设置为持久性,它也会尝试将内容分页排队。 –