]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs_io: add a quiet option to bulkstat
authorDave Chinner <dchinner@redhat.com>
Fri, 27 May 2022 20:36:14 +0000 (16:36 -0400)
committerEric Sandeen <sandeen@sandeen.net>
Fri, 27 May 2022 20:36:14 +0000 (16:36 -0400)
This is purely for driving the kernel bulkstat operations as hard
as userspace can drive them - we don't care about the actual output,
just want to drive maximum IO rates through the inode cache.

Bulkstat at 3.4 million inodes a second via xfs_io currently burns
about 30% of CPU time just formatting and outputting the stat
information to stdout and dumping it to /dev/null.

wall time rate IOPS bandwidth
unpatched 17.823s 3.4M/s 70k 1.9GB/s
with -q 15.682 6.1M/s  150k 3.5GB/s

The disks are at about 30% of max bandwidth and only at 70kiops, so
this CPU can be used to drive the kernel and IO subsystem harder.

Wall time doesn't really go down on this specific test because the
increase in inode cache turn-over (about 10GB/s of cached metadata
(in-core inodes and buffers) is being cycled through memory on a
machine with 16GB of RAM) and that hammers memory reclaim into a
utter mess that often takes seconds for it to recover from...

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
io/bulkstat.c
man/man8/xfs_io.8

index 201470b2922363cace7c3be10d3b2a98e2f1d6f5..4119420065915fe67c7f002f1404bba0f3fc7db2 100644 (file)
@@ -67,6 +67,7 @@ bulkstat_help(void)
 "\n"
 "   -a <agno>  Only iterate this AG.\n"
 "   -d         Print debugging output.\n"
+"   -q         Be quiet, no output.\n"
 "   -e <ino>   Stop after this inode.\n"
 "   -n <nr>    Ask for this many results at once.\n"
 "   -s <ino>   Inode to start with.\n"
@@ -104,11 +105,12 @@ bulkstat_f(
        uint32_t                ver = 0;
        bool                    has_agno = false;
        bool                    debug = false;
+       bool                    quiet = false;
        unsigned int            i;
        int                     c;
        int                     ret;
 
-       while ((c = getopt(argc, argv, "a:de:n:s:v:")) != -1) {
+       while ((c = getopt(argc, argv, "a:de:n:qs:v:")) != -1) {
                switch (c) {
                case 'a':
                        agno = cvt_u32(optarg, 10);
@@ -135,6 +137,9 @@ bulkstat_f(
                                return 1;
                        }
                        break;
+               case 'q':
+                       quiet = true;
+                       break;
                case 's':
                        startino = cvt_u64(optarg, 10);
                        if (errno) {
@@ -198,6 +203,8 @@ _("bulkstat: startino=%lld flags=0x%x agno=%u ret=%d icount=%u ocount=%u\n"),
                for (i = 0; i < breq->hdr.ocount; i++) {
                        if (breq->bulkstat[i].bs_ino > endino)
                                break;
+                       if (quiet)
+                               continue;
                        dump_bulkstat(&breq->bulkstat[i]);
                }
        }
index 86f70ad4ca0a5f5ac2a8f1b183048ac2049c54af..223b51523145504b590addb0125250c96f10dd95 100644 (file)
@@ -1145,7 +1145,7 @@ for the current memory mapping.
 
 .SH FILESYSTEM COMMANDS
 .TP
-.BI "bulkstat [ \-a " agno " ] [ \-d ] [ \-e " endino " ] [ \-n " batchsize " ] [ \-s " startino " ] [ \-v " version" ]
+.BI "bulkstat [ \-a " agno " ] [ \-d ] [ \-e " endino " ] [ \-n " batchsize " ] [ \-q ] [ \-s " startino " ] [ \-v " version" ]
 Display raw stat information about a bunch of inodes in an XFS filesystem.
 Options are as follows:
 .RS 1.0i
@@ -1166,6 +1166,10 @@ Defaults to stopping when the system call stops returning results.
 Retrieve at most this many records per call.
 Defaults to 4,096.
 .TP
+.BI \-q
+Run quietly.
+Does not parse or output retrieved bulkstat information.
+.TP
 .BI \-s " startino"
 Display inode allocation records starting with this inode.
 Defaults to the first inode in the filesystem.