From: Miklos Szeredi <miklos@szeredi.hu>
To: David Howells <dhowells@redhat.com>
Cc: Karel Zak <kzak@redhat.com>,
Christian Brauner <christian.brauner@ubuntu.com>,
Linus Torvalds <torvalds@linux-foundation.org>,
Al Viro <viro@zeniv.linux.org.uk>,
dray@redhat.com, Miklos Szeredi <mszeredi@redhat.com>,
Steven Whitehouse <swhiteho@redhat.com>,
Jeff Layton <jlayton@redhat.com>, Ian Kent <raven@themaw.net>,
andres@anarazel.de, keyrings@vger.kernel.org,
linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org,
Lennart Poettering <lennart@poettering.net>,
Aleksa Sarai <cyphar@cyphar.com>
Subject: Re: Upcoming: Notifications, FS notifications and fsinfo()
Date: Wed, 01 Apr 2020 15:25:54 +0000 [thread overview]
Message-ID: <CAJfpeguLJcAEgx2JWRNcKMkyFTWB0r4wS6F4fJHK3VHtY=EjXQ@mail.gmail.com> (raw)
In-Reply-To: <2488734.1585749502@warthog.procyon.org.uk>
[-- Attachment #1: Type: text/plain, Size: 1653 bytes --]
On Wed, Apr 1, 2020 at 3:58 PM David Howells <dhowells@redhat.com> wrote:
>
> David Howells <dhowells@redhat.com> wrote:
>
> > > Attached patch applies against readfile patch.
> >
> > But doesn't actually do what Karel asked for. show_mountinfo() itself does
> > not give you what Karel asked for.
Not sure what you mean. I think it shows precisely the information
Karel asked for.
> Plus there's more information you need to
> > add to it.
The mountinfo format is extensible (see
Documentation/filesystems/proc.txt) so for example adding the change
counters would be simple.
> And arguably, it's worse than just reading /proc/mounts. If you get a
> notification that something changed (ie. you poll /proc/mounts or mount
> notifications gives you an overrun) you now have to read *every*
> /mountfs/*/info file. That is way more expensive.
fsinfo(2) will never be substantially cheaper than reading and parsing
/mnt/MNT_ID/info. In fact reading a large part of the mount table
using fsinfo(2) will be substantially slower than parsing
/proc/self/mountinfo (this doesn't actually do the parsing but that
would add a very small amount of overhead):
root@kvm:~# ./test-fsinfo-perf /tmp/a 30000
--- make mounts ---
--- test fsinfo by path ---
sum(mnt_id) = 960000
--- test fsinfo by mnt_id ---
sum(mnt_id) = 960000
--- test /proc/fdinfo ---
sum(mnt_id) = 960000
--- test mountfs ---
sum(mnt_id) = 960000
--- test mountinfo ---
sum(mnt_id) = 960000
For 30000 mounts, f= 154963us f2= 148337us p= 1803699us p2=
257019us; m= 53996us; p=11.6*f p=12.2*f2 p=7.0*p2 p=33.4*m
--- umount ---
Yes, that's 33 times faster!
Thanks,
Miklos
[-- Attachment #2: test-fsinfo-perf-mountinfo.patch --]
[-- Type: text/x-patch, Size: 3709 bytes --]
---
samples/vfs/test-fsinfo-perf.c | 91 +++++++++++++++++++++++++++++++++++++++--
1 file changed, 87 insertions(+), 4 deletions(-)
--- a/samples/vfs/test-fsinfo-perf.c
+++ b/samples/vfs/test-fsinfo-perf.c
@@ -339,6 +339,79 @@ static void get_id_by_mountfs(void)
} while (p = comma, *comma);
}
+static void get_id_by_mountinfo(void)
+{
+ unsigned int base_mnt_id, mnt_id, x;
+ ssize_t len;
+ char procfile[100], buffer[4096], *p, *nl;
+ int fd, fd2, mntfd;
+
+ /* Start off by reading the mount ID from the base path */
+ fd = open(base_path, O_PATH);
+ ERR(fd, "open/path");
+ sprintf(procfile, "/proc/self/fdinfo/%u", fd);
+ fd2 = open(procfile, O_RDONLY);
+ ERR(fd2, "open/proc");
+ len = read(fd2, buffer, sizeof(buffer) - 1);
+ ERR(len, "read");
+ buffer[len] = 0;
+ close(fd2);
+ close(fd);
+
+ p = buffer;
+ do {
+ nl = strchr(p, '\n');
+ if (nl)
+ *nl++ = '\0';
+ else
+ nl = NULL;
+
+ if (strncmp(p, "mnt_id:", 7) != 0)
+ continue;
+ p += 7;
+ while (isblank(*p))
+ p++;
+ /* Have to allow for extra numbers being added to the line */
+ if (sscanf(p, "%u", &base_mnt_id) != 1) {
+ fprintf(stderr, "Bad format %s\n", procfile);
+ exit(3);
+ }
+ break;
+
+ } while ((p = nl));
+
+ if (!p) {
+ fprintf(stderr, "Missing field %s\n", procfile);
+ exit(3);
+ }
+
+ if (0) printf("[B] %u\n", base_mnt_id);
+
+ mntfd = open("/proc/self/mountinfo", O_RDONLY);
+ ERR(mntfd, "/proc/self/mountinfo");
+
+ while ((len = read(mntfd, buffer, sizeof(buffer)))) {
+ ERR(len, "read/mountinfo");
+
+ for (p = buffer; p < buffer + len; p = nl + 1) {
+ nl = strchr(p, '\n');
+ if (!nl) {
+ fprintf(stderr, "error parsing mountinfo\n");
+ exit(3);
+ }
+ *nl = '\0';
+ if (sscanf(p, "%i %i", &mnt_id, &x) != 2) {
+ fprintf(stderr, "error parsing mountinfo\n");
+ exit(3);
+ }
+ if (x == base_mnt_id)
+ sum_check += x;
+ }
+ }
+
+ close(mntfd);
+}
+
static unsigned long duration(struct timeval *before, struct timeval *after)
{
unsigned long a, b;
@@ -354,8 +427,9 @@ int main(int argc, char **argv)
struct timeval f2_before, f2_after;
struct timeval p_before, p_after;
struct timeval p2_before, p2_after;
+ struct timeval m_before, m_after;
const char *path;
- unsigned long f_dur, f2_dur, p_dur, p2_dur;
+ unsigned long f_dur, f2_dur, p_dur, p2_dur, m_dur;
if (argc < 2) {
fprintf(stderr, "Format: %s <path> [nr_mounts]\n", argv[0]);
@@ -402,17 +476,26 @@ int main(int argc, char **argv)
ERR(gettimeofday(&p2_after, NULL), "gettimeofday");
printf("sum(mnt_id) = %lu\n", sum_check);
+ printf("--- test mountinfo ---\n");
+ sum_check = 0;
+ ERR(gettimeofday(&m_before, NULL), "gettimeofday");
+ get_id_by_mountinfo();
+ ERR(gettimeofday(&m_after, NULL), "gettimeofday");
+ printf("sum(mnt_id) = %lu\n", sum_check);
+
f_dur = duration(&f_before, &f_after);
f2_dur = duration(&f2_before, &f2_after);
p_dur = duration(&p_before, &p_after);
p2_dur = duration(&p2_before, &p2_after);
+ m_dur = duration(&m_before, &m_after);
//printf("fsinfo duration %10luus for %d mounts\n", f_dur, nr_mounts);
//printf("procfd duration %10luus for %d mounts\n", p_dur, nr_mounts);
- printf("For %7d mounts, f=%10luus f2=%10luus p=%10luus p2=%10luus; p=%.1f*f p=%.1f*f2 p=%.1f*p2\n",
- nr_mounts, f_dur, f2_dur, p_dur, p2_dur,
+ printf("For %7d mounts, f=%10luus f2=%10luus p=%10luus p2=%10luus; m=%10luus; p=%.1f*f p=%.1f*f2 p=%.1f*p2 p=%.1f*m\n",
+ nr_mounts, f_dur, f2_dur, p_dur, p2_dur, m_dur,
(double)p_dur / (double)f_dur,
(double)p_dur / (double)f2_dur,
- (double)p_dur / (double)p2_dur);
+ (double)p_dur / (double)p2_dur,
+ (double)p_dur / (double)m_dur);
return 0;
}
next prev parent reply other threads:[~2020-04-01 15:25 UTC|newest]
Thread overview: 97+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-03-30 13:58 Upcoming: Notifications, FS notifications and fsinfo() David Howells
2020-03-30 14:31 ` [GIT PULL] General notification queue and key notifications David Howells
2020-03-31 6:51 ` Stephen Rothwell
2020-06-02 15:55 ` David Howells
2020-06-03 2:15 ` Ian Kent
2020-06-08 0:49 ` Ian Kent
2020-06-10 9:56 ` Christian Brauner
2020-06-10 11:12 ` Karel Zak
2020-06-12 21:32 ` Linus Torvalds
2020-06-12 22:01 ` Linus Torvalds
2020-06-13 13:04 ` David Howells
2020-06-13 16:47 ` Linus Torvalds
2020-06-13 17:03 ` Linus Torvalds
2020-06-13 19:22 ` Miklos Szeredi
2020-06-13 13:24 ` David Howells
2020-06-13 18:00 ` pr-tracker-bot
2020-06-17 1:15 ` Williams, Dan J
2020-06-23 23:38 ` Dan Williams
2020-06-24 0:55 ` David Howells
2020-06-24 1:03 ` Dan Williams
2020-06-24 1:17 ` David Howells
2020-03-30 14:36 ` [GIT PULL] Mount and superblock notifications David Howells
2020-04-04 21:13 ` Linus Torvalds
2020-04-05 22:52 ` Andres Freund
2020-03-30 14:43 ` [GIT PULL] fsinfo: Filesystem information query David Howells
2020-03-30 20:28 ` Upcoming: Notifications, FS notifications and fsinfo() Miklos Szeredi
2020-03-31 9:21 ` Karel Zak
2020-03-30 21:17 ` Christian Brauner
2020-03-31 5:11 ` Miklos Szeredi
2020-03-31 8:15 ` Christian Brauner
2020-03-31 8:34 ` Miklos Szeredi
2020-03-31 8:34 ` Karel Zak
2020-03-31 8:56 ` Miklos Szeredi
2020-03-31 9:49 ` Karel Zak
2020-03-31 12:25 ` Lennart Poettering
2020-03-31 15:10 ` Miklos Szeredi
2020-03-31 15:24 ` Lennart Poettering
2020-03-31 21:56 ` David Howells
2020-03-31 21:54 ` David Howells
2020-04-01 8:43 ` Karel Zak
2020-03-31 7:22 ` Lennart Poettering
2020-03-31 17:31 ` David Howells
2020-03-31 19:42 ` Miklos Szeredi
2020-03-31 19:47 ` David Howells
2020-03-31 21:14 ` David Howells
2020-03-31 21:23 ` David Howells
2020-03-31 21:52 ` David Howells
2020-04-01 9:04 ` Karel Zak
2020-04-01 13:34 ` Miklos Szeredi
2020-04-01 13:55 ` David Howells
2020-04-01 13:58 ` David Howells
2020-04-01 15:25 ` Miklos Szeredi [this message]
2020-04-03 9:11 ` Karel Zak
2020-04-01 16:01 ` David Howells
2020-04-01 16:30 ` Miklos Szeredi
2020-04-02 15:22 ` David Howells
2020-04-02 15:24 ` Miklos Szeredi
2020-04-02 15:42 ` David Howells
2020-04-02 15:24 ` David Howells
2020-04-01 14:41 ` Lennart Poettering
2020-04-01 15:33 ` Miklos Szeredi
2020-04-01 16:06 ` David Howells
2020-04-01 16:40 ` Miklos Szeredi
2020-04-02 2:52 ` Ian Kent
2020-04-02 13:52 ` Miklos Szeredi
2020-04-02 14:36 ` Lennart Poettering
2020-04-02 15:22 ` Miklos Szeredi
2020-04-02 15:28 ` Lennart Poettering
2020-04-02 15:35 ` Miklos Szeredi
2020-04-02 15:50 ` Lennart Poettering
2020-04-02 17:20 ` Miklos Szeredi
2020-04-03 11:08 ` Lennart Poettering
2020-04-03 11:48 ` Miklos Szeredi
2020-04-03 15:01 ` Lennart Poettering
2020-04-06 9:22 ` Miklos Szeredi
2020-04-06 17:29 ` Lennart Poettering
2020-04-07 2:21 ` Ian Kent
2020-04-07 13:59 ` Miklos Szeredi
2020-04-07 15:53 ` Lennart Poettering
2020-04-07 16:06 ` Miklos Szeredi
2020-04-02 15:51 ` David Howells
2020-04-02 15:56 ` David Howells
2020-04-03 1:44 ` Ian Kent
2020-04-03 11:11 ` Lennart Poettering
2020-04-03 11:38 ` Miklos Szeredi
2020-04-03 12:05 ` Richard Weinberger
2020-04-03 15:12 ` Lennart Poettering
2020-04-03 20:30 ` J. Bruce Fields
2020-04-06 8:35 ` Miklos Szeredi
2020-04-06 16:07 ` J. Bruce Fields
2020-04-06 9:17 ` Karel Zak
2020-04-06 16:34 ` Linus Torvalds
2020-04-06 18:46 ` J. Bruce Fields
2020-04-06 18:48 ` Lennart Poettering
2020-04-08 3:36 ` Linus Torvalds
2020-04-03 15:36 ` David Howells
2020-04-03 15:41 ` Lennart Poettering
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CAJfpeguLJcAEgx2JWRNcKMkyFTWB0r4wS6F4fJHK3VHtY=EjXQ@mail.gmail.com' \
--to=miklos@szeredi.hu \
--cc=andres@anarazel.de \
--cc=christian.brauner@ubuntu.com \
--cc=cyphar@cyphar.com \
--cc=dhowells@redhat.com \
--cc=dray@redhat.com \
--cc=jlayton@redhat.com \
--cc=keyrings@vger.kernel.org \
--cc=kzak@redhat.com \
--cc=lennart@poettering.net \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mszeredi@redhat.com \
--cc=raven@themaw.net \
--cc=swhiteho@redhat.com \
--cc=torvalds@linux-foundation.org \
--cc=viro@zeniv.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).