[Libguestfs] [PATCH nbdkit] filters: stats: Show size and rate in human size
Richard W.M. Jones
rjones at redhat.com
Wed Dec 4 12:46:15 UTC 2019
I fixed a few things including whitespace, dealing with divide by
zero, and allocation failure. How about the attached version?
Rich.
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
libguestfs lets you edit virtual machines. Supports shell scripting,
bindings from many languages. http://libguestfs.org
-------------- next part --------------
>From 758bbd8a0a82e1c353d5a919a6589bb27dc7e6e7 Mon Sep 17 00:00:00 2001
From: Nir Soffer <nirsof at gmail.com>
Date: Wed, 4 Dec 2019 00:28:37 +0200
Subject: [PATCH] filters: stats: Show size and rate in human size
Make stats output easier to parse and more useful for humans.
Here is an example output with this change:
elapsed time: 1.33377 s
read: 248 ops, 4.75 MiB, 3.56 MiB/s
write: 78 ops, 32.64 MiB, 24.48 MiB/s
trim: 33 ops, 1.00 GiB, 767.75 MiB/s
flush: 9 ops, 0 bytes, 0 bytes/s
---
filters/stats/nbdkit-stats-filter.pod | 11 ++++---
filters/stats/stats.c | 41 ++++++++++++++++++++++-----
2 files changed, 39 insertions(+), 13 deletions(-)
diff --git a/filters/stats/nbdkit-stats-filter.pod b/filters/stats/nbdkit-stats-filter.pod
index e10399b..28693d4 100644
--- a/filters/stats/nbdkit-stats-filter.pod
+++ b/filters/stats/nbdkit-stats-filter.pod
@@ -25,12 +25,11 @@ number of read, write and trim operations involved:
run : \
mkfs ext4 /dev/sda
'
- elapsed time: 1.13974 s
- read: 207 ops, 4002304 bytes, 2.80928e+07 bits/s
- write: 12 ops, 614400 bytes, 4.31257e+06 bits/s
- trim: 33 ops, 1073741824 bytes, 7.53676e+09 bits/s
- zero: 4 ops, 33628160 bytes, 2.36041e+08 bits/s
- flush: 9 ops, 0 bytes, 0 bits/s
+ elapsed time: 1.33377 s
+ read: 248 ops, 4.75 MiB, 3.56 MiB/s
+ write: 78 ops, 32.64 MiB, 24.48 MiB/s
+ trim: 33 ops, 1.00 GiB, 767.75 MiB/s
+ flush: 9 ops, 0 bytes, 0 bytes/s
=head1 PARAMETERS
diff --git a/filters/stats/stats.c b/filters/stats/stats.c
index 919dc16..6e48017 100644
--- a/filters/stats/stats.c
+++ b/filters/stats/stats.c
@@ -71,18 +71,45 @@ static stat extents_st = { "extents" };
static stat cache_st = { "cache" };
static stat flush_st = { "flush" };
-static inline double
-calc_bps (uint64_t bytes, int64_t usecs)
+#define KiB 1024
+#define MiB 1048576
+#define GiB 1073741824
+
+static char *
+humansize (uint64_t bytes)
{
- return 8.0 * bytes / usecs * 1000000.;
+ int r;
+ char *ret;
+
+ if (bytes < KiB)
+ r = asprintf (&ret, "%" PRIu64 " bytes", bytes);
+ else if (bytes < MiB)
+ r = asprintf (&ret, "%.2f KiB", bytes / (double)KiB);
+ else if (bytes < GiB)
+ r = asprintf (&ret, "%.2f MiB", bytes / (double)MiB);
+ else
+ r = asprintf (&ret, "%.2f GiB", bytes / (double)GiB);
+ if (r == -1)
+ ret = NULL;
+ return ret;
}
-static inline void
+static void
print_stat (const stat *st, int64_t usecs)
{
- if (st->ops > 0)
- fprintf (fp, "%s: %" PRIu64 " ops, %" PRIu64 " bytes, %g bits/s\n",
- st->name, st->ops, st->bytes, calc_bps (st->bytes, usecs));
+ if (st->ops > 0) {
+ char *size = humansize (st->bytes);
+ char *rate =
+ usecs / 1000000.0 != 0 ?
+ humansize (st->bytes / (usecs / 1000000.0)) : NULL;
+
+ fprintf (fp, "%s: %" PRIu64 " ops, %s, %s/s\n",
+ st->name, st->ops,
+ size ? size : "(n/a)", rate ? rate : "(n/a)");
+
+ free (size);
+ free (rate);
+ }
}
static inline void
--
2.23.0
More information about the Libguestfs
mailing list