RabbitMQ +内存限制

时间:2012-08-29 09:50:03

标签: memory memory-management rabbitmq

我只是在查看RabbitMQ的配置细节并且遇到了

[{rabbit, [{vm_memory_high_watermark, 0}, 
           {disk_free_limit, {mem_relative, 1.0}}
          ]
}]

这个配置是什么意思?

vm_memory_high_watermark设为0表示=> Rabbitmq应用程序启动后立即阻止所有发布者?但我们仍然看到rabbitmq能够排队我们发送的任何消息。

16720 rabbitmq  20   0  142m  62m 2408 S    0  **1.6**   0:06.88 beam.smp

每当我们向代理发送msgs时,我们都会将此进程的内存使用量增加。那么,这是否意味着msgs在内存中虽然水印设置为0?

我们很想知道如果RAM的内存限制达到并且仍然发送消息会发生什么?发布商是否被封锁?或者如果可用,消息将被换出到磁盘?

1 个答案:

答案 0 :(得分:16)

vm_memory_high_watermark是一个百分比值,与RabbitMQ中的内存流控制有关。

如果您查看Memory flow control,您会看到它在“基于内存的流量控制”标题下显示:

  

RabbitMQ服务器在启动时以及执行rabbitmqctl set_vm_memory_high_watermark fraction时检测计算机中安装的RAM总量。默认情况下,当RabbitMQ服务器使用超过40%的已安装RAM时,它会引发内存警报并阻止所有连接。一旦内存警报清除(例如由于服务器将消息分页到磁盘或将其发送到客户端),正常服务将恢复。

因此,通过将此值设置为0,当然它会立即触发!如果您希望允许RabbitMQ使用更多内存,那么您将需要增加该值。

另一个重要的注意事项:

  

默认内存阈值设置为已安装RAM的40%。请注意,这不会阻止RabbitMQ服务器使用超过40%,这仅仅是发布者受到限制的点。

因此,如果您在发出警报时尝试发布消息,那么您的发布商将无法发送消息。

如果要阻止所有发布者,则将vm_memory_high_watermark设置为0.如果要“禁用”基于内存的流量控制,请将vm_memory_high_watermark设置为100.请参阅上面的详细信息链接:

  

值为0会使内存警报立即关闭,从而禁用所有发布(如果您希望全局禁用发布,这可能很有用;请使用rabbitmqctl set_vm_memory_high_watermark 0)。为防止内存警报完全消失,请设置一些高倍数,例如100。