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 外掛程式的 Maven2 專案目錄中。
開始使用
若要開始使用,請切換到 sandbox repo 中的 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 中輸入下列命令(如果您已預先設定並正在執行的 Broker,則 Broker 行是選填的)
mvn activemq-perf:broker -Durl=broker:tcp://127.0.0.1:61616
mvn activemq-perf:consumer
mvn activemq-perf:producer
如果您在不同的電腦上執行 Broker,請將生產者和消費者命令變更為
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 組態檔啟動 Broker,其中預設組態為 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 | 使用在 key=value 屬性檔中外部指定的屬性 |
sysTest.clientPrefix |
JmsConsumer 或 JmsProducer | 指定將用於每個系統的用戶端名稱字首。依預設,消費者系統會使用 JmsConsumer,而生產者系統會使用 JmsProducer。 |
sysTest.numClients |
1 | 指定要啟動的 JMS 用戶端數量。 |
sysTest.totalDests |
1 | 指定整個系統測試要使用的目的地總數。 |
sysTest.destDistro |
全部 | 指定如何將目的地分配給用戶端。可用值為(無效值會導致使用預設值「全部」): 「全部」- 所有用戶端都會傳送/接收到所有目的地。也就是說,如果有 2 個生產者和 5 個目的地,則每個生產者都會將訊息傳送到每個個別目的地。 「相等」- 用戶端將在它們之間平均分配目的地。也就是說,如果有 2 個生產者和 5 個目的地,則每個生產者都會將訊息傳送到 2 個目的地。第五個目的地將不會使用。 「分割」- 用戶端將在它們之間分割目的地,而不考慮是否相等。也就是說,如果有 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' |
注意:如果目的地的數量少於用戶端的數量,且分配類型為「相等」或「分割」,則每個用戶端只會從一個目的地傳送/接收,並在用戶端之間分配目的地。也就是說,如果有 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 |
時間 | 根據時間或訊息計數傳送。可用值為:「時間」- 持續傳送訊息直到經過特定的時間間隔。 「計數」- 持續傳送訊息直到已傳送 N 個訊息。 |
producer.sendCount |
1000000 個訊息 (1 百萬) | 如果 sendType=count,則傳送此數量的訊息。 |
producer.sendDuration |
300000 毫秒 (5 分鐘) | 如果 sendType=time,則在此毫秒數的時間內傳送訊息。 |
producer.header |
無 | 指定要在所有訊息上設定的訊息標頭。標頭使用 name=value 語法,並可以使用「:」分隔。可以在單一生產者標頭行上設定一個以上的標頭,例如 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 |
時間 | 根據時間或訊息計數接收。可用值為:「時間」- 持續接收訊息直到經過特定的時間間隔。 「計數」- 持續接收直到已接收 N 個訊息。 |
consumer.recvCount |
1000000 個訊息 (1 百萬) | 如果 recvType=count,則接收此數量的訊息。 |
consumer.recvDuration |
300000 毫秒 (5 分鐘) | 如果 recvType=time,則在此特定的時間長度內接收訊息。 |
consumer.messageSelector |
無 | 為所有消費者指定訊息選取器。例如,consumer.messageSelector=”MyHeader = ‘MyValue’ AND JMSType = ‘car’” |
注意:如果您有一個以上的消費者從多個目的地接收訊息,最好將 sysTest.destDistro 變更為「相等」,因為預設情況下,它會使用「全部」,而消費者只能從單一目的地接收訊息,因此所有消費者只會從清單中的第一個目的地接收訊息。
SPI 連線處理站的組態:org.apache.activemq.tool.spi.ActiveMQPojoSPI
描述:這會提供設定由 ActiveMQPojoSPI 建立的 JMS 連線處理站的詳細資料。預設值是以服務提供者 org.apache.activemq.ActiveMQConnectionFactory 的預設值為基礎。
組態金鑰 | 預設值 | 描述 |
---|---|---|
factory.brokerURL |
tcp://127.0.0.1:61616 | 用戶端將連線的 Broker 的 URL。 |
factory.userName |
null | 連線要使用的使用者名稱。 |
factory.password |
null | 連線要使用的密碼。 |
factory.clientID |
null | 連線將使用的用戶端 ID。如果未指定任何用戶端 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 | 取樣器將取樣資料的間隔(以毫秒為單位)。 |
啟動和關閉所花費的時間(無論是以毫秒為單位定義還是以百分比定義)都不能超過總持續時間。