首页 > 解决方案 > Apache ActiveMQ Artemis 减速

问题描述

有时在重负载下,我们可以观察到发送 JMS 消息的速度变慢。有时发送一条简单的消息可能需要长达 30 秒。我们注意到的第一件事是巨大的日志文件,总共 9.5GB。为什么有这么多文件,有没有影响文件数量的设置。根据文档:

Apache ActiveMQ Artemis 有一个复杂的文件垃圾收集算法,它可以确定是否需要某个特定的日志文件——即是否删除了相同或其他文件中的所有数据。如果是这样,该文件可以被回收和重新使用

但是我们在 journals 文件夹中看到了很多文件。它会影响发送消息的性能吗?

更新

我们使用的是嵌入式 JMS 服务器版本 2.3.0。以下是我们设置的一些配置:

config.setPersistenceEnabled(true);
config.getAcceptorConfigurations().add(new TransportConfiguration(InVMAcceptorFactory.class.getName()));
config.getConnectorConfigurations().put("connector", new TransportConfiguration(InVMConnectorFactory.class.getName()));
AddressSettings addressSettings = new AddressSettings();
    addressSettings.setAddressFullMessagePolicy(AddressFullMessagePolicy.PAGE);
    addressSettings.setMaxSizeBytes(30 * 1024 * 1024L);
    addressSettings.setPageSizeBytes(10 * 1024 * 1024L);
    addressSettings.setPageCacheMaxSize(20);
    config.getAddressesSettings().put("jms.queue.*", addressSettings);
    config.setJournalBufferSize_AIO(819200);
    config.setJournalBufferSize_NIO(819200);

标签: javajmsactivemq-artemis

解决方案


首先想到的是,由于journal-pool-files默认为-1journal-file-size默认10485760字节(即 10MB),代理必须在运行时随着消息的累积创建和初始化 10MB 的文件,一旦这些文件被创建,日志将不会缩小到更小的一组文件作为消息被消费。创建和初始化文件是一项昂贵的操作,因此您应该调整日志,以便预先创建足够的文件来处理预期的消息量。有关更多详细信息,请参阅期刊上的 Apache Artemis 文档。


推荐阅读