RabbitMQ + 内存限制

19

我只是在查看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
无论何时我们将消息发送到代理时,都会看到此进程的内存使用量增加。那么,即使将水印设置为0,这是否意味着消息仍在内存中?我们很想知道,如果RAM的内存限制达到并且仍在发送消息,会发生什么? 发布者被阻止吗? 还是如果可用,则将消息交换到磁盘上?
1个回答

21

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

如果您查看内存流控制,您会看到在“基于内存的流控制”标题下的说明:

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

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

另一个重要的注意事项:

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

因此,如果在引发警报后尝试发布消息,则发布者将被阻止发送消息。

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

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


是的,我已经阅读了那份文档。你所说的“被限流[可能会丢失一定比例的消息]”和“被阻塞[无法发送任何消息]”是什么意思?如果我指定为0%,那么应用程序启动时警报应该立即开启,对吧?然后所有发布者的消息都应该被阻止,对吧?或者被限流?如果我完全禁用基于内存的流控制[0%]会发生什么? - Tamil
1
在这种情况下,进行限流将导致发布者完全被阻止(因为警报已被触发)。 如果您指定0%,那么对了,警报将被触发并且所有发布者都将被阻止。 如果要禁用基于内存的流量控制,请将值设置为100,而0将会阻止所有东西。 - kzhen
实际上我们只是运行了基本的发送者示例,发现消息已经被发送,但现在我们注意到消息没有被接收。因此,作为整体,我们应该有一些RAM内存用于消息,以便rmq可以至少将需要交换到磁盘的消息进行交换。 - Tamil
1
将vm_memory_high_watermark设置为100。这不应该是1吗?因为它是分数。 - dmourati
@dmourati是正确的,它应该设置为1才能等同于100%。所以如果你希望保留它但是在较低的数量,比如说90%,那么这个值应该是0.9 - Hassek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接