内存警报阈值
概述
本指南涵盖 RabbitMQ 内存阈值(水位线)设置。它附带了一些密切相关的指南
内存阈值:它是什么以及如何工作
可以为 RabbitMQ 节点提供内存占用限制提示。如果节点的内存占用量超过该值,则会在此节点以及最终所有其他集群节点上触发资源警报,以阻止发布者。
该限制可以配置为绝对值或相对值。在后一种情况下,RabbitMQ 将尝试在启动时以及执行 rabbitmqctl set_vm_memory_high_watermark value
时检测可供其使用的总 RAM 量。
默认情况下,包括如果未配置限制提示,RabbitMQ 节点将使用大约 60% 的可用 RAM,它会引发内存警报,并将阻止所有正在发布消息的连接。一旦内存警报清除(例如,由于将一些消息传递给使用并确认交付的客户端),正常服务将恢复。
该限制不会阻止 RabbitMQ 节点使用超过计算出的限制,它仅仅是发布者受到限制的点
配置内存限制(或阈值)
绝对内存限制
强烈建议在 Kubernetes 等容器化环境中使用绝对内存阈值。RabbitMQ 节点并不总是能够检测到有效的 cgroups 限制
可以通过设置节点使用的 RAM 的绝对限制来调整内存阈值。以下示例将阈值设置为 1073741824 字节(1024 MiB)
vm_memory_high_watermark.absolute = 1073741824
相同的示例,但使用内存单位
vm_memory_high_watermark.absolute = 1024MiB
vm_memory_high_watermark.absolute = 4Gi
vm_memory_high_watermark.absolute = 1Ti
支持的十进制(十的幂)内存信息单位为
GB
代表千兆字节(1000^3 或 10^9 字节)MB
代表兆字节 (1000^2)TB
代表太字节 (1000^4)PB
代表拍字节
支持的二进制(二的幂)内存信息单位为
Gi
代表吉比字节(1024^3 或 2^30 字节)Mi
代表兆比字节 (1024^2)Ti
代表特比字节 (1024^4)Pi
代表拍比字节
Gi
代表吉比字节(1024^3 或 2^30 字节)Mi
代表兆比字节Ti
代表特比字节Pi
代表拍比字节
如果绝对限制大于已安装的 RAM 或可用的虚拟地址空间,则阈值将设置为较小的限制。
内存限制在 RabbitMQ 节点启动时会附加到日志文件中
2023-06-10 23:17:05.976 [info] <0.308.0> Memory high watermark set to 1024 MiB (1073741824 bytes) of 8192 MiB (8589934592 bytes) total
也可以使用 rabbitmq-diagnostics memory_breakdown
和 rabbitmq-diagnostics status
命令查询内存限制。
相对内存阈值
不建议在 Kubernetes 等容器化环境中使用相对内存阈值。请优先使用绝对阈值。
可以通过编辑配置文件来调整触发流量控制的内存阈值。
以下示例将阈值设置为默认值 0.6
# new style config format, recommended
vm_memory_high_watermark.relative = 0.6
默认值 0.6 代表可用(检测到的)RAM 的 60%。
在运行的节点上更新内存阈值
可以在 Broker 运行时使用以下命令更改阈值
rabbitmqctl set_vm_memory_high_watermark <fraction>
命令或
rabbitmqctl set_vm_memory_high_watermark absolute <em><memory_limit></em>
例如
rabbitmqctl set_vm_memory_high_watermark 0.7
和
rabbitmqctl set_vm_memory_high_watermark absolute "4G"
有关支持的内存信息单位,请参阅绝对阈值
这两个命令都将在节点停止之前生效。要使设置在节点重启后仍然有效,请改用配置设置。
当执行此命令而不更改阈值时,由于查询了系统 RAM 的总量,因此在具有热插拔 RAM 的系统上,内存限制可能会发生变化。
在容器和 Kubernetes 中运行 RabbitMQ
用于 Kubernetes 的 RabbitMQ 集群 Operator 会自动配置内存限制。使用 Operator 是在 Kubernetes 上运行 RabbitMQ 的推荐方式。
当 RabbitMQ 节点在容器中运行时,它检测可用内存量的能力将取决于外部因素:使用的运行时版本、OS 版本和镜像使用的设置、cgroups 版本以及最终 Kubernetes 版本。
这意味着在容器化环境中,最佳选择是配置绝对内存限制。
另一个 Kubernetes 特有的内存占用方面是 OS 管理的内核页缓存,尤其是在使用流和超级流的集群中。
如何暂时停止所有发布
当阈值或绝对限制设置为 0
时,它会使内存警报立即触发,从而最终阻止所有发布连接。如果您希望全局停用发布,这可能很有用
rabbitmqctl set_vm_memory_high_watermark 0
有限的地址空间
::: danger RabbitMQ 仅面向 64 位操作系统和 64 位 Erlang 运行时 :::
RabbitMQ 仅面向 64 位操作系统和 64 位 Erlang 运行时。
当在 64 位操作系统(或带有 PAE 的 32 位操作系统)中的 32 位 Erlang VM 中运行 RabbitMQ 时,可寻址内存受到限制。服务器将检测到这一点并记录类似如下的消息
2018-11-22 10:44:33.654 [warning] Only 2048MB of 12037MB memory usable due to limited address space.
无法识别的平台
如果 RabbitMQ 服务器无法检测到它正在运行的操作系统,它会将警告附加到日志文件中。然后它假设已安装 1GB RAM
2018-11-22 10:44:33.654 [warning] Unknown total memory size for your OS {unix,magic_homegrown_os}. Assuming memory size is 1024MB.
在这种情况下,将 total_memory_available_override_value
设置为系统上实际可用的内存量。然后将相对于 total_memory_available_override_value
中设置的值计算 vm_memory_high_watermark.relative
。
有关推荐的 RAM 水位线设置的指南,请参阅部署指南。