RabbitMQ流控-内存控制

2024-01-23 08:18
文章标签 内存 控制 rabbitmq 流控

本文主要是介绍RabbitMQ流控-内存控制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

RabbitMQ服务器启动和执行rabbitmqctl set_vm_memory_high_watermark fraction命令时会检测计算机中安装的RAM(内存)总量。默认情况下,当RabbitMQ服务器使用超过40%的可用RAM时,它会发出内存警报并阻塞所有正在发布消息的Connection。一旦内存警报清除(例如,由于服务器将消息写到磁盘或将其投递给客户端消费并进行投递确认),服务恢复正常。

默认内存阈值设置为已安装RAM的40%。请注意,这并不会阻止RabbitMQ服务器使用超过40%的资源,这仅仅是对发布者(生产者)的限制。在最坏的情况下,Erlang的垃圾收集器会导致使用的内存数量增加一倍(默认情况下是80%的RAM)。强烈建议启用OS交换或page文件。

32位系统单进程的内存限制设置为2GB。64位系统的常见实现(例如AMD64和Intel EM64T)只允许每个进程256TB。64位Windows进一步将其限制为8TB。但是,请注意,即使在64位操作系统下,32位进程通常也只有2GB的最大地址空间。就是说,无论你的内存多大,你的默认阈值均为2GB*0.4=0.8GB(820M左右)。

Configuring the Memory Threshold

通过编辑配置文件,可以调整触发流控的内存阈值。下面的例子将阈值设置为默认值0.4:

vm_memory_high_watermark.relative = 0.4或
[{rabbit, [{vm_memory_high_watermark, 0.4}]}]

默认值0.4表示已安装RAM的40%或可用虚拟地址空间的40%(以较小的值为准)。例如,在32位平台上,如果您安装了4GB RAM,那么4GB的40%是1.6GB,但是32位Windows通常将进程限制为2GB,因此阈值实际上是2GB的40%(即820MB)。

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

vm_memory_high_watermark.absolute = 1073741824或
[{rabbit, [{vm_memory_high_watermark, {absolute, 1073741824}}]}]

使用内存单位:

vm_memory_high_watermark.absolute = 1024MB
([{rabbit, [{vm_memory_high_watermark, {absolute, "1024MiB"}}]}])
或
vm_memory_high_watermark.absolute = 1GB

如果绝对限制大于已安装的RAM或可用虚拟地址空间,则将阈值设置为较小的限制。

当RabbitMQ服务器启动时,内存限制信息会打印到RABBITMQ_NODENAME.log文件:

=INFO REPORT==== 29-Oct-2009::15:43:27 ===
Memory limit set to 2048MB.

还可以使用rabbitmqctl status命令查询内存限制。

当代理使用rabbitmqctl set_vm_memory_high_watermark fraction命令或rabbitmqctl set_vm_memory_high_watermark absolute memory_limit命令运行时,可以更改阈值。在这个命令中也可以使用内存单位。此命令将一直生效,直到代理(broker)关闭。在代理重新启动之后,还应该更改相应的配置设置。在不更改阈值的情况下执行此命令时,对于具有热插拔RAM的系统,内存限制可能会更改,原因是查询了系统RAM的总数量。

Disabling All Publishing

如果值为0,则内存警报将立即关闭,从而最终阻塞所有发布Connection(如果希望禁用全局发布,这可能很有用);
使用rabbitmqctl set_vm_memory_high_watermark 0

Limited Address Space

当在64位OS(或带有PAE的32位OS)的32位Erlang VM中运行RabbitMQ时,可寻址内存是有限的。服务器将检测到这一点,并记录如下消息:

=WARNING REPORT==== 19-Dec-2013::11:27:13 ===
Only 2048MB of 12037MB memory usable due to limited address space.
Crashes due to memory exhaustion are possible - see
http://www.rabbitmq.com/memory.html#address-space

因此强烈建议在64位OS上运行时使用64位Erlang VM。

Configuring the Paging Threshold

在代理(broker)到达内存阈值并阻塞发布者之前,它将尝试通过指示队列将其内容发送(Page)到磁盘来释放内存。
持久消息和临时消息都将被换出(持久消息已经在磁盘上,但将从内存中删除)。

默认情况下,当代理到达内存阈值的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
经典格式
[{rabbit, [{vm_memory_high_watermark_paging_ratio, 0.75},{vm_memory_high_watermark, 0.4}]}]

上面的配置在使用内存的30%时开始Page,在40%时阻塞发布者。

可以将vm_memory_high_watermark_paging_ratio设置为大于1.0的值。在这种情况下,队列不会将其内容page到磁盘。如果这导致内存警报关闭,那么将如上所述(直接)阻塞producer。

这篇关于RabbitMQ流控-内存控制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/635780

相关文章

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

微服务架构之使用RabbitMQ进行异步处理方式

《微服务架构之使用RabbitMQ进行异步处理方式》本文介绍了RabbitMQ的基本概念、异步调用处理逻辑、RabbitMQ的基本使用方法以及在SpringBoot项目中使用RabbitMQ解决高并发... 目录一.什么是RabbitMQ?二.异步调用处理逻辑:三.RabbitMQ的基本使用1.安装2.架构

Spring IOC控制反转的实现解析

《SpringIOC控制反转的实现解析》:本文主要介绍SpringIOC控制反转的实现,IOC是Spring的核心思想之一,它通过将对象的创建、依赖注入和生命周期管理交给容器来实现解耦,使开发者... 目录1. IOC的基本概念1.1 什么是IOC1.2 IOC与DI的关系2. IOC的设计目标3. IOC

Linux内存泄露的原因排查和解决方案(内存管理方法)

《Linux内存泄露的原因排查和解决方案(内存管理方法)》文章主要介绍了运维团队在Linux处理LB服务内存暴涨、内存报警问题的过程,从发现问题、排查原因到制定解决方案,并从中学习了Linux内存管理... 目录一、问题二、排查过程三、解决方案四、内存管理方法1)linux内存寻址2)Linux分页机制3)

Java循环创建对象内存溢出的解决方法

《Java循环创建对象内存溢出的解决方法》在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError),所以本文给大家介绍了Java循环创建对象... 目录问题1. 解决方案2. 示例代码2.1 原始版本(可能导致内存溢出)2.2 修改后的版本问题在

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常

Redis多种内存淘汰策略及配置技巧分享

《Redis多种内存淘汰策略及配置技巧分享》本文介绍了Redis内存满时的淘汰机制,包括内存淘汰机制的概念,Redis提供的8种淘汰策略(如noeviction、volatile-lru等)及其适用场... 目录前言一、什么是 Redis 的内存淘汰机制?二、Redis 内存淘汰策略1. pythonnoe

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int