以下是配置:
以下是首次执行的观察结果:
因此,我们看到消息消耗时间随着消息数量的增加而增加。
第二次执行而不重新启动任何服务器:
但删除activemq的数据文件夹并重启activemq后, 随着更多数据进入队列,性能再次提高但降级!
我在activemq.xml中尝试了多个配置,但没有成功......
任何人都面临类似的问题,并得到任何解决方案?让我知道。感谢。
答案 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分钟。