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#.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'

注意:如果目的地的數量少於用戶端的數量,且分配類型為「相等」或「分割」,則每個用戶端只會從一個目的地傳送/接收,並在用戶端之間分配目的地。也就是說,如果有 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.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 專案標誌是 The Apache Software Foundation 的商標。版權所有 © 2024,The Apache Software Foundation。根據 Apache License 2.0 授權。