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
