FreeBSD 7.0: sockets stuck in CLOSED state...
Vlad GALU
dudu at dudu.ro
Wed Jun 25 18:46:46 UTC 2008
On 6/25/08, Ali Niknam <freebsd-net at transip.nl> wrote:
> Dear All,
>
> Recently i've been upgrading some of my machines from FreeBSD 6.x amd64 to
> FreeBSD 7.0 amd64.
>
> After upgrading I noticed a weird error/bug. It seems that after several
> thousand TCP connections some seem to hang in 'CLOSED' state.
>
> netstat -n gives:
> ...
> tcp4 0 0 1.2.3.4.* 4.5.6.7.42149 CLOSED
> tcp4 39 0 1.2.3.4.* 4.5.6.7.54103 CLOSED
> tcp4 35 0 1.2.3.4.* 4.5.6.7.41718 CLOSED
> tcp4 38 0 1.2.3.4.* 4.5.6.7.55618 CLOSED
> tcp4 41 0 1.2.3.4.* 4.5.6.7.44230 CLOSED
> tcp4 39 0 1.2.3.4.* 4.5.6.7.49439 CLOSED
> ...
>
> These never go away; they gradually increase and increase until the
> application starts giving errors (probably because some socket or
> filedescriptor limit is reached). When the application is killed these
> entries disappear.
>
> The application in question is a self written DNS server, multithreaded,
> and running fine for years without any troubles on both BSD 5.x as well as
> 6.x. Also 32bits as well as 64bits on 6.x.
>
> Ofcourse that doesn't mean that the application is error free, however,
> after doing extensive testing I really can not find anything wrong with the
> application itself, so I'm thinking maybe there's a change somewhere that
> causes this? I know that tcp/network has been completely redone...
>
> What basically happens in the application is this:
> - one main tcp thread runs an infinite while loop waiting for new
> connections to arrive
> - as soon as one arrives a new thread is spawned that handles the newly
> created stream
> - it reads some bytes, writes some bytes, then closes it
> - thread exits
>
> What appears to happen is this: after the new thread is spawned it tries to
> read 2 bytes (DNS tcp length information). It gets back 0 bytes (EOF) and
> therefore closes the sockets and calls pthread_exit. However in netstat that
> same stream oftenly appears to have bytes 'stuck' in the in queue...
>
> I really can't see how this can cause hanging sockets in 'CLOSED' state.
> Even if the incoming queue isnt read entirely a call to close should close
> it. Also I really can't find any documentation in netstat, or elsewhere,
> about the 'CLOSED' state...
>
>
> Any help would greatly be appreciated!
>
>
> Kind Regards,
>
>
> Ali Niknam
> _______________________________________________
This looks like an issue we used to have at work, where a streaming
application suddenly started getting kevents for sockets that had been
already closed. While that was happening, a netstat output looked just
like yours. We never tracked it down, as we moved to other projects :(
--
~/.signature: no such file or directory
More information about the freebsd-net
mailing list