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>,
Riccardo Mancini <rickyman7@gmail.com>
Subject: [PATCH v9 10/24] perf record: Introduce data transferred and compressed stats
Date: Fri, 2 Jul 2021 15:32:18 +0300 [thread overview]
Message-ID: <cd94f0a535932ed26a1965ddccde78f213f2f4f8.1625227739.git.alexey.v.bayduraev@linux.intel.com> (raw)
In-Reply-To: <cover.1625227739.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>
Acked-by: Namhyung Kim <namhyung@gmail.com>
Signed-off-by: Alexey Bayduraev <alexey.v.bayduraev@linux.intel.com>
---
tools/perf/builtin-record.c | 68 +++++++++++++++++++++++++++++--------
tools/perf/util/mmap.h | 2 ++
2 files changed, 56 insertions(+), 14 deletions(-)
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 6419b7974435..4d1571234ba2 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -246,8 +246,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,
@@ -381,9 +381,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);
}
@@ -608,8 +612,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++;
@@ -1394,18 +1412,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;
}
@@ -2091,8 +2106,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 record_thread *thread_data = rec->thread_data;
+ u64 bytes_written, bytes_transferred, bytes_compressed;
for (t = 1; t < rec->nr_threads; t++)
record__terminate_thread(&thread_data[t]);
@@ -2100,9 +2117,32 @@ 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",
- thread_data[t].tid, thread_data[t].samples, thread_data[t].waking,
- rec->session->bytes_transferred, rec->session->bytes_compressed);
+ bytes_transferred = 0;
+ bytes_compressed = 0;
+ bytes_written = t ? 0 : rec->bytes_written;
+ 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, ",
+ thread_data[t].tid, thread_data[t].samples, thread_data[t].waking);
+ if (bytes_compressed)
+ pr_debug("trasferred=%ld, compressed=%ld\n",
+ bytes_transferred, bytes_compressed);
+ else
+ pr_debug("written=%ld\n", bytes_written);
}
return 0;
diff --git a/tools/perf/util/mmap.h b/tools/perf/util/mmap.h
index 67d41003d82e..f5e8c8a24e68 100644
--- a/tools/perf/util/mmap.h
+++ b/tools/perf/util/mmap.h
@@ -47,6 +47,8 @@ struct mmap {
struct perf_data_file *file;
struct zstd_data zstd_data;
u64 bytes_written;
+ u64 bytes_transferred;
+ u64 bytes_compressed;
};
struct mmap_params {
--
2.19.0
next prev parent reply other threads:[~2021-07-02 12:33 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-07-02 12:32 [PATCH v9 00/24] Introduce threaded trace streaming for basic perf record operation Alexey Bayduraev
2021-07-02 12:32 ` [PATCH v9 01/24] perf record: Introduce thread affinity and mmap masks Alexey Bayduraev
2021-07-02 12:32 ` [PATCH v9 02/24] tools lib: Introduce fdarray clone function Alexey Bayduraev
2021-07-02 18:15 ` Arnaldo Carvalho de Melo
2021-07-02 12:32 ` [PATCH v9 03/24] perf record: Introduce thread specific data array Alexey Bayduraev
2021-07-02 12:32 ` [PATCH v9 04/24] perf record: Introduce function to propagate control commands Alexey Bayduraev
2021-07-02 12:32 ` [PATCH v9 05/24] perf record: Introduce thread local variable Alexey Bayduraev
2021-07-02 12:32 ` [PATCH v9 06/24] perf record: Stop threads in the end of trace streaming Alexey Bayduraev
2021-07-02 12:32 ` [PATCH v9 07/24] perf record: Start threads in the beginning " Alexey Bayduraev
2021-07-02 12:32 ` [PATCH v9 08/24] perf record: Introduce data file at mmap buffer object Alexey Bayduraev
2021-07-02 12:32 ` [PATCH v9 09/24] perf record: Introduce bytes written stats to support --max-size option Alexey Bayduraev
2021-07-09 5:38 ` Namhyung Kim
2021-07-02 12:32 ` Alexey Bayduraev [this message]
2021-07-02 12:32 ` [PATCH v9 11/24] perf record: Init data file at mmap buffer object Alexey Bayduraev
2021-07-02 12:32 ` [PATCH v9 12/24] perf record: Introduce --threads command line option Alexey Bayduraev
2021-07-02 12:32 ` [PATCH v9 13/24] perf record: Extend " Alexey Bayduraev
2021-07-02 12:32 ` [PATCH v9 14/24] perf record: Implement compatibility checks Alexey Bayduraev
2021-07-02 12:32 ` [PATCH v9 15/24] perf report: Output non-zero offset for decompressed records Alexey Bayduraev
2021-07-02 12:32 ` [PATCH v9 16/24] perf report: Output data file name in raw trace dump Alexey Bayduraev
2021-07-02 12:32 ` [PATCH v9 17/24] perf session: Move reader structure to the top Alexey Bayduraev
2021-07-02 12:32 ` [PATCH v9 18/24] perf session: Introduce reader_state in reader object Alexey Bayduraev
2021-07-02 12:32 ` [PATCH v9 19/24] perf session: Introduce reader objects in session object Alexey Bayduraev
2021-07-02 12:32 ` [PATCH v9 20/24] perf session: Introduce decompressor into trace reader object Alexey Bayduraev
2021-07-02 12:32 ` [PATCH v9 21/24] perf session: Move init into reader__init function Alexey Bayduraev
2021-07-02 12:32 ` [PATCH v9 22/24] perf session: Move map/unmap into reader__mmap function Alexey Bayduraev
2021-07-02 12:32 ` [PATCH v9 23/24] perf session: Load single file for analysis Alexey Bayduraev
2021-07-02 12:32 ` [PATCH v9 24/24] perf session: Load data directory files " Alexey Bayduraev
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=cd94f0a535932ed26a1965ddccde78f213f2f4f8.1625227739.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 \
--cc=rickyman7@gmail.com \
/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).