Jboss Activemq 6.1.0 队列消息处理在 10000 条消息后变慢
Jboss Activemq 6.1.0 queue message processing slows down after 10000 messages
配置如下:
- 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 条消息!
But after deleting data folder of activemq and restarting activemq,
performance again improves but degrades as more data enters the queue!
我在 activemq.xml 中尝试了多种配置,但没有成功...
有人遇到过类似的问题,有什么解决办法吗?让我知道。谢谢
当待处理的消息计数变高时,我在我们的生产系统中看到了类似的减速。如果您正在充斥队列,则 MQ 进程无法将所有未决消息保留在内存中,并且必须转到磁盘来提供消息。在这些情况下,性能可能会一落千丈。增加分配给 MQ 服务器进程的内存。
看起来磁盘存储布局也不是特别有效 - 也许将每条消息作为一个文件放在一个目录中?这会使访问时间增加,因为遍历磁盘目录需要更长的时间。
50000 条消息 > 20 分钟似乎性能很低。
以下配置对我来说效果很好(这些只是提示。您可能已经尝试过其中一些,但看看它是否适合您)
1) 服务器和 queue/topic 策略条目
// 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) 如果可能,在消费者中使用交易。这将有助于减少服务器的消息确认处理和磁盘同步工作。
@hemant1900 提到的第 5 点解决了问题 :) 谢谢。
5) If possible use transactions in consumers. This will help to reduce
the message acknowledgement handling and disk sync efforts by server.
问题出在我的代码中。我没有使用事务来将数据保存在消费者中,这无论如何都是糟糕的编程..我知道:(
但没想到会导致这个问题
现在 50000 条消息在不到 2 分钟内得到处理。
配置如下:
- 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 条消息!
But after deleting data folder of activemq and restarting activemq, performance again improves but degrades as more data enters the queue!
我在 activemq.xml 中尝试了多种配置,但没有成功...
有人遇到过类似的问题,有什么解决办法吗?让我知道。谢谢
当待处理的消息计数变高时,我在我们的生产系统中看到了类似的减速。如果您正在充斥队列,则 MQ 进程无法将所有未决消息保留在内存中,并且必须转到磁盘来提供消息。在这些情况下,性能可能会一落千丈。增加分配给 MQ 服务器进程的内存。
看起来磁盘存储布局也不是特别有效 - 也许将每条消息作为一个文件放在一个目录中?这会使访问时间增加,因为遍历磁盘目录需要更长的时间。
50000 条消息 > 20 分钟似乎性能很低。
以下配置对我来说效果很好(这些只是提示。您可能已经尝试过其中一些,但看看它是否适合您)
1) 服务器和 queue/topic 策略条目
// 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) 如果可能,在消费者中使用交易。这将有助于减少服务器的消息确认处理和磁盘同步工作。
@hemant1900 提到的第 5 点解决了问题 :) 谢谢。
5) If possible use transactions in consumers. This will help to reduce the message acknowledgement handling and disk sync efforts by server.
问题出在我的代码中。我没有使用事务来将数据保存在消费者中,这无论如何都是糟糕的编程..我知道:(
但没想到会导致这个问题
现在 50000 条消息在不到 2 分钟内得到处理。