[Libguestfs] [PATCH nbdkit 1/3] filters: stats: Show size in GiB, rate in MiB/s

Nir Soffer nirsof at gmail.com
Sat Nov 30 00:17:05 UTC 2019


I find bytes and bits-per-second unhelpful and hard to parse. Using GiB
for sizes works for common disk images, and MiB/s works for common
storage throughput.

Here is an example run with this change:

$ ./nbdkit --foreground \
    --unix /tmp/nbd.sock \
    --exportname '' \
    --filter stats \
    file file=/var/tmp/dst.img \
    statsfile=/dev/stderr \
    --run 'qemu-img convert -p -n -f raw -O raw -T none /var/tmp/fedora-30.img nbd:unix:/tmp/nbd.sock'
    (100.00/100%)
elapsed time: 2.313 s
write: 1271 ops, 1.14 GiB, 502.63 MiB/s
zero: 1027 ops, 4.86 GiB, 2153.24 MiB/s
extents: 1 ops, 2.00 GiB, 885.29 MiB/s
---
 filters/stats/stats.c | 34 +++++++++++++++++++---------------
 1 file changed, 19 insertions(+), 15 deletions(-)

diff --git a/filters/stats/stats.c b/filters/stats/stats.c
index 98282e2..45bedae 100644
--- a/filters/stats/stats.c
+++ b/filters/stats/stats.c
@@ -49,6 +49,10 @@
 #include "cleanup.h"
 #include "tvdiff.h"
 
+#define MiB 1048576.0
+#define GiB 1073741824.0
+#define USEC 1000000.0
+
 static char *filename;
 static bool append;
 static FILE *fp;
@@ -64,34 +68,34 @@ static uint64_t extents_ops, extents_bytes;
 static uint64_t cache_ops, cache_bytes;
 
 static inline double
-calc_bps (uint64_t bytes, int64_t usecs)
+calc_mibps (uint64_t bytes, int64_t usecs)
 {
-  return 8.0 * bytes / usecs * 1000000.;
+  return bytes / MiB / usecs * USEC;
 }
 
 static inline void
 print_stats (int64_t usecs)
 {
-  fprintf (fp, "elapsed time: %g s\n", usecs / 1000000.);
+  fprintf (fp, "elapsed time: %.3f s\n", usecs / USEC);
 
   if (pread_ops > 0)
-    fprintf (fp, "read: %" PRIu64 " ops, %" PRIu64 " bytes, %g bits/s\n",
-             pread_ops, pread_bytes, calc_bps (pread_bytes, usecs));
+    fprintf (fp, "read: %" PRIu64 " ops, %.2f GiB, %.2f MiB/s\n",
+             pread_ops, pread_bytes / GiB, calc_mibps (pread_bytes, usecs));
   if (pwrite_ops > 0)
-    fprintf (fp, "write: %" PRIu64 " ops, %" PRIu64 " bytes, %g bits/s\n",
-             pwrite_ops, pwrite_bytes, calc_bps (pwrite_bytes, usecs));
+    fprintf (fp, "write: %" PRIu64 " ops, %.2f GiB, %.2f MiB/s\n",
+             pwrite_ops, pwrite_bytes / GiB, calc_mibps (pwrite_bytes, usecs));
   if (trim_ops > 0)
-    fprintf (fp, "trim: %" PRIu64 " ops, %" PRIu64 " bytes, %g bits/s\n",
-             trim_ops, trim_bytes, calc_bps (trim_bytes, usecs));
+    fprintf (fp, "trim: %" PRIu64 " ops, %.2f GiB, %.2f MiB/s\n",
+             trim_ops, trim_bytes / GiB, calc_mibps (trim_bytes, usecs));
   if (zero_ops > 0)
-    fprintf (fp, "zero: %" PRIu64 " ops, %" PRIu64 " bytes, %g bits/s\n",
-             zero_ops, zero_bytes, calc_bps (zero_bytes, usecs));
+    fprintf (fp, "zero: %" PRIu64 " ops, %.2f GiB, %.2f MiB/s\n",
+             zero_ops, zero_bytes / GiB, calc_mibps (zero_bytes, usecs));
   if (extents_ops > 0)
-    fprintf (fp, "extents: %" PRIu64 " ops, %" PRIu64 " bytes, %g bits/s\n",
-             extents_ops, extents_bytes, calc_bps (extents_bytes, usecs));
+    fprintf (fp, "extents: %" PRIu64 " ops, %.2f GiB, %.2f MiB/s\n",
+             extents_ops, extents_bytes / GiB, calc_mibps (extents_bytes, usecs));
   if (cache_ops > 0)
-    fprintf (fp, "cache: %" PRIu64 " ops, %" PRIu64 " bytes, %g bits/s\n",
-             cache_ops, cache_bytes, calc_bps (cache_bytes, usecs));
+    fprintf (fp, "cache: %" PRIu64 " ops, %.2f GiB, %.2f MiB/s\n",
+             cache_ops, cache_bytes / GiB, calc_mibps (cache_bytes, usecs));
 
   fflush (fp);
 }
-- 
2.21.0





More information about the Libguestfs mailing list