在10000条消息之后,Jboss Activemq 6.1.0队列消息处理速度变慢

时间:2015-04-13 12:48:02

标签: jboss activemq

以下是配置:

  • 2个JBoss应用程序节点
  • 应用程序节点上的5个侦听器,每个支持50个线程 群集并设置为主动 - 主动侦听器,因此它们会继续运行 两个app节点
  • 侦听器只是获取消息并将信息记录到其中 数据库
  • 使用JMeter将50000条消息发布到ActiveMQ中。

以下是首次执行的观察结果:

  • 约22分钟消耗总计50000条消息。
  • 约1分钟消耗的0-10000条消息
  • 消耗10000-20000条消息约2分钟
  • 约4分钟消耗20000-30000条消息
  • 约6分钟消耗30000-40000条消息
  • 8分钟消耗40000-50000条消息

因此,我们看到消息消耗时间随着消息数量的增加而增加。

第二次执行而​​不重新启动任何服务器:

  • 约53分钟消耗50000条消息!
  

但删除activemq的数据文件夹并重启activemq后,   随着更多数据进入队列,性能再次提高但降级!

我在activemq.xml中尝试了多个配置,但没有成功......

任何人都面临类似的问题,并得到任何解决方案?让我知道。感谢。

3 个答案:

答案 0 :(得分:1)

当待处理的消息数量很高时,我在生产系统中看到类似的减速。如果您对队列进行了泛滥,那么MQ进程就无法将所有待处理的消息保留在内存中,并且必须转到磁盘来提供消息。在这些情况下,表演可能会悬崖峭壁。增加给予MQ服务器进程的内存。

看起来好像磁盘存储布局不是特别有效 - 可能将每条消息作为文件放在一个目录中?这可以使访问时间增加,因为遍历磁盘目录需要更长的时间。

答案 1 :(得分:0)

>中的50000条消息20分钟看起来性能非常低。

以下配置对我来说效果很好(这些只是指针。您可能已经尝试了其中一些,但看看它是否适合您)

1)服务器和队列/主题策略条目

// server
server.setDedicatedTaskRunner(false)
// queue policy entry
policyEntry.setMemoryLimit(queueMemoryLimit); // 32mb
policyEntry.setOptimizedDispatch(true);
policyEntry.setLazyDispatch(true); 
policyEntry.setReduceMemoryFootprint(true);
policyEntry.setProducerFlowControl(true);
policyEntry.setPendingQueuePolicy(new StorePendingQueueMessageStoragePolicy());

2)如果您使用KahaDB进行持久性,则使用每个目标适配器(MultiKahaDBPersistenceAdapter)。这样可以使每个目标的存储文件夹保持独立,并减少同步工作。此外,如果您不担心突然重启服务器(由于任何技术原因),那么您可以通过

减少磁盘同步工作
kahaDBPersistenceAdapter.setEnableJournalDiskSyncs(false);

3)尝试在服务器级别增加内存使用,临时和存储磁盘使用值。

4)如果可能,在预取策略中增加prefetchSize。这将提高性能,但也会增加消费者的内存占用。

5)如果可能,在消费者中使用交易。这将有助于减少服务器的消息确认处理和磁盘同步工作。

答案 2 :(得分:0)

@ hemant1900提到的第5点解决了问题:)谢谢。

  

5)如果可能,在消费者中使用交易。这将有助于减少   服务器的消息确认处理和磁盘同步工作。

问题出在我的代码中。我没有使用事务来持久保存消费者的数据,这无论如何糟糕的编程......我知道:(

但是没想到会导致这个问题。

现在50000,邮件的处理时间不到2分钟。