跳至主内容
版本:4.2

内存告警阈值

概述

本指南介绍 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 表示拍比字节

还支持 Kubernetes 风格的信息单位

  • 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_breakdownrabbitmq-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 水位线设置的指南,请参阅部署指南

© . This site is unofficial and not affiliated with VMware.