CLOSE_WAIT sockets piling up on server side

Igor Sysoev is at rambler-co.ru
Tue Aug 14 13:03:10 MSD 2007


On Tue, Aug 14, 2007 at 01:52:44AM -0700, Mansoor Peerbhoy wrote:

> I'm facing a problem while running NGINX IMAP proxy in front of our company-developed IMAP server.
> We're using nginx based off 0.5.20, and the problem is that after a few days of NGINX running, 
> we see that the sockets on our backend IMAP server side are stuck in the CLOSE_WAIT state.
> 
> This socket represents the connection between NGINX and the backend server.
> 
> Basically, if the backend server is running on address X.X.X.X port 1143, and if NGINX is running on interface N.N.N.N,
> then over time, netstat shows me something like:
> 
> Active Internet connections (w/o servers)
> Proto Recv-Q Send-Q Local Address               Foreign Address             State      
> ...
> tcp        1      0 X.X.X.X:1143     N.N.N.N:33820    CLOSE_WAIT
> tcp        1      0 X.X.X.X:1143     N.N.N.N:38940    CLOSE_WAIT
> ...
> 
> And many other such sockets in the CLOSE_WAIT state.
> 
> Now, according to the TCP state transition diagram, a socket goes into CLOSE_WAIT when it has received a FIN from the remote end
> (i.e. the remote end has performed a shutdown or close), but the local end has not yet closed the socket.
> 
> So in this case, it would appear that NGINX is initiating a close, but the backend server side hasn't yet closed its end of the 
> connected socket.
> 
> These CLOSE_WAIT sockets pile up over time, and eventually, NGINX is not able to connect to the backend server anymore.
> 
> Also, since the Recv-Q column of the netstat output indicates that one byte has not yet been read off the server side socket, this
> is quite strange.
> 
> Have you seen problems like this ? I don't yet have access to our IMAP server source code, so I'm not sure why the server side hasn't 
> acknowledged the NGINX closing the socket.
> 
> On the other hand, this could also be due to a misbehaving client that has connected to NGINX and is causing NGINX to initiate a connection close when the server does not expect it. 
> 
> However, I tried manually connecting to our backend IMAP server via. netcat and closing the IMAP connection during various stages of the conversation. 
> 
> In all cases, the server responds to a client closing the socket, by closing its own end of the socket, and therefore, the CLOSE_WAIT state does not persist, and all is fine.
> 
> Our server side is written in Java, but I'm not aware of the lower level APIs that it uses for socket IO.
> 
> Any ideas ?

I suspect that backend is Linux 2.6.x or latest 2.4.x.
There are similar reports on these kernels.


-- 
Igor Sysoev
http://sysoev.ru/en/





More information about the nginx mailing list