这篇文章翻译自: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。
关键字: memory alarm rabbitmq 内存警报 内存阈值
发表评论
相关文章
国内AI资源汇总,AI聊天、AI绘画、AI写作、AI视频、AI设计、AI编程、AI音乐等,国内顺畅访问,无需科学上网。
扫码或点击进入:萤火AI大全
文章分类
最新评论