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

相关文章

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

RabbitMQ练习(AMQP 0-9-1 Overview)

1、What is AMQP 0-9-1 AMQP 0-9-1(高级消息队列协议)是一种网络协议,它允许遵从该协议的客户端(Publisher或者Consumer)应用程序与遵从该协议的消息中间件代理(Broker,如RabbitMQ)进行通信。 AMQP 0-9-1模型的核心概念包括消息发布者(producers/publisher)、消息(messages)、交换机(exchanges)、

RabbitMQ使用及与spring boot整合

1.MQ   消息队列(Message Queue,简称MQ)——应用程序和应用程序之间的通信方法   应用:不同进程Process/线程Thread之间通信   比较流行的中间件:     ActiveMQ     RabbitMQ(非常重量级,更适合于企业级的开发)     Kafka(高吞吐量的分布式发布订阅消息系统)     RocketMQ   在高并发、可靠性、成熟度等

JVM内存调优原则及几种JVM内存调优方法

JVM内存调优原则及几种JVM内存调优方法 1、堆大小设置。 2、回收器选择。   1、在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提供的内存查看工具,比如JConsole和Java VisualVM。   2、对JVM内存的系统级的调优主要的目的是减少

JVM 常见异常及内存诊断

栈内存溢出 栈内存大小设置:-Xss size 默认除了window以外的所有操作系统默认情况大小为 1MB,window 的默认大小依赖于虚拟机内存。 栈帧过多导致栈内存溢出 下述示例代码,由于递归深度没有限制且没有设置出口,每次方法的调用都会产生一个栈帧导致了创建的栈帧过多,而导致内存溢出(StackOverflowError)。 示例代码: 运行结果: 栈帧过大导致栈内存

控制反转 的种类

之前对控制反转的定义和解释都不是很清晰。最近翻书发现在《Pro Spring 5》(免费电子版在文章最后)有一段非常不错的解释。记录一下,有道翻译贴出来方便查看。如有请直接跳过中文,看后面的原文。 控制反转的类型 控制反转的类型您可能想知道为什么有两种类型的IoC,以及为什么这些类型被进一步划分为不同的实现。这个问题似乎没有明确的答案;当然,不同的类型提供了一定程度的灵活性,但

理解java虚拟机内存收集

学习《深入理解Java虚拟机》时个人的理解笔记 1、为什么要去了解垃圾收集和内存回收技术? 当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就必须对这些“自动化”的技术实施必要的监控和调节。 2、“哲学三问”内存收集 what?when?how? 那些内存需要回收?什么时候回收?如何回收? 这是一个整体的问题,确定了什么状态的内存可以

NGINX轻松管理10万长连接 --- 基于2GB内存的CentOS 6.5 x86-64

转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=190176&id=4234854 一 前言 当管理大量连接时,特别是只有少量活跃连接,NGINX有比较好的CPU和RAM利用率,如今是多终端保持在线的时代,更能让NGINX发挥这个优点。本文做一个简单测试,NGINX在一个普通PC虚拟机上维护100k的HTTP

深入解析秒杀业务中的核心问题 —— 从并发控制到事务管理

深入解析秒杀业务中的核心问题 —— 从并发控制到事务管理 秒杀系统是应对高并发、高压力下的典型业务场景,涉及到并发控制、库存管理、事务管理等多个关键技术点。本文将深入剖析秒杀商品业务中常见的几个核心问题,包括 AOP 事务管理、同步锁机制、乐观锁、CAS 操作,以及用户限购策略。通过这些技术的结合,确保秒杀系统在高并发场景下的稳定性和一致性。 1. AOP 代理对象与事务管理 在秒杀商品