Dear All,

I am working on an IoT project. I have created a Java application using MINA 
library. All the devices are connecting to this Java application using TCP 
protocol.
I have created simulator (to simulate devices) to do our load testing. In 
simulator I have given limit of 3000 threads in thread pool so that one 
instance of simulator can connect 3000 devices at once.
I tried testing for 30000 devices by executing 5 instances of simulators in 
parallel. Each device was sending messages after interval of 30 seconds and I 
had 10 messages per device.

But my Java Application did not receive all the messages in one go, it is 
processing messages very slow.

Suppose 5 simulators have sent (3000 devices/threads per instance * 5 instances 
* 5 mins) 150000 messages in 5 minutes but Java Application (with MINA) has 
processed about 10000 messages only.
And even after sometime my Java Application was closed due to memory issue.

Please help and guide how MINA is working in case of lot of devices/sockets 
connection?
Where is MINA storing messages which are yet to process?

With 16 GB RAM Linux machine, and giving 4 GB and 6 GB as a heap parameters in 
Java Application (java -Xms4096m -Xmx6144m -Dserver -jar Application.jar),  how 
many devices/sockets MINA library can handle?

Is MINA using single thread to connect all devices and receive packets from 
them?
I mean is it possible to receive all messages immediately in my Request Handler?

Below is given my code for MINA configuration and from request handler we are 
starting a new thread for each message for processing.

public abstract class AbstractListener {

                /** The logger instance.*/
                private static Logger LOGGER = 
Logger.getLogger(AbstractListener.class);

                /** The buffer size constant. */
                protected static final int BUFFER_SIZE = 2048;

                /**
                * The method to initialize udp and tcp/ip listeners.
                *
                 * @param portKey
                *            the port of the udp or tcp/ip listener.
                * @throws IOException
                *             the io exception to be thrown in case of error.
                */
                public void init(String portKey) throws IOException {
                                LOGGER.info("Entering init()");
                                AbstractIoAcceptor acceptor = initInternal();
                                acceptor.setHandler(new RequestHandler());
                                acceptor.getFilterChain().addLast("logger", new 
LoggingFilter());
                                
acceptor.getSessionConfig().setReadBufferSize(BUFFER_SIZE);
                                
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
                                if (acceptor instanceof NioDatagramAcceptor) {
                                                ((NioDatagramAcceptor) 
acceptor).getSessionConfig().setReuseAddress(true);
                                }
                                acceptor.bind(new 
InetSocketAddress(Integer.parseInt(ServerConfigLoader.getInstance().getProperty(portKey))));
                                LOGGER.info("Exiting init()");
                }

                /**
                * The abstract method to be over ridden by appropriate listener 
(udp /
                * tcp/ip) for invoking appropriate listener.
                *
                 * @return the appropriate (udp/ tcp/ip) io acceptor.
                */
                public abstract AbstractIoAcceptor initInternal();
}


public class RequestHandler extends IoHandlerAdapter {

                /** The logger instance. */
                private static final Logger LOGGER = 
LoggerFactory.getLogger(RequestHandler.class);

                private ExecutorService executorService = 
Executors.newCachedThreadPool();

                /**
                * Default constructor.
                */
                public RequestHandler() {
                                super();
                }

                /**
                * {@inheritDoc}
                */
                @Override
                public void exceptionCaught(IoSession session, Throwable cause) 
throws Exception {
                                LOGGER.error("Exception caught in 
RequestHandler.exceptionCaught()", cause);
                                session.closeNow();
                }

                /**
                * {@inheritDoc}
                */
                @Override
                public void messageReceived(IoSession session, Object message) 
throws Exception {
                                LOGGER.info("Entering messageReceived()");
                                try {
                                                SocketAddress remoteAddress = 
session.getRemoteAddress();
                                                String msg = 
((IoBuffer)message).getHexDump().replaceAll(" ", "");
                                                String strArray[] = 
remoteAddress.toString().split(":");
                                                LOGGER.info("Client IP:Port & 
Message [" + InetAddress.getByName(strArray[0].split("/")[1]) + ":" + 
strArray[1] + " -> " + msg + "]");
                                                executorService.execute(new 
HelperThread(session, msg));
                                } catch (Exception e) {
                                                LOGGER.error("Exception 
occurred in RequestHandler", e);
                                                throw e;
                                } finally {
                                                LOGGER.info("Exiting 
messageReceived()");
                                }
                }
}


Thanks & Regards,
Krishan Babbar
============================================================================================================================
Disclaimer: This message and the information contained herein is proprietary 
and confidential and subject to the Tech Mahindra policy statement, you may 
review the policy at http://www.techmahindra.com/Disclaimer.html externally 
http://tim.techmahindra.com/tim/disclaimer.html internally within TechMahindra.
===========================================================================================================================

============================================================================================================================

Disclaimer:  This message and the information contained herein is proprietary 
and confidential and subject to the Tech Mahindra policy statement, you may 
review the policy at http://www.techmahindra.com/Disclaimer.html 
<http://www.techmahindra.com/Disclaimer.html> externally 
http://tim.techmahindra.com/tim/disclaimer.html 
<http://tim.techmahindra.com/tim/disclaimer.html> internally within 
TechMahindra.

============================================================================================================================

Reply via email to