And DefaultIoSessionDataStructureFactory has the following public static
inner class:

    private static class DefaultWriteRequestQueue implements
WriteRequestQueue {
        /** A queue to store incoming write requests */
        private final Queue<WriteRequest> q = new
ConcurrentLinkedQueue<WriteRequest>();

I'm assuming that's also a queue consumed by a loop thread, anything in
fact that is consumable by a loop thread and has a chance of receiving many
messages is optimizable by a low GC MpSc version of JC tools APIs.
You can look at other queues they have available but TBH I prefer the array
based queues as they have a practically zero GC impact:
https://github.com/JCTools/JCTools/tree/master/jctools-core/src/main/java/org/jctools/queues

Regards,
Guido.


On Mon, Oct 17, 2016 at 10:29 AM, Guido Medina <oxyg...@gmail.com> wrote:

> Sorry, wrong branch, that's on the current master (trunk), for our case it
> would be in the following on 2.0.15 branch:
>
> public abstract class AbstractProtocolEncoderOutput implements
> ProtocolEncoderOutput {
>     private final Queue<Object> messageQueue = new
> ConcurrentLinkedQueue<Object>();
>     ...
> }
>
> The messageQueue variable is the candidate for this kind of optimization,
> assuming it is consumed by a single loop thread.
>
> Regards,
>
> Guido.
>
> On Mon, Oct 17, 2016 at 10:12 AM, Guido Medina <oxyg...@gmail.com> wrote:
>
>> Hi Emmanuel,
>>
>> At the mina-core class AbstractNioSession the variable:
>>
>>     /** the queue of pending writes for the session, to be dequeued by
>> the {@link SelectorLoop} */
>>     private final Queue<WriteRequest> writeQueue = new
>> DefaultWriteQueue();
>>
>> such queue is being consumed by a selector loop? which makes me think it
>> is a single thread loop hence making it MpSc and ideal for low GC
>> optimization.
>> But maybe such optimization is so unnoticeable that is not worth.
>>
>> That's the only place I think it is worth replacing by a low GC footprint
>> queue, it will avoid the creation of GC-able linked nodes
>> (ConcurrentLinkedQueue)
>>
>> In fact, further in that logic you try to avoid writing to the queue if
>> is empty by passing the message directly to the next handler which is a
>> micro-optimization,
>> isEmpty() will 99.99% of the cases render to be false for systems with
>> high load.
>>
>> WDTY?
>>
>> Guido.
>>
>> On Sat, Oct 15, 2016 at 8:12 PM, Guido Medina <oxyg...@gmail.com> wrote:
>>
>>> I will take a look again at the source code but not today, I will let
>>> you know on Monday if is applicable for MINA core, it seems it is not the
>>> case,
>>> my application is simply forwarding each decoded FIX message to an Akka
>>> actor which are backed by a high performance queue,
>>> I was thinking (will double check) these ByteBuffers were queue somehow
>>> before they are picked by the handlers which is where a non-blocking MpSc
>>> would play a role.
>>>
>>> But maybe I misunderstood the code I saw.
>>>
>>> I will check again and let you know,
>>>
>>> Have a nice weekend,
>>>
>>> Guido.
>>>
>>> On Sat, Oct 15, 2016 at 7:33 PM, Emmanuel Lecharny <elecha...@apache.org
>>> > wrote:
>>>
>>>> Tio be clear : when some sockets are ready for read (ie, the OP_READ
>>>> flag
>>>> has been set, and there is something in the socket to be read), the
>>>> IoProcessor call to select()) will return and we will have a set of
>>>> SelectionKey returned. Thsi set contains the set of all the channel that
>>>> are ready for some processing. The IoProcessor thread will process them
>>>> one
>>>> after the other, from top to bottom. That means we don't process
>>>> multiple
>>>> sessions in parallel when all those sessions are handled by one
>>>> singleIoProcessor. You have to be careful in what you do in your
>>>> application, because any costly processing, or any synchronous access
>>>> to a
>>>> remote system will block the other sessions processing.
>>>>
>>>> Now, we always start the server with more than one IoProcessor
>>>> (typically,
>>>> Nb core + 1 Ioprocessor). You can also fix a higher number of
>>>> IoProcessor
>>>> if you like, but at some point, if your CPU is 100% used, adding more
>>>> IoProcessor does not help.
>>>>
>>>> What kind of performance are you expecting to reach ? (ie, how many
>>>> requests per second ?)
>>>>
>>>
>>>
>>
>

Reply via email to