From: Alexey Bayduraev <alexey.v.bayduraev@linux.intel.com>
To: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>, Namhyung Kim <namhyung@kernel.org>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@redhat.com>,
linux-kernel <linux-kernel@vger.kernel.org>,
Andi Kleen <ak@linux.intel.com>,
Adrian Hunter <adrian.hunter@intel.com>,
Alexander Antonov <alexander.antonov@linux.intel.com>,
Alexei Budankov <abudankov@huawei.com>
Subject: [PATCH v5 07/20] perf record: introduce data transferred and compressed stats
Date: Tue, 4 May 2021 10:04:42 +0300 [thread overview]
Message-ID: <38f10168eac1c188c5f791bf7d05079d60ee6ab5.1619781188.git.alexey.v.bayduraev@linux.intel.com> (raw)
In-Reply-To: <cover.1619781188.git.alexey.v.bayduraev@linux.intel.com>
Introduce bytes_transferred and bytes_compressed stats so they
would capture statistics for the related data buffer transfers.
Acked-by: Andi Kleen <ak@linux.intel.com>
Signed-off-by: Alexey Bayduraev <alexey.v.bayduraev@linux.intel.com>
---
tools/perf/builtin-record.c | 64 +++++++++++++++++++++++++++++--------
tools/perf/util/mmap.h | 3 ++
2 files changed, 54 insertions(+), 13 deletions(-)
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index b0ca61f1d265..75cebec57357 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -198,6 +198,11 @@ static int record__write(struct record *rec, struct mmap *map __maybe_unused,
return -1;
}
+ if (map && map->file) {
+ map->bytes_written += size;
+ return 0;
+ }
+
rec->bytes_written += size;
if (record__output_max_size_exceeded(rec) && !done) {
@@ -215,8 +220,8 @@ static int record__write(struct record *rec, struct mmap *map __maybe_unused,
static int record__aio_enabled(struct record *rec);
static int record__comp_enabled(struct record *rec);
-static size_t zstd_compress(struct perf_session *session, void *dst, size_t dst_size,
- void *src, size_t src_size);
+static size_t zstd_compress(struct zstd_data *data,
+ void *dst, size_t dst_size, void *src, size_t src_size);
#ifdef HAVE_AIO_SUPPORT
static int record__aio_write(struct aiocb *cblock, int trace_fd,
@@ -350,9 +355,13 @@ static int record__aio_pushfn(struct mmap *map, void *to, void *buf, size_t size
*/
if (record__comp_enabled(aio->rec)) {
- size = zstd_compress(aio->rec->session, aio->data + aio->size,
- mmap__mmap_len(map) - aio->size,
+ struct zstd_data *zstd_data = &aio->rec->session->zstd_data;
+
+ aio->rec->session->bytes_transferred += size;
+ size = zstd_compress(zstd_data,
+ aio->data + aio->size, mmap__mmap_len(map) - aio->size,
buf, size);
+ aio->rec->session->bytes_compressed += size;
} else {
memcpy(aio->data + aio->size, buf, size);
}
@@ -577,8 +586,22 @@ static int record__pushfn(struct mmap *map, void *to, void *bf, size_t size)
struct record *rec = to;
if (record__comp_enabled(rec)) {
- size = zstd_compress(rec->session, map->data, mmap__mmap_len(map), bf, size);
+ struct zstd_data *zstd_data = &rec->session->zstd_data;
+
+ if (map->file) {
+ zstd_data = &map->zstd_data;
+ map->bytes_transferred += size;
+ } else {
+ rec->session->bytes_transferred += size;
+ }
+
+ size = zstd_compress(zstd_data, map->data, mmap__mmap_len(map), bf, size);
bf = map->data;
+
+ if (map->file)
+ map->bytes_compressed += size;
+ else
+ rec->session->bytes_compressed += size;
}
thread->samples++;
@@ -1305,18 +1328,15 @@ static size_t process_comp_header(void *record, size_t increment)
return size;
}
-static size_t zstd_compress(struct perf_session *session, void *dst, size_t dst_size,
+static size_t zstd_compress(struct zstd_data *zstd_data, void *dst, size_t dst_size,
void *src, size_t src_size)
{
size_t compressed;
size_t max_record_size = PERF_SAMPLE_MAX_SIZE - sizeof(struct perf_record_compressed) - 1;
- compressed = zstd_compress_stream_to_records(&session->zstd_data, dst, dst_size, src, src_size,
+ compressed = zstd_compress_stream_to_records(zstd_data, dst, dst_size, src, src_size,
max_record_size, process_comp_header);
- session->bytes_transferred += src_size;
- session->bytes_compressed += compressed;
-
return compressed;
}
@@ -1997,8 +2017,10 @@ static int record__start_threads(struct record *rec)
static int record__stop_threads(struct record *rec, unsigned long *waking)
{
- int t;
+ int t, tm;
+ struct mmap *map, *overwrite_map;
struct thread_data *thread_data = rec->thread_data;
+ u64 bytes_written = 0, bytes_transferred = 0, bytes_compressed = 0;
for (t = 1; t < rec->nr_threads; t++)
record__terminate_thread(&thread_data[t]);
@@ -2006,9 +2028,25 @@ static int record__stop_threads(struct record *rec, unsigned long *waking)
for (t = 0; t < rec->nr_threads; t++) {
rec->samples += thread_data[t].samples;
*waking += thread_data[t].waking;
- pr_debug("threads[%d]: samples=%lld, wakes=%ld, trasferred=%ld, compressed=%ld\n",
+ for (tm = 0; tm < thread_data[t].nr_mmaps; tm++) {
+ if (thread_data[t].maps) {
+ map = thread_data[t].maps[tm];
+ bytes_transferred += map->bytes_transferred;
+ bytes_compressed += map->bytes_compressed;
+ bytes_written += map->bytes_written;
+ }
+ if (thread_data[t].overwrite_maps) {
+ overwrite_map = thread_data[t].overwrite_maps[tm];
+ bytes_transferred += overwrite_map->bytes_transferred;
+ bytes_compressed += overwrite_map->bytes_compressed;
+ bytes_written += overwrite_map->bytes_written;
+ }
+ }
+ rec->session->bytes_transferred += bytes_transferred;
+ rec->session->bytes_compressed += bytes_compressed;
+ pr_debug("threads[%d]: samples=%lld, wakes=%ld, trasferred=%ld, compressed=%ld, written=%ld\n",
thread_data[t].tid, thread_data[t].samples, thread_data[t].waking,
- rec->session->bytes_transferred, rec->session->bytes_compressed);
+ bytes_transferred, bytes_compressed, bytes_written);
}
return 0;
diff --git a/tools/perf/util/mmap.h b/tools/perf/util/mmap.h
index c4aed6e89549..c04ca4b5adf5 100644
--- a/tools/perf/util/mmap.h
+++ b/tools/perf/util/mmap.h
@@ -46,6 +46,9 @@ struct mmap {
int comp_level;
struct perf_data_file *file;
struct zstd_data zstd_data;
+ u64 bytes_transferred;
+ u64 bytes_compressed;
+ u64 bytes_written;
};
struct mmap_params {
--
2.19.0
next prev parent reply other threads:[~2021-05-04 7:05 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-05-04 7:04 [PATCH v5 00/20] Introduce threaded trace streaming for basic perf record operation Alexey Bayduraev
2021-05-04 7:04 ` [PATCH v5 01/20] perf record: introduce thread affinity and mmap masks Alexey Bayduraev
2021-05-04 7:04 ` [PATCH v5 02/20] perf record: introduce thread specific data array Alexey Bayduraev
2021-05-04 7:04 ` [PATCH v5 03/20] perf record: introduce thread local variable Alexey Bayduraev
2021-05-04 7:04 ` [PATCH v5 04/20] perf record: stop threads in the end of trace streaming Alexey Bayduraev
2021-05-04 7:04 ` [PATCH v5 05/20] perf record: start threads in the beginning " Alexey Bayduraev
2021-05-04 7:04 ` [PATCH v5 06/20] perf record: introduce data file at mmap buffer object Alexey Bayduraev
2021-05-04 7:04 ` Alexey Bayduraev [this message]
2021-05-04 7:04 ` [PATCH v5 08/20] perf record: init " Alexey Bayduraev
2021-05-04 7:04 ` [PATCH v5 09/20] tools lib: introduce bitmap_intersects() operation Alexey Bayduraev
2021-05-04 7:04 ` [PATCH v5 10/20] perf record: introduce --threads=<spec> command line option Alexey Bayduraev
2021-05-21 6:50 ` Namhyung Kim
2021-05-04 7:04 ` [PATCH v5 11/20] perf record: document parallel data streaming mode Alexey Bayduraev
2021-05-04 7:04 ` [PATCH v5 12/20] perf report: output data file name in raw trace dump Alexey Bayduraev
2021-05-04 7:04 ` [PATCH v5 13/20] perf session: move reader structure to the top Alexey Bayduraev
2021-05-04 7:04 ` [PATCH v5 14/20] perf session: introduce reader_state in reader object Alexey Bayduraev
2021-05-04 7:04 ` [PATCH v5 15/20] perf session: introduce reader objects in session object Alexey Bayduraev
2021-05-04 7:04 ` [PATCH v5 16/20] perf session: introduce decompressor into trace reader object Alexey Bayduraev
2021-05-04 7:04 ` [PATCH v5 17/20] perf session: move init into reader__init function Alexey Bayduraev
2021-05-04 7:04 ` [PATCH v5 18/20] perf session: move map/unmap into reader__mmap function Alexey Bayduraev
2021-05-04 7:04 ` [PATCH v5 19/20] perf session: load single file for analysis Alexey Bayduraev
2021-05-04 7:04 ` [PATCH v5 20/20] perf session: load data directory files " Alexey Bayduraev
2021-05-06 6:20 ` [PATCH v5 00/20] Introduce threaded trace streaming for basic perf record operation Namhyung Kim
2021-05-06 12:43 ` Bayduraev, Alexey V
2021-05-07 4:47 ` Namhyung Kim
2021-05-06 14:17 ` Andi Kleen
2021-05-07 4:52 ` Namhyung Kim
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=38f10168eac1c188c5f791bf7d05079d60ee6ab5.1619781188.git.alexey.v.bayduraev@linux.intel.com \
--to=alexey.v.bayduraev@linux.intel.com \
--cc=abudankov@huawei.com \
--cc=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=ak@linux.intel.com \
--cc=alexander.antonov@linux.intel.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=jolsa@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=peterz@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).