rabbitmq内存不足触发内存告警
启因
因为项目是直接拿过来的(有生产无测试环境),需要搭建测试环境,但是测试环境与生产环境的配置不一致。
启动项目时提示
1 |
|
网上查询说是rabbitmq内存告警
在rabbitmq的配置文件里加入
1 |
|
配置文件需要创建。
查看配置文件路径:
1 |
|
一般都在/etc/rabbitmq/
vim rabbitmq.conf
添加上面的内容。
1 |
|
了解
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 |
|
默认值0.4代表40%的可用内存(监测到的),或者可用虚拟地址空间的40%,以较小者为准。例如,在安装了4GiB RAM的32位平台上,4GiB的40%是1.6GiB,但是32位Windows通常将进程限制为2GiB,因此阈值实际上是2GiB的40%(也就是820MiB)。
或者,可以通过设置一个节点使用的RAM的绝对限制,来调整内存阈值。下面的示例,将阈值设置为1073741824 bytes(1024 MiB):
1 |
|
或者,使用存储单位表示:
1 |
|
如果设置的绝对限制值,比安装的RAM大,或者比可用的虚拟地址空间大,则阈值被设置为限制值较小的那个。RabbitMQ节点启动时,会将内存阈值配置追加到日志文件,如下:
1 |
|
也可以使用如下两条命令查询内存限制配置:
1 |
|
在代理运行时,可以使用如下两条命令更改阈值:
1 |
|
例如:
1 |
|
这两个命令都将起作用,直到节点停止运行。要使该设置在节点重启后仍然有效,可以使用配置设置代替。执行此命令时,即使未修改阈值,在具有可热插拔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。