Nir Soffer
2019-Dec-03 22:28 UTC
[Libguestfs] [PATCH nbdkit] 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 | 36 +++++++++++++++++++++------ 2 files changed, 34 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..e10307c 100644 --- a/filters/stats/stats.c +++ b/filters/stats/stats.c @@ -71,18 +71,40 @@ 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.; + char buf[32]; + + if (bytes < KiB) + snprintf (buf, sizeof(buf), "%" PRIu64 " bytes", bytes); + else if (bytes < MiB) + snprintf (buf, sizeof(buf), "%.2f KiB", bytes / (double)KiB); + else if (bytes < GiB) + snprintf (buf, sizeof(buf), "%.2f MiB", bytes / (double)MiB); + else + snprintf (buf, sizeof(buf), "%.2f GiB", bytes / (double)GiB); + + return strdup(buf); } -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 = humansize (st->bytes / (usecs / 1000000.0)); + + fprintf (fp, "%s: %" PRIu64 " ops, %s, %s/s\n", + st->name, st->ops, size, rate); + + free(size); + free(rate); + } } static inline void -- 2.21.0
Richard W.M. Jones
2019-Dec-04 12:46 UTC
Re: [Libguestfs] [PATCH nbdkit] filters: stats: Show size and rate in human size
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
Nir Soffer
2019-Dec-04 14:59 UTC
Re: [Libguestfs] [PATCH nbdkit] filters: stats: Show size and rate in human size
On Wed, Dec 4, 2019 at 2:46 PM Richard W.M. Jones <rjones@redhat.com> wrote:> > > I fixed a few things including whitespace, dealing with divide by > zero, and allocation failure. How about the attached version?Thanks, looks better.
Apparently Analagous Threads
- [PATCH nbdkit 1/3] filters: stats: Show size in GiB, rate in MiB/s
- [PATCH nbdkit v3 0/5] filters: stats: More useful, more friendly
- [PATCH nbdkit v2 1/3] filters: stats: Add size in GiB, show rate in MiB/s
- [PATCH nbdkit v3 5/5] filters: stats: Show total stats
- Re: [PATCH nbdkit 1/3] filters: stats: Show size in GiB, rate in MiB/s