内存告警阈值
概述
本指南介绍 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
支持的十进制(10 的幂)内存信息单位是
GB表示千兆字节(1000^3 或 10^9 字节)千兆字节MB表示兆字节(1000^2)TB表示太字节(1000^4)PB表示拍字节
支持的二进制(2 的幂)内存信息单位是
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
vm_memory_high_watermark.relative = 0.6
默认值 0.6 代表可用(检测到的)RAM 的 60%。
更新运行中节点的内存阈值
在代理运行时,可以使用
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 集群运算符会自动配置内存限制。使用该运算符是在 Kubernetes 上运行 RabbitMQ 的推荐方式。
当 RabbitMQ 节点在容器中运行时,其检测可用内存量的能力将取决于外部因素:所用运行时的版本、操作系统版本和镜像使用的设置、cgroups 的版本以及最终 Kubernetes 的版本。
这意味着在容器化环境中,最佳选择是配置绝对内存限制。
另一个 Kubernetes 特定的内存占用方面是如何处理操作系统管理的内核页面缓存,特别是在使用 streams 和 super streams 的集群中。
如何暂时停止所有发布
当阈值或绝对限制设置为 0 时,内存告警会立即触发,最终会阻止所有发布连接。如果您想全局禁用发布,这可能很有用
rabbitmqctl set_vm_memory_high_watermark 0
有限的地址空间
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 设置为您系统上实际可用的内存量。然后 vm_memory_high_watermark.relative 将相对于 total_memory_available_override_value 中设置的值进行计算。
有关推荐 RAM 水位线设置的指南,请参阅部署指南。