Hi Cesar,
It seems to me that your figures are stranged. I made a simple test
which is following (i put it in the
org.servicemix.components.pojo.PojoTest test case)
public void testPerfSendAndReceiveOfMessages() throws Exception {
MySender sender = (MySender) getBean("sender");
MyReceiver receiver = (MyReceiver) getBean("receiver");
sender.sendMessages(100);
assertMessagesReceived(receiver.getMessageList(), 100);
receiver.getMessageList().flushMessages();
int messageCount = 10000;
long start = System.currentTimeMillis();
sender.sendMessages(messageCount);
assertMessagesReceived(receiver.getMessageList(), messageCount);
long end = System.currentTimeMillis();
System.err.println((end - start) + " ms to send " + messageCount + "
messages");
}
So it sends in a loop 10000 messages that are quite the same as yours.
The output on my laptop, inside eclipse is:
25406 ms to send 10000 messages
So that it takes approx. 2.5 ms to create / send / receive the message
and my hardware is not twenty times faster than yours :)
Notice that i disabled logging to speed things up.
Could you try the above test so that we can agree on these figures ?
Cheers,
Guillaume Nodet
Cesar Delgado a écrit :
Hi Rob.
I don’t understand why you said that an average of 300 samples is
small. I am measuring the time spent for a JBI message inside
ServiceMix JVM. At this stage I am not trying to measure the queue
effect or other overall performance issues. I’m using
MessageExchangeListener interface and according with
servicemix.org/Component+helper+classes: “The ServiceMix container
will detect the use of this interface and be able to perform immediate
dispatch (rather than the default JBI asynchronous dispatch model
where a thread is used per JBI component)”. Notice the phrase:
“immediate dispatch”.
Anyway, I repeated the test with 4000 samples (first 100 are
discarded). The average time spent to send a trivial short message
between 2 components inside ServiceMix was: 56.820 miliseconds.
Under the same conditions, I tested and measured the time spent by
Hessian messages over HTTP between 2 components running in different
JVM and I got an average time of: 0.512 miliseconds.
RESULTS: ServiceMix/JBI is around 110 times slower than Hessian over
HTTP for messages marshalling and transport. I guess that results
would be even worse if I try to send messages between 2 instances of
ServiceMix (2 JVM).
I think that my hardware characteristics are not important because I
am just comparing technologies (transport/protocol) under the same
hardware/software conditions. However, this is the Microsoft System
Information report on my pc:
OS Name Microsoft Windows XP Professional
Version 5.1.2600 Service Pack 2 Build 2600
System Manufacturer Hewlett-Packard
System Model HP Compaq nx6120 (PV135PA#ABG)
Processor x86 Family 6 Model 13 Stepping 8 GenuineIntel ~1733 Mhz
BIOS Version/Date Hewlett-Packard 68DTD Ver. F.03, 2/25/2005
SMBIOS Version 2.3
Hardware Abstraction Layer Version = "5.1.2600.2180
(xpsp_sp2_rtm.040803-2158)"
Total Physical Memory 1,024.00 MB
Available Physical Memory 428.15 MB
Total Virtual Memory 2.00 GB
Available Virtual Memory 1.96 GB
Page File Space 1.64 GB
The performance price is too high, and I will be forced to abandon
ServiceMix. I wonder whether JBI is too heavy not matter the
implementation. Messages between components running in the same
container (JVM) should be communicated instantaneously (probably JBI
specification should be relaxed for communication between components
inside the same virtual machine).
Best regards,
Cesar
------------------------------------------------------------------------
*From:* Rob Davies [mailto:[EMAIL PROTECTED]
*Sent:* Monday, September 12, 2005 7:27 PM
*To:* [email protected]
*Subject:* Re: [servicemix-user] ServiceMix/JBI poor performance!
Hi Cesar,
it would be great if you could submit your benchmark to ServiceMix! We
are in the process of adding benchmark system tests - but this will
take a while - and it would help us tune the internals in the mean time.
You're sample size (300) is quite small to get an accurate picture of
the marshaling/routing speed of ServiceMix, and you've probably not
getting a true picture of the overhead of sending messages through JBI.
Internally for routing the default flow type is seda, which uses
internal queues for dispatching messages between different Components.
The queue size by default is 1000, so a bigger sample size will
provide a more accurate picture of the overhead.
Seda flow does provide some benefits for scaling with some deployment
patterns - but you could try setting the flow used to straight through
- st. See http://servicemix.codehaus.org/NMR+Flows
You can change the flow type when configuring ServiceMix - see
http://servicemix.codehaus.org/Configuration
cheers,
Rob