RabbitMQ的告警之一:内存告警

内存阈值:它是什么以及如何工作

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的最大地址空间可用。

讲真,这里我没搞明白,256TB也算是微不足道吗?哈哈。

所有 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:

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):

vm_memory_high_watermark.absolute = 1073741824

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

vm_memory_high_watermark.absolute = 1024MiB

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

2019-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_breakdown
rabbitmqctl status

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

rabbitmqctl set_vm_memory_high_watermark <fraction>
rabbitmqctl set_vm_memory_high_watermark absolute <memory_limit>

例如:

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。

禁用所有发布

当阈值或绝对限制值设置为0时,内存告警会立即响起,从而最终阻塞所有正在发布消息的连接。如果你希望在全局范围内禁用发布,这可能会很有用。

rabbitmqctl set_vm_memory_high_watermark 0

有限的地址空间

当在64位操作系统(或有PAE的32位操作系统)的32位Erlang虚拟机内运行RabbitMQ时,可寻址内存受到限制。RabbitMQ服务器将会检测到此情况,并记录如下日志:

2018-11-22 10:44:33.654 [warning] Only 2048MB of 12037MB memory usable
due to limited address space.

内存告警系统并不完美。尽管停止发布,通常会阻止更多的内存被使用,但其他事情很可能还会继续增加对内存的使用。通常,当这种情况发生,并且物理内存耗尽时,操作系统会开始进行swap。但是,当使用有限的地址空间运行时,超出限制将会导致虚拟机终止,或者被操作系统的out-of-memory机制杀死。

因此,强烈建议,在64位操作系统和64位Erlang运行时上,运行RabbitMQ。

配置分页阈值

在代理达到高水位线并阻止发布者之前,它将会尝试通过指示队列将其内容分页到磁盘,来释放内存。持久化消息和瞬时消息都将被分页出去(持久化消息已经在磁盘上,但将会从内存中清除)。默认情况下,这是在代理达到高水位线的50%时,开始发生的(即,默认高水位线为0.4,就是当内存使用了20%时)。要更改此值,可以修改vm_memory_high_watermark_paging_ratio配置,它的默认值是0.5。例如:

vm_memory_high_watermark_paging_ratio = 0.75
vm_memory_high_watermark.relative = 0.4

上面的配置,在内存使用30%时开始分页(0.4 * 0.75 = 0.3),在40%时阻塞发布者。

将vm_memory_high_watermark_paging_ratio设置为大于1.0的值是有可能的。在这种情况下,队列不会将它们的内容分页到磁盘。如果这导致了内存警报响起,则生产者将如上所述,会被阻塞。

无法识别的平台

如果RabbitMQ服务器无法检测正在运行的操作系统,它将在日志文件附加警告。然后假设安装了1GiB的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.

在这种情况下,vm_memory_high_watermark配置值用来衡量假定的1GB RAM。在 vm_memory_high_watermark 默认值为0.4的情况下,RabbitMQ的内存阈值设置为410MB,因此只要RabbitMQ使用的内存超过410MB,它将会限制生产者。因此,当RabbitMQ无法识别你的平台时,如果你实际上安装了8GB RAM,并且你希望当服务器使用超过3GB的内存时,限制生产者,就将vm_memory_high_watermark设置为3。

原文:Memory Alarms

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值