跳至主要内容
版本:4.0

内存警报阈值

概述

本指南介绍了 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%。

在运行的节点上更新内存阈值

可以在代理运行时使用以下命令更改阈值

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

提示

RabbiMQ 集群操作符 for Kubernetes 会自动配置内存限制。使用操作符是在 Kubernetes 上运行 RabbitMQ 的推荐方法。

当 RabbitMQ 节点在容器中运行时,它检测可用内存量的能力将取决于外部因素:使用的运行时版本、映像使用的操作系统版本和设置、使用的 cgroups 版本以及最终的 Kubernetes 版本。

这意味着在容器化环境中,最佳选择是配置绝对内存限制

另一个特定于 Kubernetes 的内存占用方面是如何管理操作系统的内核页面缓存,尤其是在使用流和超级流的集群中。

如何暂时停止所有发布

当阈值或绝对限制设置为 0 时,它会使内存警报立即触发,从而最终阻止所有发布连接。如果你希望全局禁用发布,这可能很有用。

rabbitmqctl set_vm_memory_high_watermark 0

有限地址空间

::: danger RabbitMQ 仅针对 64 位操作系统和 64 位Erlang 运行时 ::

RabbitMQ 仅针对 64 位操作系统和 64 位Erlang 运行时

在 64 位操作系统中使用 32 位 Erlang VM 运行 RabbitMQ(或在具有 PAE 的 32 位操作系统中)时,可寻址内存是有限的。服务器将检测到这一点并记录类似以下内容的消息

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

© 2024 RabbitMQ. All rights reserved.