From e8b3bdb866d8511e7f8b12b0219b238564f50354 Mon Sep 17 00:00:00 2001 From: "Frederick G. Oconer" Date: Wed, 7 Jun 2006 09:24:10 +0000 Subject: [PATCH] Added all System properties in the generated report xml file and also included a readme.txt that contains information on how to use the performance test module. git-svn-id: https://svn.apache.org/repos/asf/incubator/activemq/trunk@412342 13f79535-47bb-0310-9956-ffa450edef68 --- activemq-perftest/readme.txt | 267 ++++++++++++++++++ .../activemq/tool/PerfReportGenerator.java | 33 ++- 2 files changed, 288 insertions(+), 12 deletions(-) create mode 100644 activemq-perftest/readme.txt diff --git a/activemq-perftest/readme.txt b/activemq-perftest/readme.txt new file mode 100644 index 0000000000..45bf27acbe --- /dev/null +++ b/activemq-perftest/readme.txt @@ -0,0 +1,267 @@ +#################################################################################################### +# Running Maven 2 Performance Test +#################################################################################################### +Goals | Description +-----------------------|---------------------------------------------------------- + activemq-perf:broker | Starts broker using the activemq configuration file located in + | "src\main\resources\broker-conf" where the default config is + | activemq.xml. + | + | Parameters: + | 1. -DconfigType - specifies the type of configuration to use. + | Its value must be one of the filename in the + | "..\broker-config" directory (e.g. -DconfigType=kaha). + | 2. -DconfigFile - path to config file other than those in + | "src\..\broker-config". + | (e.g -DconfigFile=c:\dir\activemq.xml) + | + activemq-perf:consumer| Starts the consumer's performance testing. + | + activemq-perf:producer| Starts the producer's performance testing. + | + | * Note: The parameters for both consumer and producers are described on + | the next section. Also, the generated report is stored in the directory + | specified in the parameter "sysTest.reportDirectory". + | + +#################################################################################################### +# Configuration for running a system of JMS Clients (Producer/Consumer) +#################################################################################################### +Configuration Key | Default Value | Description +-------------------------|------------------|---------------------------------------------------------- + sysTest.numClients | 1 | Specifies the number of JMS Clients to start. + | | + sysTest.totalDests | 1 | Specifies the total number of destinations to use for the + | | whole system test. + | | + sysTest.destDistro | all | Specifies how to distribute the destinations to the + | | clients. Available values are (Invalid value will result + | | to using the default value 'all')*: + | | 'all' - All clients will send/receive to all destinations. + | | i.e. if there are 2 producers and 5 destinations, + | | each producer will send a message to each + | | individual destination. + | | 'equal' - Clients will equally divide the destinations + | | among themselves. i.e. if there are 2 producers and + | | 5 destinations, each producer will send messages to + | | 2 destinations. The fifth destination will not be + | | used. + | | 'divide' - Clients will divide the destinations among + | | themselves regardless of equality. i.e. if there + | | are 2 producers and 5 destinations, producer 1 will + | | send to 3 destinations, while producer 2 will send + | | to 2 destinations. + | | + sysTest.reportDirectory | target/perf-test | The directory where the sampler report will be saved. + | | + +* Note: If the number of destinations is less than the number of clients and the distribution type is + either 'equal' or 'divide', each client will send/receive from only one destination, distributing the + destinations among the clients. i.e. if there are 5 producers and 2 destinations, 3 producers will + send to destination 1, and 2 producers will send to destination 2. Also, a consumer can only receive from + a single destination, unless composite destination is supported and specified. + +#################################################################################################### +# Configuration for running a JMS Producer +#################################################################################################### +Configuration Key | Default Value | Description +-------------------------|---------------|---------------------------------------------------------- + producer.spiClass | null | The service provider interface class that allows the + | | client to create a generic connection factory. Current + | | available SPI classes include: + | | 1. 'org.apache.activemq.tool.ActiveMQPojoSPI' + | | 2. 'org.apache.activemq.tool.ActiveMQClassLoaderSPI' + | | + producer.sessTransacted | false | Specifies if the session created will be transacted or + | | not. See the JMS Specifications for more details. + | | + producer.sessAckMode | autoAck | Specified the acknowledge mode of the session. See the + | | JMS Specifications for more details. Available values are: + | | 1. 'autoAck' - Session.AUTO_ACKNOWLEDGE + | | 2. 'clientAck' - Session.CLIENT_ACKNOWLEDGE + | | 3. 'dupsAck' - Session.DUPS_OK_ACKNOWLEDGE + | | 4. 'transacted' - Session.TRANSACTED + | | + producer.destName | TEST.FOO | The prefix of the destination name to use. To specify a + | | queue, prefix the destination name with 'queue://', for + | | topics, prefix the destination with 'topic://'. If no + | | prefix is specified, a topic will be created. + | | + producer.destCount | 1 | The number of destinations assigned to this client.* + | | + producer.destIndex | 0 | The starting index of the destination name. i.e. if + | | destName='TEST.FOO', destCount=3, destIndex=3, 3 topics + | | will be created with names, TEST.FOO.3, TEST.FOO.4, + | | TEST.FOO.5.* + | | + producer.destComposite | false | If there are more than one destination, and destComposite= + | | true, the destinations will be merged into one. This + | | assumes that the provider supports composite destinations. + | | + producer.messageSize | 1024 bytes | The size of each text message to send. + | | + producer.sendType | time | Send either time-based or message-count-based. Available + | | values are: + | | 1. 'time' - keep sending messages until a specific + | | interval of time elapses. + | | 2. 'count' - keep sending messages until N messages has + | | been sent. + | | + producer.sendCount | 1000000 msgs | If sendType=count, send this number of messages. + | (1 million) | + | | + producer.sendDuration | 300000 ms | If sendType=time, send messages for this number of + | (5 mins) | milliseconds. + | | + +* Note: If you are using the Producer JMS System to create the producers, you need not bother with + these settings, as this will be overwritten by the destination distribution method. i.e. if you + specify 2 producers, 5 destinations, and equal distribution, producer 1 will have a destCount=2 + and a destIndex=0, while producer 2 will have a destCount=2, and a destIndex=2. Any previous value + will be overwritten. + +#################################################################################################### +# Configuration for running a JMS Consumer +#################################################################################################### +Configuration Key | Default Value | Description +-------------------------|--------------------|----------------------------------------------------- + consumer.spiClass | null | The service provider interface class that allows the + | | client to create a generic connection factory. + | | Current available SPI classes include: + | | 1. 'org.apache.activemq.tool.ActiveMQPojoSPI' + | | 2. 'org.apache.activemq.tool.ActiveMQClassLoaderSPI' + | | + consumer.sessTransacted | false | Specifies if the session created will be transacted + | | or not. See the JMS Specifications for more details. + | | + consumer.sessAckMode | autoAck | Specified the acknowledge mode of the session. See the + | | JMS Specifications for more details. Available values + | | are: + | | 1. 'autoAck' - Session.AUTO_ACKNOWLEDGE + | | 2. 'clientAck' - Session.CLIENT_ACKNOWLEDGE + | | 3. 'dupsAck' - Session.DUPS_OK_ACKNOWLEDGE + | | 4. 'transacted' - Session.TRANSACTED + | | + consumer.destName | TEST.FOO | The prefix of the destination name to use. To + | | specify a queue, prefix the destination name with + | | 'queue://', for topics, prefix the destination with + | | 'topic://'. If no prefix is specified, a topic will + | | be created. + | | + consumer.destCount | 1 | The number of destinations assigned to this client.* + | | + consumer.destIndex | 0 | The starting index of the destination name. i.e. if + | | destName='TEST.FOO', destCount=3, destIndex=3, + | | 3 topics will be created with names, TEST.FOO.3, + | | TEST.FOO.4, TEST.FOO.5.* + | | + consumer.destComposite | false | If there are more than one destination, and + | | destComposite=true, the destinations will be merged + | | into one. This assumes that the provider supports + | | composite destinations. + | | + consumer.durable | false | If true, create a durable subscriber, otherwise + | | create a message consumer. See the JMS Specifications + | | for more details. + | | + consumer.asyncRecv | true | If true, asynchronously receive messages using the + | | onMessage() method, otherwise use the receive() + | | method. + | | + consumer.consumerName | TestConsumerClient | Prefix that will be use for the subscription of the + | | consumer. Generally used for durable subscriber. + | | + consumer.recvType | time | Receive either time-based or message-count-based. + | | Available values are: + | | 1. 'time' - keep receiving messages until a + | | specific time interval has elapsed. + | | 2. 'count' - keep receiving until N messages + | has been received. + | | + consumer.recvCount | 1000000 msgs | If recvType=count, receive this much messages. + | (1 million) | + | | + consumer.recvType | 300000 ms | If recvType=time, receive messages for this specific + | (5 mins) | time duration. + | | + +* Note: If you are using the Consumer JMS System to create the consumers, you need not bother with + these settings, as this will be overwritten by the destination distribution method. i.e. if you + specify 2 consumer, 5 destinations, and equal distribution, consumer 1 will have a destCount=2 + and a destIndex=0, while consumer 2 will have a destCount=2, and a destIndex=2. Any previous value + will be overwritten. Although, it should be noted that unless composite destination is supported + and specified, each consumer will choose only one destination to receive from. + +#################################################################################################### +# Configuration for SPI Connection Factory: org.apache.activemq.tool.spi.ActiveMQPojoSPI +# Description: This provides details in configuring the JMS Connection Factory created by +# ActiveMQPojoSPI. Default values are based from the default values of the service +# provider org.apache.activemq.ActiveMQConnectionFactory. +#################################################################################################### + +Configuration Key | Default Value | Description +--------------------------|-----------------------|-------------------------------------------------- + factory.brokerUrl | tcp://localhost:61616 | The url of the broker the client will connect to. + | | + factory.username | null | Username on the connection to use. + | | + factory.password | null | Password on the connection to use. + | | + factory.clientID | null | Client ID the connection will use. If none is + | | specified, it will be automatically generated. + | | + factory.asyncSend | false | If true, asynchronously send messages + | | + factory.asyncDispatch | false | If true, asynchronously dispatch messages + | | + factory.asyncSession | true | If true, session will dispatch messages + | | asynchronously. + | | + factory.closeTimeout | 15000 ms | + | | + factory.copyMsgOnSend | true | If true, creates a copy of the message to be sent + | | + factory.disableTimestamp | false | If true, disable the setting of the JMSTimestamp. + | | + factory.deferObjSerial | false | If true, defer the serialization of message objects. + | | + factory.onSendPrepMsg | true | If true, prepare a message before sending it. + | | + factory.optimAck | true | If true, optimizes the acknowledgement of messages. + | | + factory.optimDispatch | true | If true, optimizes the dispatching of messages. + | | + factory.prefetchQueue | 1000 messages | Number of messages a queue consumer will cache + | | in RAM before processing it. + | | + factory.prefetchTopic | 32766 messages | Number of messages a topic consumer will cache + | | in RAM before processing it. + | | + factory.useCompression | false | If true, compress message data. + | | + factory.useRetroactive | false | If true, make consumers retroactive. + | | + + +#################################################################################################### +# Configuration for SPI Connection Factory: org.apache.activemq.tool.spi.ActiveMQClassLoaderSPI +# Description: This provides details in configuring the JMS Connection Factory created by +# ActiveMQClassLoaderSPI. Default values are based from the default values of the +# service provider org.apache.activemq.ActiveMQConnectionFactory. +#################################################################################################### + +ActiveMQClassLoaderSPI loads from the classpath "org.apache.activemq.ActiveMQConnectionFactory" and +configures it using reflection. Configuration is generally based on the API of the class loaded. +General format is factory.YYY or factory.XXX.YYY, where the last variable (YYY) is the property to +set and everything in between is the getter of the class to use to set (YYY). For example: + +1. To set the value for asyncSend in ActiveMQConnectionFactory, use: + factory.useAsyncSend=true, which is equivalent to calling factory.setUseAsyncSend(true); + +2. To set the queue prefetch for ActiveMQConnectionFactory, use: + factory.prefetchPolicy.queuePrefetch=1, which is equivalent to calling + factory.getPrefetchPolicy().setQueuePrefetch(1); + +It should be noted that the loaded class should implement the appropriate getter and setter methods. +Nested objects should also be properly instantiated. For more information on configuring this SPI, +refer to the specific provider API manual. \ No newline at end of file diff --git a/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/PerfReportGenerator.java b/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/PerfReportGenerator.java index 76ed2366dd..e6928846c8 100644 --- a/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/PerfReportGenerator.java +++ b/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/PerfReportGenerator.java @@ -77,24 +77,34 @@ public class PerfReportGenerator { writer.println(""); writer.println(""); - writer.println("" + System.getProperty("os.name") + ""); - writer.println("" + System.getProperty("java.version") + ""); + Enumeration keys; + String key; + + // Add system property settings + writer.println(""); + + Properties sysProp = System.getProperties(); + keys = sysProp.keys(); + + while (keys.hasMoreElements()) { + key = (String) keys.nextElement(); + writer.println("<" + key + ">" + getTestSettings().get(key) + ""); + } + + writer.println(""); + + // Add client property settings + writer.println(""); if (this.getTestSettings() != null) { - Enumeration keys = getTestSettings().propertyNames(); + keys = getTestSettings().propertyNames(); - writer.println(""); - - String key; - String key2; while (keys.hasMoreElements()) { key = (String) keys.nextElement(); - key2 = key.substring(key.indexOf(".") + 1); - writer.println("<" + key2 + ">" + getTestSettings().get(key) + ""); + writer.println("<" + key + ">" + getTestSettings().get(key) + ""); } - - writer.println(""); } + writer.println(""); writer.println(""); writer.println(""); @@ -104,7 +114,6 @@ public class PerfReportGenerator { return this.writer; } - public String getReportDirectory() { return reportDirectory; }