我只是在查看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的内存限制达到并且仍然发送消息会发生什么?发布商是否被封锁?或者如果可用,消息将被换出到磁盘?
答案 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。