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#_ |
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.YYY
或 factory.XXX.YYY
,其中最后一个变量 (YYY
) 是要设置的属性,中间的所有内容都是用于设置 (YYY
) 的类的 getter。例如
- 要设置 ActiveMQConnectionFactory 中 asyncSend 的值,请使用
factory.useAsyncSend=true
这等同于调用
factory.setUseAsyncSend(true)
- 要设置 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 | 采样器采集数据的间隔(以毫秒为单位)。 |
启动和关闭所需的时间,无论是以毫秒还是百分比定义,都不能超过总持续时间。