Some more results after the modification I suggest at the end of my last
mail (ie, do the write immediately, instead of using a queue, when we can) :

Mina3 client/ Mina3 server : 10bytes msgs in 38.6 secs | 1k msgs in 42.2 secs | 
10k msgs in 45.7 secs

This is a clear 50% speedup compared to my previous MINA 3 perfs, and 33% 
increase compared to the Netty scenario.

I still have some more code to fix to get this working fo UDP, as I
added a writeDirect() method into the IoSessin interface I now have to
implement for each class.

Also note that, compared to MINA 2, the forth test (ie, transfering
large messages - 64Mo) is extremely slow - as for Netty -. There is most
certainly somethng to do regarding the buffer size we use to transfer
such big Messages.


Le 1/4/13 5:51 PM, Emmanuel Lécharny a écrit :
> Hi !
>
> I conducted some profiling sessions today, to see where we were spening
> some spurious CPU in MINA3. When I first did some tests, I was able to
> process 1 million 10 bytes messages in 75 seconds (the message is
> written by the client, read by the server, which returns a 1 bte message
> to the client). This is the very same test than the one Jeff wrote for
> MINA 2 and Netty.
>
> After a bit of analysis, I was able to lower this number to 57 seconds.
>
> Now, here are the numbers for MINA 3, MINA 2 and Netty, for 1M messages :
>
> Mina3 client/ Mina3 server : 10bytes msgs in 57.8 secs | 1k msgs in 53.2
> secs | 10k msgs in 66.1 secs
> Mina2 client/ Mina2 server : 10bytes msgs in 53.4 secs | 1k msgs in 52.4
> secs | 10k msgs in 75.6 secs
> Netty client/ Mina2 server :10bytes msgs in 51.4 secs | 1k msgs in 49.6
> secs | 10k msgs in 74.7 secs
>
> (we currently don't have a Netty server)
>
> So bottom line, MINA 3 is slower than any other combinaison, despite the
> minimal features we have injected, except for big messages. Is this a
> problem ? Well, yes and no.
>
> There are some very good reasons for MINA 3 to be slower : we call the
> selector.select() method for every message we have to send. This is the
> most expensive part of the code, and it's not something we can improve :
> we don't have any way to make select() go faster.
>
> OTOH, we could call select() less often. Right now, what we do is that
> everytime we exit from a select(), we process all the activated
> SelectionKey we get. This is done by calling the ready() method, with
> flags indicating which event we have to process (OP_READ and OP_WRITE
> mainly).
>
> The ready() method processes the connect, read, wrate and accept events,
> one after the other. The thing here is that if a read results in some
> writes, the writes will be processed in the next select() loop, when in
> Netty and MINA2 it's potentially processed just afterward, in the same
> select() loop.
>
> We can bypass this extra loop most of the time, as soon as the channel
> is ready. The idea is to push the message into the channel, if we don't
> have anything in the writeQueue, and we are done. If the writeQueue is
> not empty, we simply push the message in the queue. Last, not least, if
> we weren't able to write all the message, we push the remaining message
> on the writeQueue, set the SelectKey OP_WRITE to true, and wake up the
> selector. That would save us a lot of CPU for small messages.
>
> I will try to do that.
>


-- 
Regards,
Cordialement,
Emmanuel Lécharny
www.iktek.com 

Reply via email to