jms - 分页后 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
只有代理重启有帮助
解决方案
分页时预计性能会下降。这是因为消息是在磁盘之间进行分页的,而不是直接从 RAM 访问的。即使是最快的磁盘也比 RAM 慢得多,因此分页会降低性能。
有几种方法可以缓解这种性能下降:
- 为代理的 JVM 提供足够的堆空间,以便永远不会发生分页。
- 使用流控制来防止消息在代理上过度堆积而导致分页。
- 确保消息消费跟上消息生产,以防止消息在代理上过度堆积导致分页(例如添加更多消费者、提高现有消费者的性能等)。
- 使用高速SSD而不是速度较慢的传统HDD。
我的猜测是,您使用的主要是非持久消息,因此重新启动代理会清除这些消息并消除分页的需要,从而恢复正常性能。
另外,由于您使用的是 ActiveMQ Artemis 2.7.0,我强烈建议您升级到最新版本。自 2.7.0 发布到现在已经 2 年多了,并且在更高版本中实现了许多错误修复和新功能。
推荐阅读
- php - hasManyThrough 是否忽略中间表上的全局范围?
- android - 如何删除 EditText 下的气味线?
- node.js - 使用 Angular 7 时无法在 expressJs 中使用 passpost-jwt 进行授权
- c++ - 如何计算数组内元素的位数?(不是数组的长度)并计算其位数的总和
- java - 如何在 Swagger API 定义中发送对象参数?
- r - 用于分配 HH 旅行调查的 R Logic
- dynamics-crm - 动态电子邮件和电子邮件附件
- python - 字符串的 Python 数值排序
- java - 仅当满足 for 循环中的所有条件时才中断 while 循环
- r - 向R中的条形图添加正态分布