You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@activemq.apache.org by Rick <2t...@gmail.com> on 2006/09/14 05:11:24 UTC

AMQ Beginner - slow producer

public class ActiveMqTest {
	
	public ActiveMqTest() {
	}
	///////////////////////////////////////////////////////
	// Just getting started with ActiveMQ.
	// I must be doing something very wrong to be getting such poor performance
on local sends (21 messages/sec).
	// Please take a quick look and see if there is something obvious.
	// This code is a derivative of HelloWorldProducer at
http://www.activemq.org/site/hello-world.html.
        // Thank you in advance for any help!
	///////////////////////////////////////////////////////
	// ActiveMQ version: ActiveMQ 4.0-M4 (per activemq --version)
	// OS, HW: Windows 2000 SP4; 900Mhz Pentium Dell Inspiron 8000 laptop,
512MB RAM
	// Broker started on local machine
	// Broker output follows:
	//
	// C:\activemq>bin\activemq
	// ACTIVEMQ_HOME: C:\activemq
	// Loading message broker from: xbean:activemq.xml
	// INFO  BrokerService                  - ActiveMQ 4.0-M4 JMS Message
Broker (localhost) is starting
	// INFO  BrokerService                  - For help or more information
please see: http://www.logicblaze.com
	// INFO  JDBCPersistenceAdapter         - Database driver recognized:
[apache_derby_embedded_jdbc_driver]
	// INFO  JournalPersistenceAdapter      - Journal Recovery Started from:
Active Journal: using 5 x 20.0 Megs at: ..\activemq-data\journal
	// INFO  JournalPersistenceAdapter      - Journal Recovered: 1 message(s)
in transactions recovered.
	// INFO  TransportServerThreadSupport   - Listening for connections at:
tcp://richlaptop:61616
	// INFO  TransportConnector             - Accepting connection on:
tcp://richlaptop:61616
	// WARN  MulticastDiscoveryAgent        - brokerName not set
	// INFO  TransportServerThreadSupport   - Listening for connections at:
tcp://richlaptop:61617?wireFormat=stomp
	// INFO  TransportConnector             - Accepting connection on:
tcp://richlaptop:61617?wireFormat=stomp
	// INFO  BrokerService                  - ActiveMQ JMS Message Broker
(localhost) started
	// INFO  NetworkConnector               - Establishing network connection
between vm://localhost?network=true and null at
failover:tcp://richlaptop:6161
	// INFO  VMTransportFactory             - binding to broker: localhost
	// INFO  TransportConnector             - Accepting connection on:
vm://localhost
	// INFO  ManagementContext              - JMX consoles can connect to
service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi
	// INFO  DemandForwardingBridge         - Starting a network connection
between vm://localhost#0 and unconnected has been established.
	// INFO  DemandForwardingBridge         - Disconnecting loop back
connection.
	// INFO  VMTransportFactory             - Shutting down VM connectors for
broker: localhost
	// INFO  VMTransportFactory             - Shutting down VM connectors for
broker: localhost	//
	//
	// C:\activemq\bin>java -version
	// java version "1.5.0_02"
	// Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_02-b09)
	// Java HotSpot(TM) Client VM (build 1.5.0_02-b09, mixed mode, sharing)
	//
	// Method output:
	// Sending 200 messages
	// Sent 200 messages at a rate of 21.13494663425975 messages per second
	// ------------------ NOTES ------------------
	// If setDeliveryMode to NON_PERSISTENT rate jumps to 995 per second
	// All config files unchanged from installation and all log/data files
under install dir several months old.
	///////////////////////////////////////////////////////
	public static void main( String [] args ) {
		javax.jms.Connection connection = null;
		javax.jms.Session session = null;
		try {
			// Setup
			org.apache.activemq.ActiveMQConnectionFactory connectionFactory = new
org.apache.activemq.ActiveMQConnectionFactory( "tcp://localhost:61616" );
			connection = connectionFactory.createConnection();
			session = connection.createSession( false,
javax.jms.Session.AUTO_ACKNOWLEDGE );
			javax.jms.Destination destination = session.createQueue( "TestQueue" );
			javax.jms.MessageProducer producer = session.createProducer( destination
);
			producer.setDeliveryMode( javax.jms.DeliveryMode.PERSISTENT );
			connection.start();
			// Build and send message numToSend times
			int numToSend = 200;
			javax.jms.TextMessage message = session.createTextMessage();
			System.out.println( "Sending " + numToSend + " messages" );
System.out.flush();
			long t1 = System.currentTimeMillis();
			for ( int i = 0; i < numToSend; ++i ) {
				message.setText( "Message#" + Integer.toString( i ) );
				producer.send( message );
			}
			long t2 = System.currentTimeMillis();
			// Compute and print out send rate
			double rate = ( double ) numToSend/( (  double ) ( t2 - t1 )/1000.0 );
			System.out.println( "Sent " + numToSend + " messages at a rate of " +
rate + " messages per second" ); System.out.flush();
		}
		catch ( Exception eOuter ) {
			eOuter.printStackTrace();
		}
		finally {
			// Clean up
			try {
				if ( session != null ) session.close();
				if ( connection != null ) connection.close();
			}
			catch ( Exception eInner ) {
				eInner.printStackTrace();
			}
		}
	}
	
}

-- 
View this message in context: http://www.nabble.com/AMQ-Beginner---slow-producer-tf2269364.html#a6298777
Sent from the ActiveMQ - User forum at Nabble.com.


Re: AMQ Beginner - slow producer

Posted by Rick <2t...@gmail.com>.
1) Thank you both for taking a look.
2) Disk (2000 year model) isn't particularly fast but no other processes
were doing major I/O, but the drive on my old 386 could probably surpass 20
msgs/sec.
3) I don't think AMQ would have reached rev. 4.x with 20 msgs/sec
performance so I don't think revision is the problem.
4) The one line change suggested by Adrian immediately jumped performance
over 20X. (async sends)
5) Successive runs produced: 740, 500, 380, 1200, 475, 416, 740, 465, 586
msgs/sec. - much better but quite a large variance
6) I'm very satisfied with this improvement/performance for my current
purposes.
7) I figured async sends would improve performance as would other tricks in
the forum web pages but didn't feel synchronous sends should be this slow -
especially on my local host; something seemed wrong.  I should have tried
the async send but I figured it would only give perhaps 30% better
performance - boy was I wrong.
8) I can live with slow synchronous sends for now.  I can now work on
optimization after I get my products working together using AMQ.  (Make
work, then optimize.)
9) Thanks again for taking a look!



Adrian Co wrote:
> 
> Hi,
> 
> Wonder if you can try setting useAsyncSend=true?
> 
> i.e.
> 
> connectionFactory.setUseAsyncSend(true);
> 
> 
> Rick wrote:
>> public class ActiveMqTest {
>> 	
>> 	public ActiveMqTest() {
>> 	}
>> 	///////////////////////////////////////////////////////
>> 	// Just getting started with ActiveMQ.
>> 	// I must be doing something very wrong to be getting such poor
>> performance
>> on local sends (21 messages/sec).
>> 	// Please take a quick look and see if there is something obvious.
>> 	// This code is a derivative of HelloWorldProducer at
>> http://www.activemq.org/site/hello-world.html.
>>         // Thank you in advance for any help!
>> 	///////////////////////////////////////////////////////
>> 	// ActiveMQ version: ActiveMQ 4.0-M4 (per activemq --version)
>> 	// OS, HW: Windows 2000 SP4; 900Mhz Pentium Dell Inspiron 8000 laptop,
>> 512MB RAM
>> 	// Broker started on local machine
>> 	// Broker output follows:
>> 	//
>> 	// C:\activemq>bin\activemq
>> 	// ACTIVEMQ_HOME: C:\activemq
>> 	// Loading message broker from: xbean:activemq.xml
>> 	// INFO  BrokerService                  - ActiveMQ 4.0-M4 JMS Message
>> Broker (localhost) is starting
>> 	// INFO  BrokerService                  - For help or more information
>> please see: http://www.logicblaze.com
>> 	// INFO  JDBCPersistenceAdapter         - Database driver recognized:
>> [apache_derby_embedded_jdbc_driver]
>> 	// INFO  JournalPersistenceAdapter      - Journal Recovery Started from:
>> Active Journal: using 5 x 20.0 Megs at: ..\activemq-data\journal
>> 	// INFO  JournalPersistenceAdapter      - Journal Recovered: 1
>> message(s)
>> in transactions recovered.
>> 	// INFO  TransportServerThreadSupport   - Listening for connections at:
>> tcp://richlaptop:61616
>> 	// INFO  TransportConnector             - Accepting connection on:
>> tcp://richlaptop:61616
>> 	// WARN  MulticastDiscoveryAgent        - brokerName not set
>> 	// INFO  TransportServerThreadSupport   - Listening for connections at:
>> tcp://richlaptop:61617?wireFormat=stomp
>> 	// INFO  TransportConnector             - Accepting connection on:
>> tcp://richlaptop:61617?wireFormat=stomp
>> 	// INFO  BrokerService                  - ActiveMQ JMS Message Broker
>> (localhost) started
>> 	// INFO  NetworkConnector               - Establishing network
>> connection
>> between vm://localhost?network=true and null at
>> failover:tcp://richlaptop:6161
>> 	// INFO  VMTransportFactory             - binding to broker: localhost
>> 	// INFO  TransportConnector             - Accepting connection on:
>> vm://localhost
>> 	// INFO  ManagementContext              - JMX consoles can connect to
>> service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi
>> 	// INFO  DemandForwardingBridge         - Starting a network connection
>> between vm://localhost#0 and unconnected has been established.
>> 	// INFO  DemandForwardingBridge         - Disconnecting loop back
>> connection.
>> 	// INFO  VMTransportFactory             - Shutting down VM connectors
>> for
>> broker: localhost
>> 	// INFO  VMTransportFactory             - Shutting down VM connectors
>> for
>> broker: localhost	//
>> 	//
>> 	// C:\activemq\bin>java -version
>> 	// java version "1.5.0_02"
>> 	// Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_02-b09)
>> 	// Java HotSpot(TM) Client VM (build 1.5.0_02-b09, mixed mode, sharing)
>> 	//
>> 	// Method output:
>> 	// Sending 200 messages
>> 	// Sent 200 messages at a rate of 21.13494663425975 messages per second
>> 	// ------------------ NOTES ------------------
>> 	// If setDeliveryMode to NON_PERSISTENT rate jumps to 995 per second
>> 	// All config files unchanged from installation and all log/data files
>> under install dir several months old.
>> 	///////////////////////////////////////////////////////
>> 	public static void main( String [] args ) {
>> 		javax.jms.Connection connection = null;
>> 		javax.jms.Session session = null;
>> 		try {
>> 			// Setup
>> 			org.apache.activemq.ActiveMQConnectionFactory connectionFactory = new
>> org.apache.activemq.ActiveMQConnectionFactory( "tcp://localhost:61616" );
>> 			connection = connectionFactory.createConnection();
>> 			session = connection.createSession( false,
>> javax.jms.Session.AUTO_ACKNOWLEDGE );
>> 			javax.jms.Destination destination = session.createQueue( "TestQueue"
>> );
>> 			javax.jms.MessageProducer producer = session.createProducer(
>> destination
>> );
>> 			producer.setDeliveryMode( javax.jms.DeliveryMode.PERSISTENT );
>> 			connection.start();
>> 			// Build and send message numToSend times
>> 			int numToSend = 200;
>> 			javax.jms.TextMessage message = session.createTextMessage();
>> 			System.out.println( "Sending " + numToSend + " messages" );
>> System.out.flush();
>> 			long t1 = System.currentTimeMillis();
>> 			for ( int i = 0; i < numToSend; ++i ) {
>> 				message.setText( "Message#" + Integer.toString( i ) );
>> 				producer.send( message );
>> 			}
>> 			long t2 = System.currentTimeMillis();
>> 			// Compute and print out send rate
>> 			double rate = ( double ) numToSend/( (  double ) ( t2 - t1 )/1000.0 );
>> 			System.out.println( "Sent " + numToSend + " messages at a rate of " +
>> rate + " messages per second" ); System.out.flush();
>> 		}
>> 		catch ( Exception eOuter ) {
>> 			eOuter.printStackTrace();
>> 		}
>> 		finally {
>> 			// Clean up
>> 			try {
>> 				if ( session != null ) session.close();
>> 				if ( connection != null ) connection.close();
>> 			}
>> 			catch ( Exception eInner ) {
>> 				eInner.printStackTrace();
>> 			}
>> 		}
>> 	}
>> 	
>> }
>>
>>   
> 
> 
> 

-- 
View this message in context: http://www.nabble.com/AMQ-Beginner---slow-producer-tf2269364.html#a6307503
Sent from the ActiveMQ - User forum at Nabble.com.


Re: AMQ Beginner - slow producer

Posted by Adrian Co <ac...@exist.com>.
Hi,

Wonder if you can try setting useAsyncSend=true?

i.e.

connectionFactory.setUseAsyncSend(true);


Rick wrote:
> public class ActiveMqTest {
> 	
> 	public ActiveMqTest() {
> 	}
> 	///////////////////////////////////////////////////////
> 	// Just getting started with ActiveMQ.
> 	// I must be doing something very wrong to be getting such poor performance
> on local sends (21 messages/sec).
> 	// Please take a quick look and see if there is something obvious.
> 	// This code is a derivative of HelloWorldProducer at
> http://www.activemq.org/site/hello-world.html.
>         // Thank you in advance for any help!
> 	///////////////////////////////////////////////////////
> 	// ActiveMQ version: ActiveMQ 4.0-M4 (per activemq --version)
> 	// OS, HW: Windows 2000 SP4; 900Mhz Pentium Dell Inspiron 8000 laptop,
> 512MB RAM
> 	// Broker started on local machine
> 	// Broker output follows:
> 	//
> 	// C:\activemq>bin\activemq
> 	// ACTIVEMQ_HOME: C:\activemq
> 	// Loading message broker from: xbean:activemq.xml
> 	// INFO  BrokerService                  - ActiveMQ 4.0-M4 JMS Message
> Broker (localhost) is starting
> 	// INFO  BrokerService                  - For help or more information
> please see: http://www.logicblaze.com
> 	// INFO  JDBCPersistenceAdapter         - Database driver recognized:
> [apache_derby_embedded_jdbc_driver]
> 	// INFO  JournalPersistenceAdapter      - Journal Recovery Started from:
> Active Journal: using 5 x 20.0 Megs at: ..\activemq-data\journal
> 	// INFO  JournalPersistenceAdapter      - Journal Recovered: 1 message(s)
> in transactions recovered.
> 	// INFO  TransportServerThreadSupport   - Listening for connections at:
> tcp://richlaptop:61616
> 	// INFO  TransportConnector             - Accepting connection on:
> tcp://richlaptop:61616
> 	// WARN  MulticastDiscoveryAgent        - brokerName not set
> 	// INFO  TransportServerThreadSupport   - Listening for connections at:
> tcp://richlaptop:61617?wireFormat=stomp
> 	// INFO  TransportConnector             - Accepting connection on:
> tcp://richlaptop:61617?wireFormat=stomp
> 	// INFO  BrokerService                  - ActiveMQ JMS Message Broker
> (localhost) started
> 	// INFO  NetworkConnector               - Establishing network connection
> between vm://localhost?network=true and null at
> failover:tcp://richlaptop:6161
> 	// INFO  VMTransportFactory             - binding to broker: localhost
> 	// INFO  TransportConnector             - Accepting connection on:
> vm://localhost
> 	// INFO  ManagementContext              - JMX consoles can connect to
> service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi
> 	// INFO  DemandForwardingBridge         - Starting a network connection
> between vm://localhost#0 and unconnected has been established.
> 	// INFO  DemandForwardingBridge         - Disconnecting loop back
> connection.
> 	// INFO  VMTransportFactory             - Shutting down VM connectors for
> broker: localhost
> 	// INFO  VMTransportFactory             - Shutting down VM connectors for
> broker: localhost	//
> 	//
> 	// C:\activemq\bin>java -version
> 	// java version "1.5.0_02"
> 	// Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_02-b09)
> 	// Java HotSpot(TM) Client VM (build 1.5.0_02-b09, mixed mode, sharing)
> 	//
> 	// Method output:
> 	// Sending 200 messages
> 	// Sent 200 messages at a rate of 21.13494663425975 messages per second
> 	// ------------------ NOTES ------------------
> 	// If setDeliveryMode to NON_PERSISTENT rate jumps to 995 per second
> 	// All config files unchanged from installation and all log/data files
> under install dir several months old.
> 	///////////////////////////////////////////////////////
> 	public static void main( String [] args ) {
> 		javax.jms.Connection connection = null;
> 		javax.jms.Session session = null;
> 		try {
> 			// Setup
> 			org.apache.activemq.ActiveMQConnectionFactory connectionFactory = new
> org.apache.activemq.ActiveMQConnectionFactory( "tcp://localhost:61616" );
> 			connection = connectionFactory.createConnection();
> 			session = connection.createSession( false,
> javax.jms.Session.AUTO_ACKNOWLEDGE );
> 			javax.jms.Destination destination = session.createQueue( "TestQueue" );
> 			javax.jms.MessageProducer producer = session.createProducer( destination
> );
> 			producer.setDeliveryMode( javax.jms.DeliveryMode.PERSISTENT );
> 			connection.start();
> 			// Build and send message numToSend times
> 			int numToSend = 200;
> 			javax.jms.TextMessage message = session.createTextMessage();
> 			System.out.println( "Sending " + numToSend + " messages" );
> System.out.flush();
> 			long t1 = System.currentTimeMillis();
> 			for ( int i = 0; i < numToSend; ++i ) {
> 				message.setText( "Message#" + Integer.toString( i ) );
> 				producer.send( message );
> 			}
> 			long t2 = System.currentTimeMillis();
> 			// Compute and print out send rate
> 			double rate = ( double ) numToSend/( (  double ) ( t2 - t1 )/1000.0 );
> 			System.out.println( "Sent " + numToSend + " messages at a rate of " +
> rate + " messages per second" ); System.out.flush();
> 		}
> 		catch ( Exception eOuter ) {
> 			eOuter.printStackTrace();
> 		}
> 		finally {
> 			// Clean up
> 			try {
> 				if ( session != null ) session.close();
> 				if ( connection != null ) connection.close();
> 			}
> 			catch ( Exception eInner ) {
> 				eInner.printStackTrace();
> 			}
> 		}
> 	}
> 	
> }
>
>   


Re: AMQ Beginner - slow producer

Posted by James Strachan <ja...@gmail.com>.
On 9/14/06, Rick <2t...@gmail.com> wrote:
>
> public class ActiveMqTest {
>
>         public ActiveMqTest() {
>         }
>         ///////////////////////////////////////////////////////
>         // Just getting started with ActiveMQ.
>         // I must be doing something very wrong to be getting such poor performance
> on local sends (21 messages/sec).
>         // Please take a quick look and see if there is something obvious.
>         // This code is a derivative of HelloWorldProducer at
> http://www.activemq.org/site/hello-world.html.
>         // Thank you in advance for any help!

You're using a pretty old release, you should try using 4.0.1 or the
new 4.0.2 release. Other than that here's a bunch of things you can do
to speed things up

http://devzone.logicblaze.com/site/apache-activemq-performance-tuning-guide.html

Incidentally that does sound really slow - do you have a slow disk?
Are you CPU bound? The lmiting factor for persistent messaging is
usually how fast you can write to disk (also are other processes on
the box writing to disk too causing the head to move about?)

-- 

James
-------
http://radio.weblogs.com/0112098/