Hi,

I have been struggling with high cpu consumption lately with my Mina 2.0.7 
application. There were no cpu problems before migrating to v2.0, but now I got 
cpu usage around 200% which is insane! I think it is because of removing 
ThreadModel and start using OrderedThreadPoolExecuter instead. I implemented 
this new class to my application but apparently I am doing something wrong. 
When I monitor my application with jconsole, it seems that the problem is about 
garbage collection. Application starts a lot of threads and they are all 
waiting but they are not being collected. Could you please help me fixing this 
problem. Here is my code,

                                                               int 
maxIoProcessor = 0;
                                                               Executor 
workerThreadModel = null;

                                                               if 
(acceptor.getWorkerThreadModel() != null) {
                                                                              
if (acceptor.getWorkerThreadModel().equalsIgnoreCase("auto")) {
                                                                                
              workerThreadModel = null;
                                                                              } 
else if (acceptor.getWorkerThreadModel().equalsIgnoreCase("cached")) {
                                                                                
              workerThreadModel = Executors.newCachedThreadPool();
                                                                              } 
else if (acceptor.getWorkerThreadModel().equalsIgnoreCase("single")) {
                                                                                
              workerThreadModel = Executors.newSingleThreadExecutor();
                                                                              } 
else if (acceptor.getWorkerThreadModel().contains("fixed")) {
                                                                                
              String threadAmountStr = 
acceptor.getWorkerThreadModel().replace("fixed", "").replace("(", 
"").replace(")", "").trim();
                                                                                
              if (Utils.isNumeric(threadAmountStr)) {
                                                                                
                              int threadAmount = 
Integer.parseInt(threadAmountStr);
                                                                                
                              workerThreadModel = 
Executors.newFixedThreadPool(threadAmount);
                                                                                
              }
                                                                              }
                                                               }

                                                               if 
(acceptor.getIoProcThreadNum() != null) {
                                                                              
if (acceptor.getIoProcThreadNum().equalsIgnoreCase("auto")) {
                                                                                
              maxIoProcessor = Runtime.getRuntime().availableProcessors() + 1;
                                                                              } 
else {
                                                                                
              if (Utils.isNumeric(acceptor.getIoProcThreadNum())) {
                                                                                
                              maxIoProcessor = 
Integer.parseInt(acceptor.getIoProcThreadNum());
                                                                                
              }
                                                                              }
                                                              } else {
                                                                              
maxIoProcessor = 1;
                                                               }

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

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

                                                               IoAcceptor 
ioAcceptor = (IoAcceptor) acceptorObj;

                                                               
logger.info("--------------------------------");
                                                               
logger.info("Starting Acceptor: " + acceptor.getName());
                                                               
logger.info("Setting Thread Model: " + 
acceptor.getConfig().getThreadModel().getText());

                                                               
OrderedThreadPoolExecutor executor = new OrderedThreadPoolExecutor();
                                                               if 
(acceptor.getConfig().getThreadModel().getText().equalsIgnoreCase("manual")) {
                                                                               
ioAcceptor.getFilterChain().addLast("executor", new ExecutorFilter(executor));
                                                               }

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

Emre

Reply via email to