在重负载下,我们可以不时观察到发送JMS消息的速度变慢。有时,发送一条简单的消息最多可能需要 30 秒。我们注意到的第一件事是总共9.5GB的日志文件的巨大大小。为什么有这么多文件,是否有任何影响文件数量的设置。根据文档:
Apache ActiveMQ Artemis具有复杂的文件垃圾收集算法,可以确定是否需要特定的日志文件 - 即是否将其所有数据都删除在相同或其他文件中。如果是这样,则可以回收并重复使用该文件
但是我们在日记文件夹中看到很多文件。它会影响发送消息的性能吗?
更新
我们使用的是嵌入式 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);
首先想到的是,由于journal-pool-files
默认为-1
并且journal-file-size
默认为10485760
字节(即 10MB),因此代理必须在运行时随着消息的累积而创建和初始化 10MB 文件,并且一旦创建了这些文件,日志就不会在消息被消耗时缩小到较小的文件集。创建和初始化文件是一项成本高昂的操作,因此您应该调整日志,以便预先创建足够的文件来处理预期的消息量。有关更多详细信息,请参阅期刊上的Apache Artemis文档。