首页 > 解决方案 > 分页后 ActiveMQ Artemis 的性能下降

问题描述

在代理切换到分页模式后,我发现性能出现了奇怪的下降。有些消息开始需要很长时间: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 ram 50GB SSD,ActiveMQ Artemis 2.7.0

只有代理重启有帮助

标签: jmsactivemq-artemismessagebroker

解决方案


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

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

  • 为代理的 JVM 提供足够的堆空间,以便永远不会发生分页。
  • 使用流控制来防止消息在代理上过度堆积而导致分页。
  • 确保消息消费跟上消息生产,以防止消息在代理上过度堆积导致分页(例如添加更多消费者、提高现有消费者的性能等)。
  • 使用高速SSD而不是速度较慢的传统HDD

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

另外,由于您使用的是 ActiveMQ Artemis 2.7.0,我强烈建议您升级到最新版本。自 2.7.0 发布到现在已经 2 年多了,并且在更高版本中实现了许多错误修复和新功能。


推荐阅读