Hi all,

I encountered an interesting problem today, in which MINA didn't accept any incoming connections any longer, because we had too many open files on the server machine.

The application in question uses MINA version 2.0.0-M1 with 3 different IoAcceptor services sharing the same Executor and IoProcessor thread pool. The first two services are designed to have typically 5-10 permanent IoSessions connected per service. These two services don't have an ExecutionFilter in their filter chain and are driven by the IoProcessor theads. The third service is a HTTP Request/Response service based on AsyncWeb, using an ExecutorFilter with a dedicated HTTP thread pool.

After running for several weeks without any problems, the app stooped responding to new connections and the log file was spammed with the Exception Monitor log entries:

WARN [NioSocketAcceptor-3] org.apache.mina.common.DefaultExceptionMonitor: java.io.IOException: Too many open files
 at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)
at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:145) at org.apache.mina.transport.socket.nio.NioSocketAcceptor.accept(NioSocketAcceptor.java:153) at org.apache.mina.transport.socket.nio.NioSocketAcceptor.accept(NioSocketAcceptor.java:47) at org.apache.mina.common.AbstractPollingIoAcceptor$Worker.processHandles(AbstractPollingIoAcceptor.java:305) at org.apache.mina.common.AbstractPollingIoAcceptor$Worker.run(AbstractPollingIoAcceptor.java:243) at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:51) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
 at java.lang.Thread.run(Thread.java:595)

After further investigation using "lsof -p", I really found approx. 1000 sockets in CLOSE_WAIT state that didn't get released. The sockets were mainly bound to the HTTP service. Note that the already open sessions on the ohter two services worked without any problems (messages were processed normally). Also interesting: The app has a Connection Limit by IP address enforced by an IoFilter. The filter prints the managed session count for the IoService in its DEBUG log messages when sessionClosed() is invoked. The last DEBUG entry of this kind close before the max file limit was reached said that the managed sessions count of the HTTP service was 0. I couldn't detect a missing coseSession() event in the Logs either.

What circumstances could lead to the effect that MINA doesn't close/release sockets that have been colsed remotely? The processors seemed to work (the other sessions were still active), the acceptors spammed the exceptions. Any ideas?

Some enviromental information:
Linux 2.6.16.21-0.25-smp #1 SMP Tue Sep 19 07:26:15 UTC 2006 x86_64 x86_64 x86_64 GNU/Linux

java version "1.5.0_11"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_11-b03)
Java HotSpot(TM) 64-Bit Server VM (build 1.5.0_11-b03, mixed mode)


Thanks for your help.

Cheers,
Tom.

Reply via email to