Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 08 Dec 2012 17:05:31 -0800
From:      Richard Sharpe <rsharpe@richardsharpe.com>
To:        Andre Oppermann <andre@freebsd.org>
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: Possible obscure socket leak when system under load and listener is slow to accept
Message-ID:  <1355015131.6752.12.camel@localhost.localdomain>
In-Reply-To: <50C3D22D.3060008@freebsd.org>
References:  <50C3D22D.3060008@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, 2012-12-09 at 00:50 +0100, Andre Oppermann wrote:
> > Hi folks,
> >
> > Our QA group (at xxx) using Samba and smbtorture has been seeing a
> > lot of cases where accept returns ECONNABORTED because the system load
> > is high and Samba has a large listen backlog.
> >
> > Every now and then we get a crash in smbd or in winbindd and winbindd
> > complains of too many open files in the system.
> >
> > In looking at kern_accept, it seems to me that FreeBSD can leak a socket
> > when kern_accept calls soaccept on it but gets ECONNABORTED. This error
> > is the only error returned from tcp_usr_accept.
> >
> > It seems like the socket taken off so_comp is never freed in this case
> > and that there has been a call on soref on it as well, so that something
> > like the following is needed in the error path:
> >
> > ==== //some-path/freebsd/sys/kern/uipc_syscalls.c#1
> > - /home/rsharpe/dev-src/packages/freebsd/sys/kern/uipc_syscalls.c ====
> > @@ -433,6 +433,14 @@
> >                  */
> >                 if (name)
> >                         *namelen = 0;
> > +               /*
> > +                * We need to close the socket we unlinked
> > +                * so we do not leak it.
> > +                */
> > +               ACCEPT_LOCK();
> > +               SOCK_LOCK(so);
> > +               soclose(so);
> >                 goto noconnection;
> >         }
> >         if (sa == NULL) {
> >
> > I think an soclose is needed at this point because soisconnected has
> > been called on the socket.
> >
> > Do you think this analysis is reasonable?
>  >
> > We are using FreeBSD 8.0 but it seems the same is true for 9.0. However,
> > maybe I am wrong since I am not sure if the fdclose call would free the
> > socket, but a quick look suggested that it doesn't.
> 
> The fdclose should properly tear down the file descriptor.  The call
> graph is: fdclose() -> fdrop() -> _fdrop() -> fo_close()/soo_close() ->
> soclose() -> sorele() -> sofree() -> sodealloc().
> 
> A socket leak would not count against "kern.maxfiles" unless the file
> descriptor leaks as well.  So it is unlikely that this is the problem.

OK, thanks for the feedback. I will keep looking.

> Samba may open a large number of files (real files and sockets) and
> you may run into the maxfiles limit.  You can check the limit with
> "sysctl kern.maxfiles" and increase it at boot time in boot/loader.conf
> with "kern.maxfiles=100000" for example.

Well, some of the smbds are dying, but it is possible that there is a
file leak in Samba or our VFS that we are tripping as well.




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1355015131.6752.12.camel>