RabbitMQ +内存限制

Tam*_*mil 14 memory memory-management rabbitmq

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

[{rabbit, [{vm_memory_high_watermark, 0}, 
           {disk_free_limit, {mem_relative, 1.0}}
          ]
}]
Run Code Online (Sandbox Code Playgroud)

这个配置是什么意思?

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

16720 rabbitmq  20   0  142m  62m 2408 S    0  **1.6**   0:06.88 beam.smp
Run Code Online (Sandbox Code Playgroud)

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

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

kzh*_*hen 16

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

如果您看一下Memory流量控制,您会在"基于内存的流量控制"标题下看到它:

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.