ActiveMQ Classic 性能模块用户手册

特性 > 性能 > ActiveMQ Classic 性能模块用户手册

运行 Maven 2 性能测试

这个 Maven 2 插件允许您使用 Maven 命令行轻松运行性能测试,或在 Continuum 中自动运行测试。

先决条件

从 ActiveMQ Classic 5.5 及更高版本开始,该插件可以从 Maven 获取,或者如果您从 GIT 下载源代码,则可以自行构建。首先完成 Apache ActiveMQ Classic 的完整构建,然后执行以下操作:

cd activemq-tooling
mvn clean install

要运行以下 Maven 目标,请确保您位于 Maven2 项目目录中,该目录的 POM 启用了 Maven2 插件。

入门

要开始,请切换到 sandbox 存储库中的 activemq-perftest 目录,或切换到包含以下插件定义的 Maven POM 文件的目录。

<plugin>
  <groupId>org.apache.activemq.tooling</groupId>
  <artifactId>activemq-perf-maven-plugin</artifactId>
  <version>${activemq-version}</version>
</plugin>

在 ActiveMQ Classic 5.8 之前的版本中,artifactId 为 maven-activemq-perf-plugin

在单独的 shell 中输入以下命令(如果您已预先配置了正在运行的代理,则此处的代理行是可选的)

mvn activemq-perf:broker -Durl=broker:tcp://127.0.0.1:61616
mvn activemq-perf:consumer
mvn activemq-perf:producer

如果您在不同的机器上运行代理,则将生产者和消费者命令更改为

mvn activemq-perf:consumer -Dfactory.brokerURL=tcp://host:port
mvn activemq-perf:producer -Dfactory.brokerURL=tcp://host:port

其中您将 host:port 替换为实际值。

运行生产者和消费者时,它将在当前目录中生成一个 XML 性能报告,以便您可以对结果进行图形化和图表化等操作。请参阅 示例报告

Maven 目标

目标 描述
activemq-perf:broker 使用位于“src\main\resources\broker-conf”中的 ActiveMQ 配置文件启动代理,其中默认配置是 activemq.xml。参数:-DconfigType - 指定要使用的配置类型。其值必须是“..\broker-config”目录中的某个文件名(例如 -DconfigType=kaha)。-DconfigFile - 除“src\..\broker-config”中的文件之外的配置文件的路径。例如 -DconfigFile=c:\dir\activemq.xml)。
activemq-perf:consumer 启动消费者的性能测试。生成的报告文件可以在参数“sysTest.reportDir”指定的目录中找到。
activemq-perf:producer 启动生产者的性能测试。生成的报告文件可以在参数“sysTest.reportDir”指定的目录中找到。

注意:消费者和生产者的参数将在下一节中介绍。(示例报告

运行 JMS 客户端(生产者/消费者)系统配置

配置键 默认值 描述
sysTest.propsConfigFile null 使用在键值属性文件中外部指定的属性
sysTest.clientPrefix JmsConsumer 或 JmsProducer 指定将用于每个系统的客户端名称前缀。默认情况下,它将对消费者系统使用 JmsConsumer,对生产者系统使用 JmsProducer。
sysTest.numClients 1 指定要启动的 JMS 客户端数量。
sysTest.totalDests 1 指定整个系统测试要使用的目标总数。
sysTest.destDistro all 指定如何将目标分配给客户端。可用的值是(无效的值将导致使用默认值“all”):‘all’ - 所有客户端将向所有目标发送/接收消息。例如,如果有 2 个生产者和 5 个目标,每个生产者将向每个目标发送一条消息。‘equal’ - 客户端将目标平均分配给它们自己。例如,如果有 2 个生产者和 5 个目标,每个生产者将向 2 个目标发送消息。第五个目标将不会使用。‘divide’ - 客户端将分配目标,而不管是否相等。例如,如果有 2 个生产者和 5 个目标,生产者 1 将向 3 个目标发送消息,而生产者 2 将向 2 个目标发送消息。
sysTest.reportDir ./ 保存样本报告的目录。
sysTest.reportName null 样本报告将保存使用的默认文件名。通常不需要设置此设置,因为默认值将创建 JmsProducer_numClients#_numDests#_.xml 和 JmsConsumer_numClients#_numDests#_.xml,其中 # 表示为该系统设置的客户端和目标数量,以及指定该系统的目标分配。
sysTest.reportType xml 指定生成性能报告的方式。可用的值是:‘xml’ - 将性能报告写入 XML 文件。由 reportDirectory 和 reportName 指定。测试结束后还会显示一个详细的摘要。‘verbose’ - 所有信息都将写入标准输出,包括设置、样本数据和性能摘要。
sysTest.samplers tp,cpu 指定将启动的采样器。要使用多个采样器,请用逗号分隔值,不要加空格。可用的值是:‘tp’ - 吞吐量采样器。‘cpu’ - CPU 使用率采样器。
sysTest.spiClass org.apache.activemq.tool.spi.ActiveMQClassLoaderSPI 服务提供者接口类,允许客户端创建通用的连接工厂。目前可用的 SPI 类包括:‘org.apache.activemq.tool.ActiveMQPojoSPI’ 和 ‘org.apache.activemq.tool.ActiveMQClassLoaderSPI’

注意:如果目标数量少于客户端数量,并且分配类型为“equal”或“divide”,则每个客户端将只向一个目标发送/接收消息,将目标分配给客户端。例如,如果有 5 个生产者和 2 个目标,则 3 个生产者将向目标 1 发送消息,2 个生产者将向目标 2 发送消息。此外,消费者只能从一个目标接收消息,除非支持并指定了复合目标。

运行 JMS 生产者配置

配置键 默认值 描述
producer.sessTransacted false 指定创建的会话是否为事务性。有关详细信息,请参阅 JMS 规范。
producer.sessAckMode autoAck 指定会话的确认模式。有关详细信息,请参阅 JMS 规范。可用的值是:‘autoAck’ - Session.AUTO_ACKNOWLEDGE。‘clientAck’ - Session.CLIENT_ACKNOWLEDGE。‘dupsAck’ - Session.DUPS_OK_ACKNOWLEDGE。‘transacted’ - Session.TRANSACTED
producer.commitAfterXMsgs 1 发送指定数量的消息后提交事务。仅在与事务性 JMS 会话结合使用时才使用(producer.sessTransacted=true 且 producer.sessAckMode=transacted)。
producer.destName TEST.FOO 要使用的目标名称的前缀。要指定队列,请在目标名称前添加前缀“queue://”,对于主题,请在目标名称前添加前缀“topic://”。如果没有指定前缀,将创建一个主题。
producer.destComposite false 如果有多个目标,并且 destComposite=true,则目标将合并为一个。这假设提供者支持复合目标。
producer.deliveryMode nonpersistent 将用于每个生产者的消息传递模式。可用的值是:‘nonpersistent’ - 使用非持久性传递模式。javax.jms.DeliveryMode.NON_PERSISTENT。‘persistent’ - 使用持久性传递模式。javax.jms.DeliveryMode.PERSISTENT。
producer.messageSize 1024 字节 要发送的每个文本消息的大小。
producer.msgFileName null 如果您想从特定文件发送固定消息。该文件需要是文本文件。文件的所有内容都将作为消息正文发送。指定包含要发送消息的文件将使生产者忽略属性 producer.messageSize。使用相对路径或完整路径。示例:-Dproducer.msgFileName=../message.xml
producer.createNewMsg false 如果为 true,则每次发送都将创建一个新的 JMS 消息,其大小为指定的消息大小,并包含递增的文本消息(即文本消息 1、文本消息 2、…)。如果为 false,则在发送循环开始前只创建一条消息,并且这条消息将被反复发送。
producer.sendDelay 0 毫秒 在每条消息后暂停生产者 sendDelay 毫秒(允许生产者节流)。
producer.sendType time 基于时间或基于消息数量发送。可用的值是:‘time’ - 持续发送消息,直到经过特定的时间间隔。‘count’ - 持续发送消息,直到发送了 N 条消息。
producer.sendCount 1000000 条消息(100 万) 如果 sendType=count,则发送此数量的消息。
producer.sendDuration 300000 毫秒(5 分钟) 如果 sendType=time,则发送消息的时间为毫秒数。
producer.header none 指定要设置在所有消息上的消息头。头使用 name=value 语法,可以用“:”分隔。可以在单个 producer.header 行上设置多个头,例如 producer.header=”JMSType=car:MyHeader=MyValue”(没有空格)。只允许一行 producer.header!

运行 JMS 消费者配置

配置键 默认值 描述
consumer.sessTransacted false 指定创建的会话是否为事务性。有关详细信息,请参阅 JMS 规范。
consumer.sessAckMode autoAck 指定会话的确认模式。有关详细信息,请参阅 JMS 规范。可用的值是:‘autoAck’ - Session.AUTO_ACKNOWLEDGE。‘clientAck’ - Session.CLIENT_ACKNOWLEDGE。‘dupsAck’ - Session.DUPS_OK_ACKNOWLEDGE。‘transacted’ - Session.TRANSACTED
consumer.commitAfterXMsgs 1 发送指定数量的消息后提交事务。仅在与事务性 JMS 会话结合使用时才使用(consumer.sessTransacted=true 且 consumer.sessAckMode=transacted)。
consumer.destName TEST.FOO 要使用的目标名称的前缀。要指定队列,请在目标名称前添加前缀“queue://”,对于主题,请在目标名称前添加前缀“topic://”。如果没有指定前缀,将创建一个主题。
consumer.destComposite false 如果有多个目标,并且 destComposite=true,则目标将合并为一个。这假设提供者支持复合目标。
consumer.durable false 如果为 true,则创建持久订阅,否则创建消息消费者。有关详细信息,请参阅 JMS 规范。
consumer.asyncRecv true 如果为 true,则使用 onMessage() 方法异步接收消息,否则使用 receive() 方法。
consumer.recvDelay 0 毫秒 在每条消息后暂停消费者 recvDelay 毫秒(允许消费者节流)。
consumer.recvType time 基于时间或基于消息数量接收。可用的值是:‘time’ - 持续接收消息,直到经过特定的时间间隔。‘count’ - 持续接收消息,直到接收了 N 条消息。
consumer.recvCount 1000000 条消息(100 万) 如果 recvType=count,则接收此数量的消息。
consumer.recvDuration 300000 毫秒(5 分钟) 如果 recvType=time,则接收消息的持续时间为毫秒数。
consumer.messageSelector none 为所有消费者指定 消息选择器。例如 consumer.messageSelector=”MyHeader = ‘MyValue’ AND JMSType = ‘car’”

注意:如果您有多个消费者从多个目标接收消息,最好将 sysTest.destDistro 更改为“equal”,因为默认情况下它使用“all”,并且消费者只能从一个目标接收消息,因此所有消费者将只从列表中的第一个目标接收消息。

SPI 连接工厂配置:org.apache.activemq.tool.spi.ActiveMQPojoSPI

描述:这提供了有关配置由 ActiveMQPojoSPI 创建的 JMS 连接工厂的详细信息。默认值基于服务提供者 org.apache.activemq.ActiveMQConnectionFactory 的默认值。

配置键 默认值 描述
factory.brokerURL tcp://127.0.0.1:61616 客户端将连接到的代理的 URL。
factory.userName null 连接要使用的用户名。
factory.password null 连接要使用的密码。
factory.clientID null 连接将使用的客户端 ID。如果未指定,将自动生成。
factory.asyncSend false 如果为 true,则异步发送消息。
factory.asyncDispatch false 如果为 true,则异步分发消息。
factory.asyncSession true 如果为 true,会话将异步分发消息。
factory.closeTimeout 15000 毫秒  
factory.copyMsgOnSend true 如果为 true,则创建要发送的消息的副本。
factory.disableTimestamp false 如果为 true,则禁用设置 JMSTimestamp。
factory.deferObjSerial false 如果为 true,则延迟消息对象的序列化。
factory.optimAck true 如果为 true,则优化消息的确认。
factory.optimDispatch true 如果为 true,则优化消息的分发。
factory.prefetchQueue 1000 条消息 队列使用者将在处理之前缓存到 RAM 中的消息数量。
factory.prefetchTopic 32766 条消息 主题使用者将在处理之前缓存到 RAM 中的消息数量。
factory.useCompression false 如果为 true,则压缩消息数据。
factory.useRetroactive false 如果为 true,则使使用者具有追溯性。

SPI 连接工厂的配置:org.apache.activemq.tool.spi.ActiveMQClassLoaderSPI

描述: 这提供了有关配置由 ActiveMQClassLoaderSPI 创建的 JMS 连接工厂的详细信息。默认值基于服务提供者 org.apache.activemq.ActiveMQConnectionFactory 的默认值。

ActiveMQClassLoaderSPI 从类路径加载 org.apache.activemq.ActiveMQConnectionFactory 并使用反射对其进行配置。配置通常基于加载的类的 API。通用格式为 factory.YYYfactory.XXX.YYY,其中最后一个变量 (YYY) 是要设置的属性,中间的所有内容都是用于设置 (YYY) 的类的 getter。例如

  1. 要设置 ActiveMQConnectionFactory 中 asyncSend 的值,请使用
    factory.useAsyncSend=true
    

    这等同于调用

    factory.setUseAsyncSend(true)
    
  2. 要设置 ActiveMQConnectionFactory 的队列预取,请使用
    factory.prefetchPolicy.queuePrefetch=1
    

    这等同于调用

    factory.getPrefetchPolicy().setQueuePrefetch(1)
    

需要注意的是,加载的类应该实现适当的 getter 和 setter 方法。嵌套对象也应该被正确实例化。有关配置此 SPI 的更多信息,请参阅特定提供商的 API 手册。

从 ActiveMQ Classic 4.0.1 开始,以下是可以使用的字段和默认值

配置键 默认值
factory.prefetchPolicy.optimizeDurableTopicPrefetch 1000
factory.prefetchPolicy.durableTopicPrefetch 100
factory.password null
factory.prefetchPolicy.queueBrowserPrefetch 500
factory.useCompression false
factory.disableTimeStampsByDefault false
factory.optimizedMessageDispatch true
factory.useRetroactiveConsumer false
factory.alwaysSessionAsync true
factory.copyMessageOnSend true
factory.prefetchPolicy.topicPrefetch 32766
factory.useAsyncSend false
factory.redeliveryPolicy.backOffMultiplier 5
factory.prefetchPolicy.inputStreamPrefetch 100
factory.closeTimeout 15000
factory.userName null
factory.optimizeAcknowledge false
factory.clientID null
factory.objectMessageSerializationDefered false
factory.asyncDispatch false
factory.redeliveryPolicy.initialRedeliveryDelay 1000
factory.prefetchPolicy.queuePrefetch 1000
factory.redeliveryPolicy.maximumRedeliveries 5
factory.redeliveryPolicy.useCollisionAvoidance false
factory.prefetchPolicy.maximumPendingMessageLimit 0
factory.redeliveryPolicy.useExponentialBackOff false

采样器的配置

性能测试工具中内置了两个采样器。两者都使用相同的配置键进行配置,只是前缀不同。

采样器 samplerName
吞吐量采样器 tpSampler
CPU 采样器 cpuSampler

例如,可以使用上面的前缀分别为单个测试运行配置两个采样器,如下所示

mvn activemq-perf:producer -DtpSampler.duration=10000 -DcpuSampler.duration=15000

默认情况下,在测试运行中使用两个采样器。但是,这可以通过使用 sysTest.samplers 属性来覆盖。

ActiveMQ Classic 5.11 之前

采样器配置未绑定到测试运行,因此采样器有可能运行的时间比实际测试本身更长。对于短时间运行,采样器甚至可能在测试完成之前尚未启动。

配置键 默认值 描述
<samplerName>.duration 300000 采样器运行的总持续时间(以毫秒为单位),包括启动和关闭时间。
<samplerName>.rampUpTime 30000 采样器的启动时间,采样将在启动时间后开始。
<samplerName>.rampDownTime 30000 采样器的关闭时间,采样将在采样器执行了 (duration - rampUpTime - rampDownTime) 毫秒后停止。
<samplerName>.interval 1000 采样器采集数据的间隔(以毫秒为单位)。

从 ActiveMQ Classic 5.11 开始

采样器运行持续时间直接与客户端(生产者/使用者)的行为相关。由于基于计数的测试(其中 consumer.recvType 或 producer.sendType 设置为 count)的非确定性,持续时间、启动和关闭时间将被忽略;采样器在客户端完成后关闭。

配置键 默认值 描述
<samplerName>.duration 对于基于时间的测试,与使用者或生产者的持续时间匹配。对于基于计数的测试,将被忽略。 采样器运行的总持续时间(以毫秒为单位),包括启动和关闭时间。
<samplerName>.rampUpTime null;将延迟到 rampUpPercent。对于基于计数的测试,将被忽略。 采样器的启动时间,采样将在启动时间后开始。
<samplerName>.rampDownTime null;将延迟到 rampDownPercent。对于基于计数的测试,将被忽略。 采样器的关闭时间,采样将在采样器执行了 (duration - rampUpTime - rampDownTime) 毫秒后停止。
<samplerName>.rampUpPercent 0 对于基于计数的测试,将被忽略。 采样器应使用来启动的总运行持续时间的百分比 (0-100)。被 rampUpTime 覆盖。
<samplerName>.rampDownPercent 0 对于基于计数的测试,将被忽略。 采样器应使用来关闭的总运行持续时间的百分比 (0-99)。被 rampDownTime 覆盖。
<samplerName>.interval 1000 采样器采集数据的间隔(以毫秒为单位)。

启动和关闭所需的时间,无论是以毫秒还是百分比定义,都不能超过总持续时间。

Apache、ActiveMQ、Apache ActiveMQ、Apache 羽毛标志和 Apache ActiveMQ 项目标志是 Apache 软件基金会的商标。版权所有 © 2024,Apache 软件基金会。根据 Apache 许可证 2.0 许可。