【问题标题】:Jboss Activemq 6.1.0 queue message processing slows down after 10000 messagesJboss Activemq 6.1.0 队列消息处理在 10000 条消息后变慢
【发布时间】:2015-06-18 18:55:53
【问题描述】:

下面是配置:

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

这是对第一次执行的观察:

  • 在大约 22 分钟内消耗了总共 50000 条消息。
  • 大约 1 分钟内消耗的前 0-10000 条消息
  • 大约 2 分钟消耗 10000-20000 条消息
  • 大约 4 分钟消耗 20000-30000 条消息
  • 大约 6 分钟消耗 30000-40000 条消息
  • 8 分钟消耗 40000-50000 条消息

所以我们看到消息消耗时间随着消息数量的增加而增加。

不重启任何服务器的第二次执行:

  • 大约 53 分钟内消耗了 50000 条消息!

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

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

有人遇到过类似的问题,有解决办法吗?让我知道。谢谢。

【问题讨论】:

  • 是否有消息消费失败? KahaDB(我假设这就是您正在使用的,尽管您确实需要在您的问题中指定它)如果其中的一条消息仍未使用(提示:在 DLQ = 未使用),则将保留整个文件,因此可以解释为至少有一些放缓。

标签: jboss activemq


【解决方案1】:

当待处理的消息数量很高时,我在生产系统中看到了类似的减速。如果您正在淹没队列,则 MQ 进程无法将所有未决消息保存在内存中,并且必须转到磁盘来提供消息。在这些情况下,性能可能会一落千丈。增加分配给 MQ 服务器进程的内存。

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

【讨论】:

    【解决方案2】:

    20 分钟内 50000 条消息似乎性能非常低。

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

    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) 如果可能的话,在消费者中使用事务。这将有助于减少服务器的消息确认处理和磁盘同步工作。

    【讨论】:

    • 将尝试所有这些选项,看看是否有任何解决问题的方法...谢谢。
    • 另外,在当前配置下,假设侦听器只是将一些数据转储到数据库中而不进行任何处理,我可以预期处理 50000 条消息的时间是多少?
    • 这取决于您的服务器、处理器数量、内存等。但是 20 分钟对我来说听起来很慢,因为我通常看到 200-300 msg/sec(四核,512mb 内存用于 activemq)
    【解决方案3】:

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

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

    问题出在我的代码中。我没有使用事务将数据保存在消费者中,这无论如何都是不好的编程......我知道:(

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

    现在 50000 条消息在不到 2 分钟的时间内得到处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-24
      • 2016-11-20
      • 2012-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-16
      • 2015-09-23
      相关资源
      最近更新 更多