[Libguestfs] [PATCH nbdkit 3/3] filters: stats: Add flush stats

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


flush is usually called once but in some cases most of the time is spent
in so we cannot ignore it.

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.107 s
write: 1271 ops, 1.14 GiB, 0.356 s, 3262.38 MiB/s
zero: 1027 ops, 4.86 GiB, 0.013 s, 390318.00 MiB/s
extents: 1 ops, 2.00 GiB, 0.000 s, 68266650.39 MiB/s
flush: 2 ops, 1.021 s
---
 filters/stats/stats.c | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/filters/stats/stats.c b/filters/stats/stats.c
index 86439e7..25e425b 100644
--- a/filters/stats/stats.c
+++ b/filters/stats/stats.c
@@ -66,6 +66,7 @@ static uint64_t trim_ops, trim_bytes, trim_usecs;
 static uint64_t zero_ops, zero_bytes, zero_usecs;
 static uint64_t extents_ops, extents_bytes, extents_usecs;
 static uint64_t cache_ops, cache_bytes, cache_usecs;
+static uint64_t flush_ops, flush_usecs;
 
 static inline double
 calc_mibps (uint64_t bytes, int64_t usecs)
@@ -96,6 +97,9 @@ print_stats (int64_t usecs)
   if (cache_ops > 0)
     fprintf (fp, "cache: %" PRIu64 " ops, %.2f GiB, %.3f s, %.2f MiB/s\n",
              cache_ops, cache_bytes / GiB, cache_usecs / USEC, calc_mibps (cache_bytes, cache_usecs));
+  if (flush_ops > 0)
+    fprintf (fp, "flush: %" PRIu64 " ops, %.3f s\n",
+             flush_ops, flush_usecs / USEC);
 
   fflush (fp);
 }
@@ -254,6 +258,30 @@ stats_trim (struct nbdkit_next_ops *next_ops, void *nxdata,
   return r;
 }
 
+/* Flush. */
+static int
+stats_flush (struct nbdkit_next_ops *next_ops, void *nxdata,
+             void *handle, uint32_t flags,
+             int *err)
+{
+  struct timeval start, end;
+  int64_t usecs;
+  int r;
+
+  gettimeofday (&start, NULL);
+  r = next_ops->flush (nxdata, flags, err);
+  if (r == 0) {
+    gettimeofday (&end, NULL);
+    usecs = tvdiff_usec(&start, &end);
+
+    ACQUIRE_LOCK_FOR_CURRENT_SCOPE (&lock);
+    flush_ops++;
+    flush_usecs += usecs;
+  }
+
+  return r;
+}
+
 /* Zero. */
 static int
 stats_zero (struct nbdkit_next_ops *next_ops, void *nxdata,
@@ -343,6 +371,7 @@ static struct nbdkit_filter filter = {
   .pread             = stats_pread,
   .pwrite            = stats_pwrite,
   .trim              = stats_trim,
+  .flush             = stats_flush,
   .zero              = stats_zero,
   .extents           = stats_extents,
   .cache             = stats_cache,
-- 
2.21.0





More information about the Libguestfs mailing list