波斯马BOSSMA Information Technology

RabbitMQ内存警报

发布时间:2017年9月28日 / 分类:RabbitMQ / 10,119 次浏览 / 评论

这篇文章翻译自:http://www.rabbitmq.com/memory.html

当RabbitMQ Server启动时,以及命令rabbitmqctl set_vm_memory_high_watermark fraction 被执行时,RabbitMQ会检测机器安装的内存。默认情况下,当RabbitMQ Server使用内存超过机器内存的40%时,他会触发一个内存报警,同时阻塞所有发布消息的连接。一旦内存警报被清除(例如:由于消息被写入到硬盘或者被只有消费者的客户端消费),服务就会恢复正常。

默认的内存阈值是内存的40%。但是需要注意这不会阻止RabbitMQ Server使用超过40%的内存,这仅仅是生产者被阻塞的一个点。当Erlang垃圾回收运行时,最坏的情况下,会导致使用双倍的内存(默认情况下,是内存的80%)。因此强烈建议启用操作系统交换文件或分页文件。

32位架构下通常每个进程的内存限制是2G,64位架构的常见实现能轻易的达到每个进程256TB。64位的Windows进一步限制为8TB。需要注意的是,在64位操作系统中,1个32位的进程也通常只有2GB最大地址空间。

配置内存阈值

内存阈值可以通过编辑配置文件进行调整。下边这个例子设置阈值为默认的0.4:

[{rabbit, [{vm_memory_high_watermark, 0.4}]}].

默认值0.4代表运行时内存的40%或者可用虚拟地址空间的40%中的最小者。例如,在32位平台,如果你有4GB的内存,4GB的40%是1.6GB,但是32位的Windows一般限制进程为2GB,所以这个阈值实际为2GB的40%,就是820MB。

此外,内存阈值也可以通过设置为一个内存的绝对值进行调整。下边的例子设置这个阈值为1073741824 字节(1024MB):

[{rabbit, [{vm_memory_high_watermark, {absolute, 1073741824}}]}].

相同的例子,但是使用不同内存单位:

[{rabbit, [{vm_memory_high_watermark, {absolute, "1024MiB"}}]}].

如果这个绝对值比内存和可用的虚拟地址空间都大,这个阈值就会设置为两者之间最小的那个。

当RabbitMQ Server启动时,这个内存限制会被追加到RABBITMQ_NODENAME.log日志文件中:

=INFO REPORT==== 29-Oct-2009::15:43:27 ===
Memory limit set to 2048MB.

这个内存限制可以通过rabbitmqctl status命令查询到。

这个阈值也可以在Broker运行时进行改变,使用rabbitmqctl set_vm_memory_high_watermark fraction命令或者rabbitmqctl set_vm_memory_high_watermark absolute memory_limit命令,内存单位也可以在这个命令中使用。这个命令产生的效果直到Broker关闭停止,相应的配置设置也将在当Broker重启时被更改。在一个支持内存热插拔的系统中,在阈值没有改变的情况下执行这个命令,实际的内存限制可能也会改变,因为每次执行都会查询系统内存的总量。

禁止所有发布

值0可以使内存警报立即触发,并因此禁止所有发布(这对于想全局禁止所有发布可能是有用的);使用命令:rabbitmqctl set_vm_memory_high_watermark 0

受限的地址空间

当RabbitMQ运行在一个64位操作系统(或者32位系统的PAE模式)的32位Erlang虚拟机中时,可用地址的内存是受限的。RabbitMQ Server将会检测到并记录日志类似如下:

=WARNING REPORT==== 19-Dec-2013::11:27:13 ===
Only 2048MB of 12037MB memory usable due to limited address space.
Crashes due to memory exhaustion are possible - see
http://www.rabbitmq.com/memory.html#address-space

内存警报系统并不是完美的。当停止发布消息以阻止更多的内存使用时,其它的某些情况也可能导致内存使用的继续增加。通常当这种情况发生,并且内存被耗尽时,操作系统将启动swap。但是当运行在一个受限的地址空间时,越过这个地址空间限制将导致Erlang虚拟机崩溃。

因此强烈建议在64位操作系统中使用64位的Erlang虚拟机。

配置分页阈值

在Broker达到阈值并阻止生产者之前,它会通过将队列数据分页到磁盘的方式,尝试释放一些内存。所有持久化和临时的消息都将被分页(尽管持久化的消息可能已经在磁盘上,但这里还将被移除内存)。

默认情况下,这发生在Broker已经使用阈值50%的内存时,例如在阈值为默认的0.4时,当使用了20%的内存时就会触发。要更改这个值,可以修改vm_memory_high_watermark_paging_ratio配置,例如:

[{rabbit, [{vm_memory_high_watermark_paging_ratio, 0.75},
 {vm_memory_high_watermark, 0.4}]}].

上边的配置将在内存使用达到30%时启动分页,在40%时阻塞生产者。

也可以设置vm_memory_high_watermark_paging_ratio的值大于1.0。在这种情况下,队列将不会分页数据到磁盘。如果这引起了内存警报的触发,生产者将会如上面所说的被阻塞。

无法识别的平台

如果RabbitMQ Server不能识别你的系统,它将会在RABBITMQ_NODENAME.log文件中追加一条警告记录。它将假设当前有1GB的物理内存。

=WARNING REPORT==== 29-Oct-2009::17:23:44 ===
Unknown total memory size for your OS {unix,magic_homebrew_os}. Assuming memory size is 1024MB.

在这种情况下,vm_memory_high_watermark配置的值将按照假设的1GB内存进行处理。当vm_memory_high_watermark设置为默认的0.4时,RabbitMQ的内存阈值将被设置为410MB,一旦RabbitMQ使用的内存超过410MB时,它将阻塞生产者。如果RabbitMQ不能识别你的平台,你实际有8GB内存,你想让Server使用的内存超过3G时才阻塞生产者,那么可以设置vm_memory_high_watermark的值为3。

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自波斯马,原文地址《RabbitMQ内存警报

关键字:

建议订阅本站,及时阅读最新文章!
【上一篇】 【下一篇】

发表评论