在负载很重的情况下,我们可以观察到发送JMS消息的速度减慢。有时发送简单消息最多可能需要30秒。我们注意到的第一件事是巨大的日志文件大小9.5GB。为什么有这么多文件,是否有任何影响文件数量的设置。根据文件:
Apache ActiveMQ Artemis有一个复杂的文件垃圾收集算法,可以确定是否还需要特定的日志文件 - 即所有数据都被删除在相同或其他文件中。如果是,则可以回收并重新使用该文件
但是我们在期刊文件夹中看到了很多文件。它会影响发送消息的性能吗?
UPDATE
我们使用的是嵌入式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 documentation on the journal。