From nobody Mon Jun 13 19:56:38 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 376DD85BC13; Mon, 13 Jun 2022 19:56:46 +0000 (UTC) (envelope-from mjguzik@gmail.com) Received: from mail-lf1-x134.google.com (mail-lf1-x134.google.com [IPv6:2a00:1450:4864:20::134]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "smtp.gmail.com", Issuer "GTS CA 1D4" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4LMMlf0qj8z4SyN; Mon, 13 Jun 2022 19:56:46 +0000 (UTC) (envelope-from mjguzik@gmail.com) Received: by mail-lf1-x134.google.com with SMTP id 20so10537529lfz.8; Mon, 13 Jun 2022 12:56:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=yy3FsCb/60b1b4bQrQ5dP6SAYuuVcOPB7Od3XCrr5R0=; b=SoZrmlG9Jtv3fgnIJVLV08ZRy6rGPb1J3JC7GQwc6FLAzqkj/+r3wasZNaNf00o6Cw r2H6j8rTXExO2p2WYqUJe0tS/vLZwPifEHSyq22sKARElC60kwAq+8MJ1vi8SBtktpy1 TNzOISy79sUcAf5hl37ggyTl5vV3ETiIIiEIPVZ4J4vLhGhGPcWyqezMiasRjMB0HbPK kiU6kxbnz2UXWd82CzdeND9NhGmMWGARaLVddXq8H9apbJQ/3IeoLMeeAAxNg9VsUdFK SAIcntDmXq4nQhyH1m3zd+RfSvLQQg5d6fCgd/mGkZs+37HCikjAJv2ldV08F97mb28a rbmA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=yy3FsCb/60b1b4bQrQ5dP6SAYuuVcOPB7Od3XCrr5R0=; b=BowUhnsfAIxnN/NlnK4FTqQbCShxSLRGph397+98eI0xp3uhAHJ8lw1k3IBThU+XYb d/sxxTTTvA2DE+xg8Pbq9YQK1CXSkRnFT5yrS2hdSW8dFv/fNqR7S5Kc3R0DR9sLOCpF RUtFmu+C9L5lB2ezpimI8C0vgon4i14XM1k8ksOpFG8XbsSQc3nSOBiVY9wif3X5d8N6 md0ZpNZAsLpweD91ShABssiUyNwPRpvrf2LyNMvSltrdSt+s9CtOhaG37hGUS7Uv+rQ6 MtmB99B+N19FVmXtORtYpB4TEn5uAEDACkVDYV+x5mxttFDm4J+H715hGlGoKE+g7mnq Cqmg== X-Gm-Message-State: AJIora+4Vtc1Lxa8MIWoOwzf7DYHi2z4QrS+xSpo43KYJVDPeGo0dsAa ropKwnrnBAusyw5NbAx2bEyzfrptsSv1DDG2EDaZsvS8 X-Google-Smtp-Source: AGRyM1tgvh7bBnW3OgDmwkFz1HBvnV6Nc+t4ESG2ghjpPGPay+FjBg8zqZNxhkgjN0VJ6zCd3p8/sWJ5AvLBGsmsDwQ= X-Received: by 2002:a19:431c:0:b0:479:2053:178e with SMTP id q28-20020a19431c000000b004792053178emr866302lfa.117.1655150199226; Mon, 13 Jun 2022 12:56:39 -0700 (PDT) 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 Received: by 2002:aa6:c2d2:0:b0:1e6:e5ee:dbad with HTTP; Mon, 13 Jun 2022 12:56:38 -0700 (PDT) In-Reply-To: References: <202206131457.25DEvJDU044469@gitrepo.freebsd.org> From: Mateusz Guzik Date: Mon, 13 Jun 2022 21:56:38 +0200 Message-ID: Subject: Re: git: 6468cd8e0ef9 - main - mount: add vnode usage per file system with mount -v To: Doug Ambrisko Cc: Doug Ambrisko , src-committers@freebsd.org, dev-commits-src-all@freebsd.org, dev-commits-src-main@freebsd.org Content-Type: text/plain; charset="UTF-8" X-Rspamd-Queue-Id: 4LMMlf0qj8z4SyN 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 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 > | > return (mp->mnt_op->vfs_statfs(mp, sbp)); > | > } > | > diff --git a/sys/sys/mount.h b/sys/sys/mount.h > | > index 3383bfe8f431..edac64171f9a 100644 > | > --- a/sys/sys/mount.h > | > +++ b/sys/sys/mount.h > | > @@ -91,7 +91,9 @@ struct statfs { > | > uint64_t f_asyncwrites; /* count of async writes since mount */ > | > uint64_t f_syncreads; /* count of sync reads since mount */ > | > uint64_t f_asyncreads; /* count of async reads since mount */ > | > - uint64_t f_spare[10]; /* unused spare */ > | > + uint32_t f_nvnodelistsize; /* # of vnodes */ > | > + uint32_t f_avnodecount; /* # of active vnodes */ > | > + uint64_t f_spare[9]; /* unused spare */ > | > uint32_t f_namemax; /* maximum filename length */ > | > uid_t f_owner; /* user that mounted the filesystem */ > | > fsid_t f_fsid; /* filesystem id */ > | > > > Thanks, > > Doug A. > -- Mateusz Guzik