17

我只是在查看 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 的内存限制达到并且仍在发送 msgs 会发生什么?要么发布者被阻止?或者如果可用,消息会被换出到磁盘?

4

1 回答 1

18

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

如果你看一下内存流控制,你会看到它在“基于内存的流控制”标题下说:

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。

于 2012-08-29T10:48:55.563 回答