Hi,

I monitored the app and here are the result.
There are 30-32 threads running. Most of them are on 'wait' state and there is 
only one thread on 'running' state, which is 'NioDatagramAcceptor'. When I take 
a look at its call graph this acceptor calls subsequent sub methods incredibly 
a lot 
        - PacketDecoder.decodable (431412 times called)
        - String.getBytes (91719442 times called)
        - ByteFifo.getFifo (91719442 times called)

The rest seems quite ok. I can decode messages coming through TCP connection. 
In fact messages are decoded through UDP too. But the problem is about CPU 
load. 
I suspect it is because a wrong implementation of my thread mechanism. TCP 
connection messages are handled with NioProcessor thread while UDP message are 
handled with NioDatagramAcceptor, which seems as not expected. You can find my 
acceptor the thread configuration code below.

Executor workerThreadModel = Executors.newCachedThreadPool(); Class<?> 
acceptorCls = Class.forName(acceptor.getType());
Constructor<?> acceptorCons = null;
Object acceptorObj = null;
NioProcessor nioProcessor = new NioProcessor(workerThreadModel);

if (acceptor.getType().contains("NioSocketAcceptor")) {                         
        
        acceptorCons = Utils.getPossibleConstructor(acceptorCls, new Class[] { 
NioProcessor.class });
        acceptorObj = acceptorCons.newInstance(new Object[] { nioProcessor }); 
} else if (acceptor.getType().contains("NioDatagramAcceptor")) {
        acceptorCons = acceptorCls.getConstructor();
        acceptorObj = acceptorCons.newInstance(); }

if (ioAcceptor instanceof NioSocketAcceptor) {
        NioSocketAcceptor socketAcceptor = (NioSocketAcceptor) ioAcceptor;
        socketAcceptor.getSessionConfig().setTcpNoDelay(true);
        socketAcceptor.setBacklog(100);
        socketAcceptor.setReuseAddress(true);
}

if (ioAcceptor instanceof NioDatagramAcceptor) {
        SessionRecyclerImpl recyclerImpl = 
acceptor.getConfig().getSessionRecycler();
        if (recyclerImpl != null) {
                IoSessionRecycler recycler = 
acceptor.getConfig().getIoSessionRecycler();
                ((NioDatagramAcceptor) ioAcceptor).setSessionRecycler(recycler);
        }

        int receiveBufferSize = 
Integer.parseInt(acceptor.getConfig().getRxBuffSize().getText().trim());
        if (receiveBufferSize > 0) {
                ((DatagramSessionConfig) 
ioAcceptor.getSessionConfig()).setReceiveBufferSize(receiveBufferSize);
        }
                NioDatagramAcceptor datagramAcceptor = (NioDatagramAcceptor) 
ioAcceptor;
                datagramAcceptor.getSessionConfig().setReuseAddress(true);
}


And here is the thread dump for related thread again: 

"NioDatagramAcceptor-3" prio=10 tid=0x00007f5ae4989000 nid=0x5420 runnable 
[0x00007f5ae9b31000]
   java.lang.Thread.State: RUNNABLE
        at sun.nio.cs.UTF_8.updatePositions(UTF_8.java:58)
        at sun.nio.cs.UTF_8$Encoder.encodeArrayLoop(UTF_8.java:392)
        at sun.nio.cs.UTF_8$Encoder.encodeLoop(UTF_8.java:447)
        at java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:544)
        at java.lang.StringCoding$StringEncoder.encode(StringCoding.java:240)
        at java.lang.StringCoding.encode(StringCoding.java:272)
        at java.lang.StringCoding.encode(StringCoding.java:284)
        at java.lang.String.getBytes(String.java:986)
        at 
com.blo.handler.network.mu.codecs.gprs.inbound.PacketDecoder.decodable(PacketDecoder.java:59)
        at 
org.apache.mina.filter.codec.demux.DemuxingProtocolDecoder.doDecode(DemuxingProtocolDecoder.java:141)
        at 
org.apache.mina.filter.codec.CumulativeProtocolDecoder.decode(CumulativeProtocolDecoder.java:126)
        at 
org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:232)
        - locked <0x0000000780673480> (a 
org.apache.mina.filter.codec.ProtocolCodecFilter$ProtocolDecoderOutputImpl)
        at 
org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:417)
        at 
org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:47)
        at 
org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:765)
        at 
org.apache.mina.core.filterchain.IoFilterAdapter.messageReceived(IoFilterAdapter.java:109)
        at 
org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:417)
        at 
org.apache.mina.core.filterchain.DefaultIoFilterChain.fireMessageReceived(DefaultIoFilterChain.java:410)
        at 
org.apache.mina.core.polling.AbstractPollingConnectionlessIoAcceptor.readHandle(AbstractPollingConnectionlessIoAcceptor.java:701)
        at 
org.apache.mina.core.polling.AbstractPollingConnectionlessIoAcceptor.processReadySessions(AbstractPollingConnectionlessIoAcceptor.java:670)
        at 
org.apache.mina.core.polling.AbstractPollingConnectionlessIoAcceptor.access$800(AbstractPollingConnectionlessIoAcceptor.java:61)
        at 
org.apache.mina.core.polling.AbstractPollingConnectionlessIoAcceptor$Acceptor.run(AbstractPollingConnectionlessIoAcceptor.java:607)
        at 
org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64)
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
        at java.lang.Thread.run(Thread.java:662)

Thanks in advance!

Emre


-----Original Message-----
From: Emmanuel Lécharny [mailto:[email protected]]
Sent: Friday, February 14, 2014 5:34 PM
To: [email protected]
Subject: Re: Mina 2.0.7 UDP Issue

Le 2/14/14 4:24 PM, Emre Baykal a écrit :
> The string contains only 4 letters which is a keyword of a specific device. 
> Something like "ABCD". And getBytes() method converts this string into byte.

Ok. But in any case, this is not where your code is blocking.

Can you attache a profiler (VisualVM) to see what's going on ?

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

Reply via email to