Hello, We are evaluating the possible use of ActiveMQ in our projects and have encountered this problem.
When sending small messages (for example, ByteMessages with a 1KB byte array) from a producer to a consumer through a broker, there is much higher latency than with bigger messages (for example, ByteMessages with a 32KB byte array), using the TCP transport. Changing the socketBufferSize parameter, the tcpNoDelayEnabled flag does not help. Version of ActiveMQ is 4.1, and in 4.0 there is also this problem. Our test is as follows: one JVM is the broker, the other JVM runs a producer and a consumer in separate threads (with separate connections and sessions). We are using a queue, no persistence, no transactions, Session.AUTO_ACKNOWLEDGE. The producer sends a message just after taking note of the time with System.nanoTime(), and then waits on a semaphore. When the consumer receives the message (implementing the onMessage() method of the MessageListener interface), the first thing that is done is taking notice of the time with System.nanoTime(). The difference in time is computed and written to a file, after which the consumer releases the semaphore so that the producer sends the next message. With 1 machine running Red Hat EL4 Update 3, hosting both the broker process and the producer/consumer process, we get a latency of 39ms with 1KB ByteMessages and latency of 0-1ms with 32KB ByteMessages. The frontier for latency appearing seems to be around 16KB. With 1 machine running WinXP Pro SP2, hosting both the broker process and the producer/consumer process, we get no latency (0-1 ms) with messages of any size between 1KB and 32KB. With 2 machines in a LAN, no matter the combination of WinXP / Linux (even 2 WinXP machines) we get high latency (even 200 ms for 2 WinXP machines) with 1KB messages and much lower latency (not 0, but low) with 32 KB messages. Some more facts: The first 1KB message has high latency (as expected due to initialization of stuff), the next 8-20 have no latency, and then the rest have high latency. In Linux localhost case, if the producer waits 1 second between sending 1KB messages, latency is low. Have not tried in other scenarios. Normally we do tests restarting the broker each time. But, if we do not restart the broker, the results can be more strange. Sometimes, there is a pattern where a 1KB message has no latency, the next had 39ms latency, the next has no latency, the next has 39ms latency, etc. In one of these times we took an Ethereal trace and found that the producer was sending 2 messages in the same TCP packet of around 2KB size. The broker configuration file is: http://www.nabble.com/file/6205/activemq.xml activemq.xml The code to perform the test is: http://www.nabble.com/file/6207/LatencyTest.java LatencyTest.java Here are some logs we have taken: http://www.nabble.com/file/6206/logs.zip logs.zip For 1KB messages you also have ethereal logs (32KB message ethereal logs are too big files). In every case, the file "client.txt" is the log of the producer/consumer process, the file "broker.txt" is the log of the broker process. Both these logs use the log4j logger of ActiveMQ. The "nolog" folders have logs without use of the log4j logger, since printing lots of messages disturbs a bit the results. Then you have a file called for example 1BytesMessage.txt (stands for 1KB messages), with the latency times and time of receiving by the consumer. All this is very strange... we do not know if the problem lies in the Linux TCP stack, the Java I/O or networking libraries, ActiveMQ code, some lack of proper configuration... we believe however that it is the producer which is holding sometimes a message before sending the packet to the broker. -- View this message in context: http://www.nabble.com/High-latency-for-small-messages-problem-tf3159901.html#a8764113 Sent from the ActiveMQ - User mailing list archive at Nabble.com.