directory-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Colin Cullen <colincul...@earthlink.net>
Subject Re: ByteBuffer usage, performance, leak
Date Wed, 19 Apr 2006 15:44:05 GMT
<HEAD>
<META content="MSHTML 6.00.2800.1522" name=GENERATOR></HEAD>
<BODY>
<DIV>Hi Trustin,</DIV>
<DIV>&nbsp;</DIV>
<DIV>(Note: the following discussion is related to Mina 0.8.2.)</DIV>
<DIV>&nbsp;</DIV>
<DIV>Thanks for the quick response!&nbsp; I am using JProbe to profile the Mina
based server.&nbsp; JProbe indicates a consistent memory leak which seems to coincide
with whenever a deal ticket message is sent.&nbsp; It also indicates a memory leak if
I just let the heartbeat message run (using Mina's idle feature for this).&nbsp; The heartbeat
message is under 100 bytes, to which the client app responds with a message of about 50 bytes,
it runs when there is no other msg exchange activity.&nbsp; If I let heartbeat scenario
JProbe will again report a consistent leak.&nbsp; GC occurs but never seems to recover
completely and memory consumption continues to rise throughout the run.</DIV>
<DIV>&nbsp;</DIV>
<DIV>As I stated earlier the server is also having performance problems.&nbsp; It
starts out fine, able to send a deal ticket and receive a deal ticket ack with a latency of
about 30 ms, but this time deterioriates at time go on.&nbsp; For example, I ran a test
for about 6 hours last night where latency started out at about 30 ms, but by the end of the
run latency was about 3000 ms.&nbsp; It is interesting to note that although the average
latency increases with time, when I inspect the individual round trips toward the later parts
of the test run, I see that the latency times vary greatly, anywhere between 30 ms and 3000
ms, but with the majority of the latency times being toward the high end.</DIV>
<DIV>&nbsp;</DIV>
<DIV>I am thinking that the leak and performance problems are related since they seem
to occur under the same run conditions, although I am still digging for clues.</DIV>
<DIV>&nbsp;</DIV>
<DIV>I have searched the Mina board and I noticed others discussing ByteBuffers with
respect to leakage.&nbsp; I believe I read that these problems were fixed and have adjusted
my code accordingly, as per my coding example below.&nbsp; I have also discovered that
SUN had leakage problems regarding NIO and ByteBuffers in 1.4.x.&nbsp; I am using Java
1.5 -- I am still researching in this area as I just uncovered this fact last night.</DIV>
<DIV>I performed some timings on Mina's demuxing decoder model, thinking that either
the model and/or my NIO buffer parsing code was slow, but on the contrary is runs very fast
and usually completes the decoding into a message all within the same millisecond.</DIV>
<DIV>&nbsp;</DIV>
<DIV>The problem has been isolated to the point where the out.write is called to send
out the deal ticket message, and when the decoder is called for the inbound deal ticket ack
message.&nbsp; I am running with 5 filters but have tried disabling 3 of them (the other
2 are essential) without any change in performance or performance degredation.&nbsp; I
did note, during the course of the development / debug cycle, that the call stack for Mina's
filter mechanism can get really deep, but I assumed that this is normal behavior, is that
correct?</DIV>
<DIV>&nbsp;</DIV>
<DIV>I have debugged through some of Mina's code trying to understand the flow and possible
find where things are getting slow.&nbsp; It looks like the session's out.write is decoupled
from the actual socket write by a queue (or queues) which naturally require synchronization.&nbsp;
Any pointers for me here as to where to look regarding my problem?</DIV>
<DIV>&nbsp;</DIV>
<DIV>I can understand if performance is just not where I need it to be, but what I can't
understand is that the performance starts out good but degrades as time goes on, this indicates
a bottleneck somewhere.&nbsp; I also wonder why latency differs so widely in my test run.&nbsp;
Is the outbound data sent in a bursty fashion?</DIV>
<DIV>Do you know if the SUN NIO ByteBuffer leakage problems have been addressed in Java
1.5? In Mina 0.8.2?</DIV>
<DIV>&nbsp;</DIV>
<DIV>Can you point me to the points where I should look to instrument Mina when the
ticket message is written and where the ticket ack message is recieved?</DIV>
<DIV>&nbsp;</DIV>
<DIV>I always suspect my own code first but things don't appear to be pointing in that
direction, unless there is some error in my usage of ByteBuffer objects.</DIV>
<DIV>&nbsp;</DIV>
<DIV>I am thinking of using a aspect to checkout the timings on the methods between
the out.write and upto the decoding of the message on the inbound side.</DIV>
<DIV>&nbsp;</DIV>
<DIV>I'm not an expert in JProbe, but would a snapshot be of use?</DIV>
<DIV>&nbsp;</DIV>
<DIV>I appreciate your help and appreciate any help you or the board members can give
me in this area.</DIV>
<DIV>&nbsp;</DIV>
<DIV>Thanks.<BR>Colin<BR><BR>-----Original Message----- <BR>From:
Trustin Lee <TRUSTIN@GMAIL.COM><BR>Sent: Apr 18, 2006 1:03 AM <BR>To: Apache
Directory Developers List <DEV@DIRECTORY.APACHE.ORG>, colincullen@earthlink.net <BR>Subject:
Re: ByteBuffer usage, performance, leak <BR><BR>Hi Colin,<BR><BR></DIV>
<DIV><SPAN class=gmail_quote>On 4/18/06, <B class=gmail_sendername>Colin
Cullen</B> &lt;<A href="mailto:colincullen@earthlink.net">colincullen@earthlink.net</A>&gt;
wrote:</SPAN>
<BLOCKQUOTE class=gmail_quote style="PADDING-LEFT: 1ex; MARGIN: 0pt 0pt 0pt 0.8ex; BORDER-LEFT:
rgb(204,204,204) 1px solid">
<DIV style="DIRECTION: ltr">
<DIV>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">Hi,</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">I
am seeking some help regarding Mina.&nbsp; I have completed development of a server using
Mina 0.8.2.&nbsp; This server will be providing financial deal ticket information to multiple
clients.&nbsp; Functionally everything works great but I do seem to have a memory leak
and slowly degrading performance.&nbsp; I am testing using a single production level client
(not Mina based).&nbsp; The server protocol sends a deal ticket down to the client and
then awaits a high level acknowledgement from the client indicating whether the ticket has
passed or failed client side validation.&nbsp; The performance degradation occurs between
the writing of the message object (deal ticket) at the protocol level and the reception of
the response message in its message handler.&nbsp; BTW I am using Mina's DemuxingProtocolCodecFactory
and DemuxingProtocolHandler to model the server and provide the codec/handler glue.&nbsp;
I am concerned about whether I am using Mina's ByteBuffer properly.&nbsp; I have also
read on the board that Mina will automatically place an allocated ByteBuffer in its ByteBuffer
pool.</SPAN></FONT></P></DIV></DIV></BLOCKQUOTE>
<DIV>MINA 0.8 doesn't release pooled buffers once allocated, so the pool size will never
decrease.&nbsp; This problem has been addressed in 0.9.3 which has been released recently.&nbsp;
Except that, there's no known memory leak in 0.8.&nbsp; To prevent MINA from pooling the
allocated buffers, just acquire them once more, for example:<BR><BR>ByteBuffer
buf = ByteBuffer.allocate(....);<BR>buf.acquire();&nbsp; // acquire once more.<BR></DIV>
<BLOCKQUOTE class=gmail_quote style="PADDING-LEFT: 1ex; MARGIN: 0pt 0pt 0pt 0.8ex; BORDER-LEFT:
rgb(204,204,204) 1px solid">
<DIV style="DIRECTION: ltr">
<DIV>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">My
output buffer requirements are pretty minimal.&nbsp; The deal ticket message is around
1K bytes.&nbsp; I allocate a single ByteBuffer for each session and keep it in the session
object, which is stored in Mina's session context map, when a deal ticket needs to be written
to the client the pre-allocated ByteBuffer is retrieved from the session context object and
used for building the outbound data set.&nbsp; Here are the actual code fragments:</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">This
factory creates a session context object for each connection:</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">public
class SessionContextFactory</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">{</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;
static private SessionContextFactory instance = new SessionContextFactory();</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;
static public SessionContextFactory getInstance()</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;
{</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return SessionContextFactory.instance;</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;
}</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;
private SessionContextFactory()</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;
{</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;
}</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;
public SessionContext createSessionContext(ProtocolSession session)</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;
{</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return new SessionContext(session);</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;
}</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;
public final class SessionContext implements SessionContext, LifeSpanControllable</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;
{</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ByteBuffer dataBuffer;</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"></SPAN></FONT>&nbsp;</P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
private SessionContext(ProtocolSession session)</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
{</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
dataBuffer = ByteBuffer.allocate(1024);</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
public ByteBuffer getDataBuffer()</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
{</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
dataBuffer.acquire();'</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return dataBuffer;</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;
&nbsp;}</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">}</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"></SPAN></FONT>&nbsp;</P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">This
class performs the message encoding using the single ByteBuffer retrieved from the session
context object: </SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"></SPAN></FONT>&nbsp;</P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">public
abstract class EasiAbstractMessageEncoder implements MessageEncoder</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">{</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;
private final String type;</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"></SPAN></FONT>&nbsp;</P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;
protected EasiAbstractMessageEncoder(String type)</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;
{</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
this.type = type;</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;
}</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;
protected String getType()</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;
{</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return type;</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;
}</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;
public void encode(ProtocolSession session, Object message, ProtocolEncoderOutput out) throws
ProtocolViolationException</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;
{</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
SessionContext sessCtx = (SessionContext)session.getAttribute(ServerConstants.SESSION_CONTEXT);</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EasiAbstractMessage m = (EasiAbstractMessage)message;</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"></SPAN></FONT>&nbsp;</P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ByteBuffer buf = sessCtx.getDataBuffer();</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
buf.clear();</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// Encode the header</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
encodeHeader(session, m, buf); // will perform several buf.put() calls</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Encode the body</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
encodeBody(session, m, buf); // will perform many buf.put() calls</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
buf.flip();</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
out.write(buf);</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;
}</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;
protected abstract void encodeMetadata(ProtocolSession session, EasiAbstractMessage message,
ByteBuffer buf);</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;
protected abstract void encodeHeader(ProtocolSession session, EasiAbstractMessage message,
ByteBuffer buf);</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;
protected abstract void encodeBody(ProtocolSession session, EasiAbstractMessage message, ByteBuffer
buf);</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">}</SPAN></FONT></P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"></SPAN></FONT>&nbsp;</P>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">As
you can see the buffer is acquired every time it is retrieved from the session context object.&nbsp;
Apparently Mina is releasing the buffer in the out.write(buf) call, is that true?</SPAN></FONT></P></DIV></DIV></BLOCKQUOTE>
<DIV>Yes, it's true.&nbsp; This also means your dataBuffer will never return to
the MINA buffer pool because you acquired the buffer once more. <BR><BR></DIV>
<BLOCKQUOTE class=gmail_quote style="PADDING-LEFT: 1ex; MARGIN: 0pt 0pt 0pt 0.8ex; BORDER-LEFT:
rgb(204,204,204) 1px solid">
<DIV style="DIRECTION: ltr">
<DIV><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">At
a high level, what this server needs to do is to be able to send 40 ? 50 1K deal ticket per
second down to a single client (with the nagle algorithm disabled).&nbsp; BTW the client
is very fast and almost always responds to the deal ticket message within the same millisecond
in which it was received.</SPAN></FONT> 
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">Is
it reasonable to expect this kind of performance from Mina?</SPAN></FONT></P></DIV></DIV></BLOCKQUOTE>
<DIV>Actually myself didn't push MINA that much.&nbsp; Anyone in the list might
give you some information.<BR></DIV>
<BLOCKQUOTE class=gmail_quote style="PADDING-LEFT: 1ex; MARGIN: 0pt 0pt 0pt 0.8ex; BORDER-LEFT:
rgb(204,204,204) 1px solid">
<DIV style="DIRECTION: ltr">
<DIV>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">Also
worth noting is that the decoding, handling, retrieval of deal ticket from the database, encoding
and all of the related parsing etc. is very fast and usually only takes around 10 to 20 milliseconds
to complete.</SPAN></FONT></P></DIV></DIV></BLOCKQUOTE>
<DIV>Your code looks OK to me. It would be nice if you can give us heap profiler data
so we can find out which objects are dominant. <BR></DIV>
<BLOCKQUOTE class=gmail_quote style="PADDING-LEFT: 1ex; MARGIN: 0pt 0pt 0pt 0.8ex; BORDER-LEFT:
rgb(204,204,204) 1px solid">
<DIV style="DIRECTION: ltr">
<DIV>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">Any
help would be greatly appreciated!&nbsp; (Sorry for being so long winded!)</SPAN></FONT></P></DIV></DIV></BLOCKQUOTE>
<DIV>No problem.&nbsp; Thank you for detailed information! :)<BR></DIV>
<BLOCKQUOTE class=gmail_quote style="PADDING-LEFT: 1ex; MARGIN: 0pt 0pt 0pt 0.8ex; BORDER-LEFT:
rgb(204,204,204) 1px solid">
<DIV style="DIRECTION: ltr">
<DIV>
<P><FONT face=Arial size=2><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">Thanks
for all who work on Mina, a very elegant design which renders NIO much more approachable.</SPAN></FONT></P></DIV></DIV></BLOCKQUOTE>
<DIV>Your feedback will make MINA more robust and beautiful.&nbsp; Please don't
hesitate! ;)<BR>&nbsp;</DIV></DIV>
<DIV>HTH,<BR>Trustin<BR>-- <BR>what we call human nature is actually
human habit <BR>--<BR><A href="http://gleamynode.net/">http://gleamynode.net/</A><BR>--<BR>PGP
key fingerprints:<BR>* E167 E6AF E73A CBCE EE41&nbsp;&nbsp;4A29 544D DE48 FE95
4E7E<BR>* B693 628E 6047 4F8F CFA4&nbsp;&nbsp;455E 1C62 A7DC 0255 ECA6 </DIV></BODY>

Mime
View raw message