misc/151111: vnodes leakage during zfs unmount
Gleb Kurtsou
gleb.kurtsou at gmail.com
Tue Oct 19 14:54:27 UTC 2010
On (19/10/2010 17:36), Gleb Kurtsou wrote:
> On (18/10/2010 12:30), Gleb Smirnoff wrote:
> > The following reply was made to PR kern/151111; it has been noted by GNATS.
> >
> > From: Gleb Smirnoff <glebius at FreeBSD.org>
> > To: "Oleg A. Mamontov" <oleg at mamontov.net>
> > Cc: kib at FreeBSD.org, pjd at FreeBSD.org, freebsd-gnats-submit at FreeBSD.org
> > Subject: Re: misc/151111: vnodes leakage during zfs unmount
> > Date: Mon, 18 Oct 2010 16:11:55 +0400
> >
> > On Thu, Sep 30, 2010 at 11:56:18AM +0000, Oleg A. Mamontov wrote:
> > O> for i in `jot 1000`; do zfs mount tank; printf '%4d ' $i; sysctl vfs.numvnodes; zfs umount tank; done
> > O> ########################
> > O> 1 vfs.numvnodes: 708
> > O> 2 vfs.numvnodes: 709
> > O> 3 vfs.numvnodes: 710
> > O> 4 vfs.numvnodes: 711
> > O> 5 vfs.numvnodes: 712
> > O>
> > O> ..
> > O>
> > O> 995 vfs.numvnodes: 1702
> > O> 996 vfs.numvnodes: 1703
> > O> 997 vfs.numvnodes: 1704
> > O> 998 vfs.numvnodes: 1705
> > O> 999 vfs.numvnodes: 1706
> > O> 1000 vfs.numvnodes: 1707
>
> In my tests zfs vnodes are getting properly gc'ed. Most likely maxvnodes
> limit is not hit during the test, thus vnodes are not reclaimed.
>
> Try making all available vnodes used, e.g. by running
> 'find /usr >/dev/null' before the test. Running the test you'll see
> vfs.numvnodes going up and down.
>
> It's more visible after lowering kern.maxvnodes. I've used
> kern.maxvnodes=1000. Default value on my system is ~127000.
Please ignore my previous email. There is indeed a leak.
> > Here is my lame investigation of the problem. In the zfs_domount() function
> > we've got the following code:
> >
> > /* Grab extra reference. */
> > VERIFY(VFS_ROOT(vfsp, LK_EXCLUSIVE, &vp) == 0);
> > VOP_UNLOCK(vp, 0);
> >
> > I suppose this code is expected to put an extra reference on the
> > vfsp->mnt_vnodecovered vnode. Do I mistake here? If I don't then this is
> > the source of leak.
> >
> > Debugging shows that zfs_zget(), called subsequently from zfs_root(),
> > does not find an existing znode/vnode and allocates a new one, see at the
> > end of zfs_zget() function. This vnode gots a reference and is forgotten.
> >
> > Sorry, if I am being mistaken :)
> >
> > --
> > Totus tuus, Glebius.
> > _______________________________________________
> > freebsd-fs at freebsd.org mailing list
> > http://lists.freebsd.org/mailman/listinfo/freebsd-fs
> > To unsubscribe, send any mail to "freebsd-fs-unsubscribe at freebsd.org"
More information about the freebsd-fs
mailing list