perf session: Define 'bytes_transferred' and 'bytes_compressed' metrics
authorAlexey Budankov <alexey.budankov@linux.intel.com>
Mon, 18 Mar 2019 17:41:02 +0000 (20:41 +0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 15 May 2019 19:36:49 +0000 (16:36 -0300)
Define 'bytes_transferred' and 'bytes_compressed' metrics to calculate
ratio in the end of the data collection:

compression ratio = bytes_transferred / bytes_compressed

The 'bytes_transferred' metric accumulates the amount of bytes that was
extracted from the mmaped kernel buffers for compression, while
'bytes_compressed' accumulates the amount of bytes that was received
after applying compression.

Signed-off-by: Alexey Budankov <alexey.budankov@linux.intel.com>
Reviewed-by: Jiri Olsa <jolsa@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/1d4bf499-cb03-26dc-6fc6-f14fec7622ce@linux.intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/builtin-record.c
tools/perf/util/env.h
tools/perf/util/session.h

index d2b5a22b7249226295f9085004e540fadab3b1b1..386e665a166f26499932df2142f96207218466ce 100644 (file)
@@ -1186,6 +1186,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
        bool disabled = false, draining = false;
        struct perf_evlist *sb_evlist = NULL;
        int fd;
+       float ratio = 0;
 
        atexit(record__sig_exit);
        signal(SIGCHLD, sig_handler);
@@ -1491,6 +1492,11 @@ out_child:
        record__mmap_read_all(rec, true);
        record__aio_mmap_read_sync(rec);
 
+       if (rec->session->bytes_transferred && rec->session->bytes_compressed) {
+               ratio = (float)rec->session->bytes_transferred/(float)rec->session->bytes_compressed;
+               session->header.env.comp_ratio = ratio + 0.5;
+       }
+
        if (forks) {
                int exit_status;
 
@@ -1537,9 +1543,15 @@ out_child:
                else
                        samples[0] = '\0';
 
-               fprintf(stderr, "[ perf record: Captured and wrote %.3f MB %s%s%s ]\n",
+               fprintf(stderr, "[ perf record: Captured and wrote %.3f MB %s%s%s",
                        perf_data__size(data) / 1024.0 / 1024.0,
                        data->path, postfix, samples);
+               if (ratio) {
+                       fprintf(stderr, ", compressed (original %.3f MB, ratio is %.3f)",
+                                       rec->session->bytes_transferred / 1024.0 / 1024.0,
+                                       ratio);
+               }
+               fprintf(stderr, " ]\n");
        }
 
 out_delete_session:
index 4f8e2b485c01cb9dab58f12942734d076d35208c..34868ca7efd1d59664ad2776747f7b3b904cba77 100644 (file)
@@ -62,6 +62,7 @@ struct perf_env {
        struct cpu_topology_map *cpu;
        struct cpu_cache_level  *caches;
        int                      caches_cnt;
+       u32                     comp_ratio;
        struct numa_node        *numa_nodes;
        struct memory_node      *memory_nodes;
        unsigned long long       memory_bsize;
index d96eccd7d27fe46e4e378721a562f20160f49c22..0e14884f28b21e46aa8a624f4022579490d95424 100644 (file)
@@ -35,6 +35,8 @@ struct perf_session {
        struct ordered_events   ordered_events;
        struct perf_data        *data;
        struct perf_tool        *tool;
+       u64                     bytes_transferred;
+       u64                     bytes_compressed;
 };
 
 struct perf_tool;