跳到主要内容
版本:4.1

内存警报阈值

概述

本指南涵盖 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 代表拍比字节

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

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

© . All rights reserved.