rabbitmq内存不足触发内存告警

启因

因为项目是直接拿过来的(有生产无测试环境),需要搭建测试环境,但是测试环境与生产环境的配置不一致。

启动项目时提示

1
Consumer failed to start in 60000 milliseconds; does the task executor have enough threads to support the container concurrency?

网上查询说是rabbitmq内存告警

在rabbitmq的配置文件里加入

1
vm_memory_high_watermark.absolute = 1073741824

配置文件需要创建。

查看配置文件路径:

1
cat rabbitmq-defaults

一般都在/etc/rabbitmq/

vim rabbitmq.conf

添加上面的内容。

1
2
3
配置文件 rabbitmq.conf
环境变量文件 rabbitmq-env.conf
补充配置文件 advanced.config

了解

RabbitMQ服务器,会在启动时以及执行 rabbitmqctl set_vm_memory_high_watermark 命令时,检测计算机安装的RAM总量。默认情况下,当RabbitMQ服务器使用超过40%的可用RAM空间时,它便会触发告警,并阻塞所有正在发布消息的连接。一旦内存告警被解除(例如,服务器将内存中的消息持久化到磁盘,或者将消息交付给消费者并得到消费者确认),便会恢复正常服务。

默认的内存阈值,被设置为系统安装RAM的40%。请注意,这不会阻止RabbitMQ使用超过40%的内存,这仅仅是指消息发布者会被限制。在最坏的情况下,Erlang的垃圾回收器可能导致使用的内存量增加一倍(默认情况下,为80%)。所以强烈建议,启用操作系统的swap(linux)或分页文件(windows)。

32位体系结构倾向于对每个进程施加2GB的内存限制。64位体系结构(例如,AMD64和Intel EM64T)的常见实现是,每个进程仅允许微不足道的256TB。64位Windows将其进一步限制为8TB。但是,请注意,即使在64位操作系统下,一个32位进程也经常只有2GB的最大地址空间可用。

所有 32 位应用程序都有 4 GB 的进程地址空间(32 位地址最多可以映射 4 GB 的内存)。对于 Microsoft Windows 操作系统,应用程序可以访问 2 GB 的进程地址空间,称为用户模式虚拟地址空间。应用程序拥有的所有线程都共享同一个用户模式虚拟地址空间。其余 2 GB 为操作系统保留(也称为内核模式地址空间)。所有操作系统版本(从 Windows 2000 Server 开始,包括 Windows Server 2003)都有一个 boot.ini 开关,可以为应用程序提供访问 3 GB 的进程地址空间的权限,从而将内核模式地址空间限定为 1 GB。

配置内存阈值

可以通过编辑配置文件,来调整触发流控的内存阈值。

下面的示例,将内存阈值设置为默认的0.4:

1
vm_memory_high_watermark.relative = 0.4

默认值0.4代表40%的可用内存(监测到的),或者可用虚拟地址空间的40%,以较小者为准。例如,在安装了4GiB RAM的32位平台上,4GiB的40%是1.6GiB,但是32位Windows通常将进程限制为2GiB,因此阈值实际上是2GiB的40%(也就是820MiB)。

或者,可以通过设置一个节点使用的RAM的绝对限制,来调整内存阈值。下面的示例,将阈值设置为1073741824 bytes(1024 MiB):

1
vm_memory_high_watermark.absolute = 1073741824

或者,使用存储单位表示:

1
vm_memory_high_watermark.absolute = 1024MiB

如果设置的绝对限制值,比安装的RAM大,或者比可用的虚拟地址空间大,则阈值被设置为限制值较小的那个。RabbitMQ节点启动时,会将内存阈值配置追加到日志文件,如下:

1
2023-06-13 10:06:34.692754+08:00 [info] <0.379.0> Memory high watermark set to 1024 MiB (1073741824 bytes) of 3646 MiB (3823181824 bytes) total

也可以使用如下两条命令查询内存限制配置:

1
2
rabbitmq-diagnostics memory_breakdown
rabbitmqctl status

在代理运行时,可以使用如下两条命令更改阈值:

1
2
rabbitmqctl set_vm_memory_high_watermark <fraction>
rabbitmqctl set_vm_memory_high_watermark absolute <memory_limit>

例如:

1
2
rabbitmqctl set_vm_memory_high_watermark 0.6
rabbitmqctl set_vm_memory_high_watermark absolute “4G”

这两个命令都将起作用,直到节点停止运行。要使该设置在节点重启后仍然有效,可以使用配置设置代替。执行此命令时,即使未修改阈值,在具有可热插拔RAM的系统上,内存限制值可能还是会变化,因为查询的是系统RAM的总量。

  • M,MiB,兆字节(2 ^ 20字节,1024 * 1024)
  • G,GiB,gibibytes(2 ^ 30字节,1024 * 1024 * 1024)
  • MB,兆字节(10 ^ 6字节,1000 * 1000)
  • GB,千兆字节(10 ^ 9字节, 1000 * 1000 * 1000)

对于单位的使用,原文使用了G,GiB,也使用了GB,感觉上是有点乱的。

Gibibyte(giga binary byte的缩写)是信息或计算机硬盘存储的一个单位,简称GiB。由来“GiB”、“KiB”、“MiB”等是于1999年由国际电工协会(IEC)拟定了”KiB”、“MiB”、“GiB”的二进制单位,专用来标示“1024进位”的数据大小。而后,这一标注规范又于2008年并入国际标准化组织(ISO)文件。具体的来说,1GiB=1024MiB,1MiB=1024KiB。他们与GB、MB、KB是不一样的,GB等则是1000进位的数据单位。根据Wikipedia的注译,GB(gigabyte)是十进制的容量单位,1GB等于1,000,000,000 Bytes。而二进制的容量单位则是用GiB(Gibibyte)就是Giga Binary Byte,相等于1,073,741,824 Bytes。


rabbitmq内存不足触发内存告警
http://hanqichuan.com/2023/06/13/mq/rabbitmq内存不足触发内存告警/
作者
韩启川
发布于
2023年6月13日
许可协议