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

相关文章

Java内存区域与内存溢出异常的详细探讨

《Java内存区域与内存溢出异常的详细探讨》:本文主要介绍Java内存区域与内存溢出异常的相关资料,分析异常原因并提供解决策略,如参数调整、代码优化等,帮助开发者排查内存问题,需要的朋友可以参考下... 目录一、引言二、Java 运行时数据区域(一)程序计数器(二)Java 虚拟机栈(三)本地方法栈(四)J

MySQL精准控制Binlog日志数量的三种方案

《MySQL精准控制Binlog日志数量的三种方案》作为数据库管理员,你是否经常为服务器磁盘爆满而抓狂?Binlog就像数据库的“黑匣子”,默默记录着每一次数据变动,但若放任不管,几天内这些日志文件就... 目录 一招修改配置文件:永久生效的控制术1.定位my.cnf文件2.添加核心参数不重启热更新:高手应

java变量内存中存储的使用方式

《java变量内存中存储的使用方式》:本文主要介绍java变量内存中存储的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍2、变量的定义3、 变量的类型4、 变量的作用域5、 内存中的存储方式总结1、介绍在 Java 中,变量是用于存储程序中数据

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置

Spring Security+JWT如何实现前后端分离权限控制

《SpringSecurity+JWT如何实现前后端分离权限控制》本篇将手把手教你用SpringSecurity+JWT搭建一套完整的登录认证与权限控制体系,具有很好的参考价值,希望对大家... 目录Spring Security+JWT实现前后端分离权限控制实战一、为什么要用 JWT?二、JWT 基本结构

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.