From nobody Tue Jun 14 16:50:09 2022 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4AE5B839C7B; Tue, 14 Jun 2022 16:50:11 +0000 (UTC) (envelope-from ambrisko@ambrisko.com) Received: from mail2.ambrisko.com (mail2.ambrisko.com [70.91.206.91]) by mx1.freebsd.org (Postfix) with ESMTP id 4LMvYt5dvvz3JcV; Tue, 14 Jun 2022 16:50:10 +0000 (UTC) (envelope-from ambrisko@ambrisko.com) IronPort-SDR: JTAYaj8LO5sP8O8aFdjTKcoRd0aSNKg9yRXoZMLUgYKpbiHu1pxEZgM5+jDHkeymqCO9SP5TfG KLJYWrP6A5oQECkU7RuzprphosNAAL61Y= X-Ambrisko-Me: Yes IronPort-Data: A9a23:fBunW65JMtSkd2btUJWx7AxRtO3HchMFZxGqfqrLsTDasY5as4F+v mpMCziEOanbZmvzfdxyOdix/B4B6JbUn9BnGgc9/ypjQiMRo6IpJzg5wmQcns+2BpeeJK5fA kl3huDodKjYdFeFzvuQGuOJQUdUhPjgqoXUWLas1hBZHWeIeQ954f5Rs7dRbr1A3bBVNziwV eba+KUzDrMFNwlcaQr444rbwP9mUW+bVDkw5jTSbtgT1LPSeuV84Dvy+MiMw3XErol8RoZWR s7Cyq205GXQ+1EkD9m/k634dQsBRbu60Qqm0ysMHfH80l4b4HZaPqUTbJLwbW9ejj+Tnstyz /1EsJaqSBwqOevHn+F1vxxwTnonZfcakFPACT3l2SCJ9GXDcXTx0fRtJE4zNIwcvO1wBAlm/ PkSMjEWbRerifi7zbigRq9rnMtLBNLxN8YUvXRlzC3FAOw9aZ7ZTqjA/tMe2y0/7uhCEOibb M0cbDtzd1HbeRYKM1MTIJwkkeqinXW5dCdXwHqZqLRy6G/WyQ1ty/32KtGQf9WLQ+1bhEuVr HnKuWPjDXkn2Ha3odae2mmhnPHCh3m9UYcYDryj9fksi1qWrlH/wSY+DTOTycRVQGbnMz6GA 0BLqCcos4Yo80mnEov0UxGi+ifWtxsWQdtLEOoS4QSH0KvP4AHfDW8BF2YTZNsjvc4wZDory l7ZwouwVGA36OWYGSCH67OZjTKuIixJf2UMUjAJEFke6N75rYBt0h+WFoR/ELS4h8HeEC3rx 2zYtzA3grge1JZZ16iy8V3drSiro5zFElw86gnNBDv35wZzfo++ZIuA4F3R9/dbL4HfRV6E5 SBWl8+b5eEILJeMiC3dHb1UTe3xv66IaWSOj0RuEp8t8yWW10SiJY0AsitjIEpJM9offWO7a kHkpg4MtoRYO2GnbPErbtvpWdgq16XpCf/sSuvQMohVepF0eQKKoHNuaEqX0zy/mUQgi/tma 5adbcu2C38eT61ixiC3XOQal7Qsw3lml2/UQJn6yTWh0KafNCPNEOZZaAPWY7Br9r6ArSXU7 81bZpmDxBhoWeHjZjXarNwIJlcQIHlnXZ37955NeuiYLlY0EW0tEaWJk6gsYZJohf4Tn+LC5 HCmWUgew1363CWVJQKPY3FlSbXuQZcv8CpibHB0ZQ6liyo5fIKizKYDbJ9mL7Ao+dtqweNwU /RYKd6LBe5CS2if9jkQBXUnQFeOqPh/adqyAheY IronPort-HdrOrdr: A9a23:ckr1r6wHxJa+/WKReMbDKrPwLL1zdoMgy1knxilNoNJuE/Bws/ re+8jztCWE7Ar5N0tNpTntAsa9qDbnhPhICOoqTNKftWvdyQiVxehZhOOIrgEIWReOlNK1vp 0BT0ERMrPN5WgRt6zH3DU= Received: from server2.ambrisko.com (HELO internal.ambrisko.com) ([192.168.1.2]) by ironport2.ambrisko.com with ESMTP; 14 Jun 2022 08:43:40 -0700 Received: from ambrisko.com (localhost [127.0.0.1]) by internal.ambrisko.com (8.17.1/8.17.1) with ESMTPS id 25EGo9Kc068476 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NO); Tue, 14 Jun 2022 09:50:09 -0700 (PDT) (envelope-from ambrisko@ambrisko.com) X-Authentication-Warning: internal.ambrisko.com: Host localhost [127.0.0.1] claimed to be ambrisko.com Received: (from ambrisko@localhost) by ambrisko.com (8.17.1/8.17.1/Submit) id 25EGo9iO068475; Tue, 14 Jun 2022 09:50:09 -0700 (PDT) (envelope-from ambrisko) Date: Tue, 14 Jun 2022 09:50:09 -0700 From: Doug Ambrisko To: Mateusz Guzik Cc: Doug Ambrisko , src-committers@freebsd.org, dev-commits-src-all@freebsd.org, dev-commits-src-main@freebsd.org Subject: Re: git: 6468cd8e0ef9 - main - mount: add vnode usage per file system with mount -v Message-ID: References: <202206131457.25DEvJDU044469@gitrepo.freebsd.org> List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: X-Rspamd-Queue-Id: 4LMvYt5dvvz3JcV X-Spamd-Bar: ---- Authentication-Results: mx1.freebsd.org; none X-Spamd-Result: default: False [-4.00 / 15.00]; REPLY(-4.00)[] X-ThisMailContainsUnwantedMimeParts: N On Mon, Jun 13, 2022 at 09:56:38PM +0200, Mateusz Guzik wrote: | On 6/13/22, Doug Ambrisko wrote: | > On Mon, Jun 13, 2022 at 06:43:31PM +0200, Mateusz Guzik wrote: | > | On 6/13/22, Doug Ambrisko wrote: | > | > The branch main has been updated by ambrisko: | > | > | > | > URL: | > | > | > https://cgit.FreeBSD.org/src/commit/?id=6468cd8e0ef9d1d3331e9de26cd2be59bc778494 | > | > | > | > commit 6468cd8e0ef9d1d3331e9de26cd2be59bc778494 | > | > Author: Doug Ambrisko | > | > AuthorDate: 2022-06-13 14:56:38 +0000 | > | > Commit: Doug Ambrisko | > | > CommitDate: 2022-06-13 14:56:38 +0000 | > | > | > | > mount: add vnode usage per file system with mount -v | > | > | > | > This avoids the need to drop into the ddb to figure out vnode | > | > usage per file system. It helps to see if they are or are not | > | > being freed. Suggestion to report active vnode count was from | > | > kib@ | > | > | > | > Reviewed by: kib | > | > Differential Revision: https://reviews.freebsd.org/D35436 | > | > --- | > | > sbin/mount/mount.c | 7 +++++++ | > | > sys/kern/vfs_mount.c | 12 ++++++++++++ | > | > sys/sys/mount.h | 4 +++- | > | > 3 files changed, 22 insertions(+), 1 deletion(-) | > | > | > | > diff --git a/sbin/mount/mount.c b/sbin/mount/mount.c | > | > index 79d9d6cb0caf..bd3d0073c474 100644 | > | > --- a/sbin/mount/mount.c | > | > +++ b/sbin/mount/mount.c | > | > @@ -692,6 +692,13 @@ prmount(struct statfs *sfp) | > | > xo_emit("{D:, }{Lw:fsid}{:fsid}", fsidbuf); | > | > free(fsidbuf); | > | > } | > | > + if (sfp->f_nvnodelistsize != 0 || sfp->f_avnodecount != 0) { | > | > + xo_open_container("vnodes"); | > | > + xo_emit("{D:, | > | > }{Lwc:vnodes}{Lw:count}{w:count/%ju}{Lw:active}{:active/%ju}", | > | > + (uintmax_t)sfp->f_nvnodelistsize, | > | > + (uintmax_t)sfp->f_avnodecount); | > | > + xo_close_container("vnodes"); | > | > + } | > | > } | > | > xo_emit("{D:)}\n"); | > | > } | > | > diff --git a/sys/kern/vfs_mount.c b/sys/kern/vfs_mount.c | > | > index 71a40fd97a9c..e3818b67e841 100644 | > | > --- a/sys/kern/vfs_mount.c | > | > +++ b/sys/kern/vfs_mount.c | > | > @@ -2610,6 +2610,8 @@ vfs_copyopt(struct vfsoptlist *opts, const char | > *name, | > | > void *dest, int len) | > | > int | > | > __vfs_statfs(struct mount *mp, struct statfs *sbp) | > | > { | > | > + struct vnode *vp; | > | > + uint32_t count; | > | > | > | > /* | > | > * Filesystems only fill in part of the structure for updates, we | > | > @@ -2624,6 +2626,16 @@ __vfs_statfs(struct mount *mp, struct statfs | > *sbp) | > | > sbp->f_version = STATFS_VERSION; | > | > sbp->f_namemax = NAME_MAX; | > | > sbp->f_flags = mp->mnt_flag & MNT_VISFLAGMASK; | > | > + sbp->f_nvnodelistsize = mp->mnt_nvnodelistsize; | > | > + | > | > + count = 0; | > | > + MNT_ILOCK(mp); | > | > + TAILQ_FOREACH(vp, &mp->mnt_nvnodelist, v_nmntvnodes) { | > | > + if (vrefcnt(vp) > 0) /* racy but does not matter */ | > | > + count++; | > | > + } | > | > + MNT_IUNLOCK(mp); | > | > + sbp->f_avnodecount = count; | > | > | > | | > | libc uses statfs for dir walk (see gen/fts.c), most notably find | > | immediately runs into it. As such the linear scan by default is a | > | non-starter. | > | | > | I don't know if mount is the right place to dump this kind of info to | > | begin with, but even so, it should only happen with a dedicated flag. | > | | > | As statfs does not take any flags on its own, there is no way to | > | prevent it from doing the above walk. Perhaps a dedicated sysctl which | > | takes mount point id could do the walk instead, when asked. | > | | > | Short of making the walk optional I'm afraid this will have to be | > reverted. | > | > Just to be clear, this isn't breaking things but is not optimal for | > things that don't need this extra info. | > | | It's not "not optimal", it's a significant overhead which taxes | frequent users which don't benefit from it. | | For more data I plugged dtrace -n 'fbt::__vfs_statfs:entry { | @[execname] = count(); }' while package building, then i got tons of | hits: | [snip] | expr 13992 | install 14090 | dirname 14921 | mv 17404 | ghc-stage1 17577 | grep 18998 | xgcc 23832 | cpp 29282 | cc1 36961 | sh 70575 | rm 73904 | ld.lld 87784 | sed 88803 | c++ 98175 | cat 115811 | cc 449725 | I rather not revert it all but revert the active part that kib@ thought would be useful versus lazy vnodes. This is what I propose to commit: diff --git a/sbin/mount/mount.c b/sbin/mount/mount.c index bd3d0073c47..6c986907bcd 100644 --- a/sbin/mount/mount.c +++ b/sbin/mount/mount.c @@ -692,11 +692,10 @@ prmount(struct statfs *sfp) xo_emit("{D:, }{Lw:fsid}{:fsid}", fsidbuf); free(fsidbuf); } - if (sfp->f_nvnodelistsize != 0 || sfp->f_avnodecount != 0) { + if (sfp->f_nvnodelistsize != 0) { xo_open_container("vnodes"); - xo_emit("{D:, }{Lwc:vnodes}{Lw:count}{w:count/%ju}{Lw:active}{:active/%ju}", - (uintmax_t)sfp->f_nvnodelistsize, - (uintmax_t)sfp->f_avnodecount); + xo_emit("{D:, }{Lwc:vnodes}{Lw:count}{w:count/%ju}", + (uintmax_t)sfp->f_nvnodelistsize); xo_close_container("vnodes"); } } diff --git a/sys/kern/vfs_mount.c b/sys/kern/vfs_mount.c index e3818b67e84..3c55f83633a 100644 --- a/sys/kern/vfs_mount.c +++ b/sys/kern/vfs_mount.c @@ -2610,9 +2610,6 @@ vfs_copyopt(struct vfsoptlist *opts, const char *name, void *dest, int len) int __vfs_statfs(struct mount *mp, struct statfs *sbp) { - struct vnode *vp; - uint32_t count; - /* * Filesystems only fill in part of the structure for updates, we * have to read the entirety first to get all content. @@ -2628,15 +2625,6 @@ __vfs_statfs(struct mount *mp, struct statfs *sbp) sbp->f_flags = mp->mnt_flag & MNT_VISFLAGMASK; sbp->f_nvnodelistsize = mp->mnt_nvnodelistsize; - count = 0; - MNT_ILOCK(mp); - TAILQ_FOREACH(vp, &mp->mnt_nvnodelist, v_nmntvnodes) { - if (vrefcnt(vp) > 0) /* racy but does not matter */ - count++; - } - MNT_IUNLOCK(mp); - sbp->f_avnodecount = count; - return (mp->mnt_op->vfs_statfs(mp, sbp)); } diff --git a/sys/sys/mount.h b/sys/sys/mount.h index edac64171f9..ffb2676258f 100644 --- a/sys/sys/mount.h +++ b/sys/sys/mount.h @@ -92,7 +92,7 @@ struct statfs { uint64_t f_syncreads; /* count of sync reads since mount */ uint64_t f_asyncreads; /* count of async reads since mount */ uint32_t f_nvnodelistsize; /* # of vnodes */ - uint32_t f_avnodecount; /* # of active vnodes */ + uint32_t f_spare0; /* unused spare */ uint64_t f_spare[9]; /* unused spare */ uint32_t f_namemax; /* maximum filename length */ uid_t f_owner; /* user that mounted the filesystem */ the single assignment of: sbp->f_nvnodelistsize = mp->mnt_nvnodelistsize; shouldn't cause much of a performance issue. Output is now: root@client:~ # mount -v 192.168.35.1:/data/home/ambrisko/netboot on / (nfs, fsid 01ff003a3a000000, vnodes: count 567 ) devfs on /dev (devfs, fsid 00ff007171000000, vnodes: count 27 ) procfs on /proc (procfs, local, fsid 02ff000202000000, vnodes: count 2 ) linprocfs on /compat/linux/proc (linprocfs, local, fsid 03ff00b5b5000000, vnodes: count 2 ) linsysfs on /compat/linux/sys (linsysfs, local, fsid 04ff008a8a000000, vnodes: count 2 ) fdescfs on /dev/fd (fdescfs, fsid 05ff005959000000, vnodes: count 3 ) tmpfs on /tmp (tmpfs, local, fsid 06ff008787000000, vnodes: count 6 ) tmpfs on /var/tmp (tmpfs, local, fsid 07ff008787000000, vnodes: count 2 ) tmpfs on /var/run (tmpfs, local, fsid 08ff008787000000, vnodes: count 8 ) devfs on /compat/linux/dev (devfs, fsid 09ff007171000000, vnodes: count 4 ) fdescfs on /compat/linux/dev/fd (fdescfs, fsid 0aff005959000000, vnodes: count 2 ) tmpfs on /compat/linux/dev/shm (tmpfs, local, fsid 0bff008787000000, vnodes: count 2 ) 192.168.31.1:/data on /data (nfs, fsid 0cff003a3a000000, vnodes: count 2 ) root@client:~ # Thanks, Doug A.