You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomcat.apache.org by Arijit Ganguly <ag...@gmail.com> on 2012/01/07 08:23:16 UTC
file descriptor (unix socket) leak with NIO handler
Hello,
I have an application running under tomcat configured with
Http11NioProtocol. I am noticing that under a high connection rate (not
request rate) of about 100 connections/second, tomcat is leaks file
handles corresponding to Unix sockets. I am using the lsof command to find
the number of file handles open by the java process. I observe an increase
number of file handles that are all pointing to the same unix socket (same
inode number) over a period of time.
# ls -l /proc/3907/fd/8368
lrwx------ 1 root root 64 Jan 7 00:15 /proc/3907/fd/8368 ->
socket:[605702067]
# ls -l /proc/3907/fd/8366
lrwx------ 1 root root 64 Jan 7 00:15 /proc/3907/fd/8366 ->
socket:[605702067]
# ls -l /proc/3907/fd/8367
lrwx------ 1 root root 64 Jan 7 00:15 /proc/3907/fd/8367 ->
socket:[605702067]
Netstat –p does show that the state of the socket is connected.
# netstat -p | grep unix | grep java
unix 2 [ ] STREAM CONNECTED 605702067 3907/java
At my anticipated connection rates (100/second), we observe the application
to leak about 150 file handles (corresponding to Unix sockets) each day. I
did some investigation on the issue by connecting to the application via
JMX. It seems like this increase in Unix socket file handles is due to
improperly closed connections, since I am also able to reproduce the same
unix socket leak by invoking stop() on the HTTP Connector via JMX. Just
before stopping the connector my application had 4000 open connections
(lsof showed these as 4000 IPv6 file handles). On invoking stop() via JMX,
I the number of IPv6 file went down to about 70, while the number of unix
socket file handles went up by 4000. It seems that these incorrectly closed
connections then incarnate as Unix socket handles.
Here;s the distribution of file handles before and after the stop():
Command used: pid=`ps -ef | grep tomcat | grep -v grep | awk '{print
$2}'`; lsof -p $pid | awk '{print $5}' | sort -n | uniq -c
Before
10 0000
4 CHR
2 DIR
20 FIFO
4105 IPv6 -- see the drop
93 REG
37 sock
1 TYPE
12 unix
1 unknown
After:
Sat Jan 7 00:07:50 SAST 2012
10 0000
4 CHR
2 DIR
20 FIFO
13 IPv6
93 REG
1 sock
1 TYPE
4138 unix -- see the increase
A similar issue about leaking unix sockets is also reported in
http://stackoverflow.com/questions/7038688/java-nio-causes-file-descriptor-leak.
The same post also mentions that NIO internally uses Unix sockets, and the
problem was with the way the application was using NIO. I suspect there is
a race condition in the NIO handler that causes some resources not getting
cleaned up properly under high connection rate.
I have tried different versions of tomcat 6.0.32, 6.0.35, 7.0.21 and
tomcat7.0.23 – they all have this issue. My application is using the
default configuration of the NIO Connector. I dont think Comet or SendFile
are being used. Furthermore, no unix sockets show up when I use Blocking IO
(default HTTP handler).
I would appreciate the help of the community in addressing this issue.
Thanks,
Arijit
Re: file descriptor (unix socket) leak with NIO handler
Posted by Mark Thomas <ma...@apache.org>.
On 07/01/2012 07:23, Arijit Ganguly wrote:
> At my anticipated connection rates (100/second), we observe the application
> to leak about 150 file handles (corresponding to Unix sockets) each day.
That is a pretty small percentage of connections that results in a leak.
That suggests this could be tricky to reproduce and track down.
> I did some investigation on the issue by connecting to the application via
> JMX. It seems like this increase in Unix socket file handles is due to
> improperly closed connections
Almost certainly.
> since I am also able to reproduce the same
> unix socket leak by invoking stop() on the HTTP Connector via JMX. Just
> before stopping the connector my application had 4000 open connections
> (lsof showed these as 4000 IPv6 file handles). On invoking stop() via JMX,
> I the number of IPv6 file went down to about 70, while the number of unix
> socket file handles went up by 4000. It seems that these incorrectly closed
> connections then incarnate as Unix socket handles.
The stop() issue should be easier to reproduce and easier to fix. Please
create a bugzilla issue for this particular problem.
> I have tried different versions of tomcat 6.0.32, 6.0.35, 7.0.21 and
> tomcat7.0.23 – they all have this issue. My application is using the
> default configuration of the NIO Connector. I dont think Comet or SendFile
> are being used. Furthermore, no unix sockets show up when I use Blocking IO
> (default HTTP handler).
Thanks, that helps.
> I would appreciate the help of the community in addressing this issue.
We can take a look at the NIO code but finding leaks like this purely
from code inspection is tricky to say the least.
Anything you can do to increase the rate of the leak and/or to provide a
test case that demonstrates the issue would be useful.
Mark
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org