为了有效使用ActiveMQ,了解ActiveMQ如何管理内存和磁盘资源以处理非持久性消息和持久性消息非常重要。

ActiveMQ具有三个关键参数,需要对其进行检查。

  1. 临时使用百分比

    1. 这是已用于假脱机非持久消息的已分配磁盘存储的百分比
    2. 非持久性消息是无法在代理重新启动后幸存的消息
  2. 店铺使用率
    1. 这是已用于存储持久性消息的已分配磁盘空间的百分比
  3. 内存使用率
    1. 这是已用于跟踪目标,高速缓存消息等的代理分配的内存的百分比。此值必须小于-Xmx(最大JVM堆大小)

该博客试图阐明如何计算单个节点ActiveMQ代理实例的存储,温度和内存使用率。 我们使用ActiveMQ版本5.8.0进行此说明。

一旦清楚了ActiveMQ如何操作这些值,就可以使用关键配置设置对ActiveMQ进行微调,以处理以下用例。

  1. 大量目的地(队列/主题)

    • 可以根据需要创建/删除目的地
  2. 缓慢的消费者
    • 当消费者无法跟上消息的生成速度时,这是一个巨大的问题。
  3. 讯息爆发
    • 在短时间内Swift涌入大量具有巨大有效负载大小的消息
  4. 资源利用不当
    • 很少有目的地消耗资源而导致其他人挨饿

扩展策略

如果您想知道ActiveMQ如何水平缩放,请参考Bosanac Dejan创建的幻灯片。 你可以在这里找到

它包含不同的ActiveMQ拓扑,除了调整ActiveMQ的各种参数外,还可以有效地用于满足批量吞吐量。 我发现它非常有用。

让我们直接在...

以下XML代码段来自配置activemq.xml。 为memoryUsage,storeUsage和tempUsage指定的值仅用于讨论目的。

<systemUsage><systemUsage><memoryUsage><memoryUsage limit="256 mb"/></memoryUsage><storeUsage><storeUsage limit="512 mb"/></storeUsage><tempUsage><tempUsage limit="256 mb"/></tempUsage></systemUsage></systemUsage>
  1. 内存使用情况

    1. 代理可使用256MB的JVM内存。 不要与-Xmx参数混淆。
  2. 店铺使用情况:
    1. 这是持久消息使用的磁盘空间(使用KahaDB)
  3. 临时用法:
    1. 假设我们使用默认的KahaDB,这是非持久消息使用的磁盘空间。 ActiveMQ将非持久消息假脱机到磁盘,以防止代理用尽内存

了解临时用法

代理可用性对于消息基础结构至关重要。 因此, 生产者流控制是一种保护机制,可以防止失控的生产者在没有使用者或使用者无法跟上将消息产生到目的地的速率时将非持久消息泵入目的地。 。

让我们以在本地代理实例中将有效负载大小为1MB的非持久消息生成为目标“ foo.bar”为例。

C:\apache-activemq-5.8.0\example>ant producer -Durl=tcp://localhost:61616 -Dtopic=false -Dsubject=foo.bar -Ddurable=false -DmessageSize=1048576

生产商最终因温度%使用率达到100%而挂起


由于消息是非持久性的,因此它们将存储在磁盘上的tmp_storage中


ActiveMQ提供了一种机制,可以调整每个目标的内存使用情况。 在这里,我们对启用了生产者流控制且目标内存限制为100MB的所有队列有一个通用策略(同样,这仅用于说明目的)。

<policyEntry queue=">" optimizedDispatch="true" producerFlowControl="true" cursorMemoryHighWaterMark="30" memoryLimit="100 mb" >

临时使用率计算如下:

(tmp_storage文件夹的大小/临时使​​用的内存限制)* 100

因此,在我们的情况下:

265,025,856 /(256 * 1024 * 1024)* 100 = 99.8〜100%,如经纪人控制台中所示。

以下日志消息显示在activemq.log中

INFO | Usage(default:temp:queue://foo.bar:temp) percentUsage=99%, usage=268535808, limit=268435456, percentUsageMinDelta=1%;Parent:Usage(default:temp
) percentUsage=100%, usage=268535808, limit=268435456, percentUsageMinDelta=1%: Temp Store is Full (99% of 268435456). Stopping producer (ID:AKUNTAMU-
1-61270-1388528939599-1:1:1:1) to prevent flooding queue://foo.bar. See http://activemq.apache.org/producer-flow-control.html for more info (blockingfor: 1421s)

让我们再举一个例子……

请考虑以下系统使用情况配置。 我们将tempUsage减少到50MB,同时保留了相同的目的地级别策略。

<systemUsage><systemUsage><memoryUsage><memoryUsage limit="256 mb"/></memoryUsage><storeUsage><storeUsage limit="512 mb"/></storeUsage><tempUsage><tempUsage limit="50 mb"/></tempUsage></systemUsage></systemUsage>

在这种情况下,我们发现临时使用率增加到191%

temp_storage停止增长到接近96MB,并且生产者挂起。

临时使用率是191%,因为(95.5MB / 50 MB)* 100,其中95.5 MB是文件夹的大小,50MB是临时使用的限制。

目标的限制为100MB,因此temp_storage不会超过目标。 造成这种混乱的原因是,临时使用限制小于每个目标内存限制。

店铺使用情况

让我们对持久消息重复相同的测试。

系统使用情况配置如下:

<systemUsage><systemUsage><memoryUsage><memoryUsage limit="256 mb"/></memoryUsage><storeUsage><storeUsage limit="512 mb"/></storeUsage><tempUsage><tempUsage limit="256 mb"/></tempUsage></systemUsage></systemUsage>

每个目标策略如下:

<policyEntry queue=">" optimizedDispatch="true" producerFlowControl="true" cursorMemoryHighWaterMark="30" memoryLimit="100 mb" >

让我们将1MB持久消息生成到名为“ foo.bar”的队列中

C:\apache-activemq-5.8.0\example>ant producer -Durl=tcp://localhost:61616 -Dtopic=false -Dsubject=foo.bar -Ddurable=true -DmessageSize=1048576

生产者在512条消息后挂起

以下日志语句出现在代理日志文件中

INFO | Usage(default:store:queue://foo.bar:store) percentUsage=99%, usage=537210471, limit=536870912, percentUsageMinDelta=1%;Parent:Usage(default:st
ore) percentUsage=100%, usage=537210471, limit=536870912,percentUsageMinDelta=1%: Persistent store is Full, 100% of 536870912. Stopping producer (ID: AKUNTAMU-1-31754-1388571228628-1:1:1:1) to prevent flooding queue://foo.bar. See http://activemq.apache.org/producer-flow-control.html for more info (
blocking for: 155s)

经纪人商店的使用率为100%,如下所示。

由于消息是持久性的,因此需要将它们保存到文件系统中。 商店使用限制为512MB。

上面的屏幕快照显示了kahadb文件夹,其中持久消息为543 MB(消息和其他数据库相关文件为512MB)

内存使用情况

在上面的示例中,内存使用率为11。

根据目标策略,每个目标分配的内存为100MB,cursorMemoryHighWaterMark
指定为30。因此100MB的30%为30MB。 因此,除了将消息存储在KahaDB中之外,还使用30MB将消息存储在内存中以进行更快的处理。 。

内存使用限制配置为256MB。 所以30MB是256的11%

(30/256)* 100〜11%

因此,如果要有9个这样的队列发生类似的情况,那么我们将耗尽11%* 9 = 99%〜100%的代理内存使用量

内存使用率是代理用于存储消息的内存量。 很多时候,这可能会成为瓶颈,因为一旦这个空间已满,经纪人将使生产者停滞不前。 在快速处理和有效的内存管理之间需要权衡取舍。

如果我们在内存中保留更多消息,则处理速度更快。 但是,内存消耗将非常高。 相反,如果消息保留在磁盘上,则处理将变慢。

结论

我们在此博客中看到了ActiveMQ中存储,临时和内存使用情况的工作方式。 无法为每个目标配置存储和临时使用的百分比,而内存使用的百分比则可能是因为cursorMemoryHighWaterMark。
希望您发现此信息有用。 此处给出的示例仅用于说明目的,并不意味着可以投入生产。 您将需要进行适当的容量规划,并确定代理拓扑以实现最佳配置。 如有任何意见,请随时与我们联系!

资源资源

  • http://blog.raulkr.net/2012/08/demystifying-producer-flow-control-and.html
  • http://tmielke.blogspot.com/2011/02/observations-on-activemqs-temp-storage.html
  • http://activemq.apache.org/javalangoutofmemory.html
  • http://www.slideshare.net/dejanb/advanced-messaging-with-apache-activemq -Bosanac Dejan
  • http://www.pepperdust.org/?p=150
  • http://stackoverflow.com/questions/2361541/how-do-you-scale-your-activemq-vertical

翻译自: https://www.javacodegeeks.com/2014/04/temp-store-and-memory-percent-usage-in-activemq.html

ActiveMQ中的温度,存储和内存使用百分比相关推荐

  1. activemq 内存_ActiveMQ中的温度,存储和内存使用百分比

    activemq 内存 为了有效使用ActiveMQ,了解ActiveMQ如何管理内存和磁盘资源以处理非持久性消息和持久性消息非常重要. ActiveMQ具有三个关键参数,需要对其进行检查. 临时使用 ...

  2. MySQL中常用的存储引擎(MyISAM 和InnoDB)

     数据库存储引擎是数据库底层软件组件,数据库管理系统(DBMS)使用存储引擎进行创建.查询.更新和删除数据操作.不同的存储引擎提供不同的存储机制.索引技巧.锁定水平等功能,使用不同的存储引擎,还可以获 ...

  3. 转载——C语言中float,double类型,在内存中的结构(存储方式)

    最近在做一个数据格式分析和转换的项目,第一次接触底层的二进制代码存储,看的一头雾水,看到这个帖子后对于在Windows系统下数据的存储方式有了更多的了解,将原文分享一下: 原文地址为http://ww ...

  4. java 数据保存内存_java中的各种数据类型在内存中存储的方式 一

    1.java是如何管理内存的 java的内存管理就是对象的分配和释放问题.(其中包括两部分) 分配:内存的分配是由程序完成的,程序员需要通过关键字new为每个对象申请内存空间(基本类型除外),所有的对 ...

  5. @清晰掉 C++ 中的 enum 结构在内存中是怎么存储的?

     C++ 中的 enum 结构在内存中是怎么存储的? C++ C++ 中的 enum 结构在内存中是怎么存储的?里面存储的是常量值吗? 关于占用内存的大小,enum类型本身是不占内存的,编译器直接替换 ...

  6. 16 bit float 存储_小数在内存中是如何存储的,揭秘诺贝尔奖级别的设计(长篇神文)...

    小数在内存中是以浮点数的形式存储的.浮点数并不是一种数值分类,它和整数.小数.实数等不是一个层面的概念.浮点数是数字(或者说数值)在内存中的一种存储格式,它和定点数是相对的.C语言使用定点数格式来存储 ...

  7. 常见数据结构在内存中是怎么存储的

    三人行,必有吾师,欢迎加入星球,一起讨论技术点滴 前言: 在开发中,经常用到数组,ArrayList,HashMap等,他们在内存中是怎么存储的呢? 其实在他们在申请内存时,要么是一块连续的内存,要么 ...

  8. 对象在内存中是如何存储的(内存五大区域和类加载)

    /* 先了解下内存五大区域和类加载 1.内存中的五大区域 栈---局部变量,当局部变量的作用域,被执行完毕之后,这个局部变量就会被系统立即回收 堆---程序猿手动申请的字节空间,Malloc call ...

  9. 对象在内存中是如何存储的

    内存五大区域 栈---局部变量,当局部变量的作用域,被执行完毕之后,这个局部变量就会被系统立即回收 堆---程序猿手动申请的字节空间,Malloc calloc realloc BBS段----未被初 ...

最新文章

  1. iMeta:已被谷歌学术(Google Scholar)收录
  2. Vuex之module
  3. IIS发布网页的基本操作
  4. 【中级软考】MTBF是什么?(平均故障间隔时间,Mean Time Between Failure,是衡量一个产品的可靠性指标,单位为小时)
  5. 【文件处理】——字典写入json文件或TXT文件,读取文件中的字典TypeError: Object of type ‘ndarray‘ is not JSON serializable错误解决方法
  6. 我敢打赌,这世界没有python数据分析解决不了的问题
  7. 微软研发致胜策略读书笔记(转)
  8. jenkins+svn+maven+ssh 部署配置详细记录
  9. Java工作笔记-Spring boot中配置文件加密(Jasypt的使用)
  10. 字节跳动正秘密研发手机 网友:字节锤子手机真来了?
  11. 蓝桥每日真题之负载均衡
  12. notesDocument类的HTTP URL属性 和note URL属性的区别
  13. 刘国辉 :做银行背后的“卖水人”,是不是好生意?
  14. tomcat设置编码
  15. 开源项目之Android Secrets(密码箱)
  16. html调色板快捷键,在线网页调色板
  17. python3读取键盘输入_Python读取键盘输入
  18. uni-app使用 getUserInfo 报错 fail can only be invoked by user TAP gesture 解决方法
  19. 注册小程序需要营业执照吗?
  20. 梦幻西游手游经验任务链计算机,梦幻西游手游任务链帮派求助刷经验技巧

热门文章

  1. java design按钮_DesignJava 设计模式,讲述 的各种 方便在项目中进行 框架结构 Develop 238万源代码下载- www.pudn.com...
  2. tar (child): .tgz\r:无法 open: 没有那个文件或目录
  3. 第11步 git推送失败 用户模块开发
  4. oracle spacial,Oracle Spacial(空间数据库)geometry元数据结构
  5. browserquest php安装,请问一下browserquest-php项目换成GatewayWorker的形式需要怎么部署worker...
  6. netbeans插件_如何编写NetBeans插件
  7. osgi 如何引入包_OSGi Testsuite:引入类名过滤器
  8. 象棋子 设计模式_通过设计国际象棋游戏了解策略模式
  9. csrf spring_无状态Spring安全性第1部分:无状态CSRF保护
  10. 模拟用户输入并检查输出的简单方法