分页后 ActiveMQ Artemis 的性能下降

Decreased performance in ActiveMQ Artemis after paging

代理切换到分页模式后,我发现性能出现奇怪的下降。有些消息开始需要很长时间: 1800米 10米 15米 700мс

我也看到很多磁盘使用:

我的broker.xml:

<configuration>
   <core xmlns="urn:activemq:core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="urn:activemq:core ">
         
      <thread-pool-max-size>50</thread-pool-max-size>
      <name>0.0.0.0</name>


      <persistence-enabled>true</persistence-enabled>

      <journal-type>ASYNCIO</journal-type>

      <paging-directory>data/paging</paging-directory>

      <bindings-directory>data/bindings</bindings-directory>

      <journal-directory>data/journal</journal-directory>

      <large-messages-directory>data/large-messages</large-messages-directory>

      <journal-datasync>true</journal-datasync>

      <journal-min-files>2</journal-min-files>

      <journal-pool-files>10</journal-pool-files>

      <journal-file-size>10M</journal-file-size>

      <journal-buffer-timeout>16000</journal-buffer-timeout>

      <journal-max-io>4096</journal-max-io>
      
      <disk-scan-period>5000</disk-scan-period>

      <max-disk-usage>90</max-disk-usage>

      <critical-analyzer>true</critical-analyzer>

      <critical-analyzer-timeout>120000</critical-analyzer-timeout>

      <critical-analyzer-check-period>60000</critical-analyzer-check-period>

      <critical-analyzer-policy>HALT</critical-analyzer-policy>


      <acceptors>

         <acceptor name="artemis">tcp://0.0.0.0:61616?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=CORE,AMQP;useEpoll=true;</acceptor>

         <acceptor name="amqp">tcp://0.0.0.0:5672?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=AMQP;useEpoll=true;amqpCredits=1000;amqpLowCredits=300</acceptor>

      </acceptors>
   </core>
</configuration>

Linux Astra,4 CPU 24GB 内存 50GB SSD,ActiveMQ Artemis 2.7.0

只有代理重启有帮助

分页时预计性能会下降。这是因为消息被分页到磁盘和从磁盘分页,而不是直接从 RAM 访问。即使是最快的磁盘也比 RAM 慢得多,因此分页会降低性能。

有几种方法可以缓解这种性能下降:

  • 为代理的 JVM 提供足够的堆 space 以便永远不会发生分页。
  • 使用 flow-control 防止消息在代理上过度堆积导致分页。
  • 确保消息消费跟上消息生产,以防止消息在代理上过度堆积导致分页(例如添加更多消费者、提高现有消费者的性能等)。
  • 使用高速SSDs instead of slower traditional HDD秒。

我的猜测是您使用的大部分是非持久消息,因此重新启动代理会清除这些消息并消除寻呼的需要,从而恢复正常性能。

此外,由于您使用的是 ActiveMQ Artemis 2.7.0,我强烈建议您升级到 latest release。自 2.7.0 发布以来已经过去了 2 年多,并且在以后的版本中修复了许多错误并实现了新功能。