From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Ingo Molnar <mingo@kernel.org>, Thomas Gleixner <tglx@linutronix.de>
Cc: Jiri Olsa <jolsa@kernel.org>, Namhyung Kim <namhyung@kernel.org>,
Clark Williams <williams@redhat.com>,
linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org,
Ian Rogers <irogers@google.com>, Jiri Olsa <jolsa@redhat.com>,
Arnaldo Carvalho de Melo <acme@redhat.com>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Andrey Zhizhikin <andrey.z@gmail.com>,
Kan Liang <kan.liang@linux.intel.com>,
Kefeng Wang <wangkefeng.wang@huawei.com>,
Mark Rutland <mark.rutland@arm.com>,
Peter Zijlstra <peterz@infradead.org>,
Petr Mladek <pmladek@suse.com>,
Stephane Eranian <eranian@google.com>
Subject: [PATCH 19/26] perf bench: Add event synthesis benchmark
Date: Mon, 13 Apr 2020 13:51:56 -0300 [thread overview]
Message-ID: <20200413165203.1816-20-acme@kernel.org> (raw)
In-Reply-To: <20200413165203.1816-1-acme@kernel.org>
From: Ian Rogers <irogers@google.com>
Event synthesis may occur at the start or end (tail) of a perf command.
In system-wide mode it can scan every process in /proc, which may add
seconds of latency before event recording. Add a new benchmark that
times how long event synthesis takes with and without data synthesis.
An example execution looks like:
$ perf bench internals synthesize
# Running 'internals/synthesize' benchmark:
Average synthesis took: 168.253800 usec
Average data synthesis took: 208.104700 usec
Signed-off-by: Ian Rogers <irogers@google.com>
Acked-by: Jiri Olsa <jolsa@redhat.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andrey Zhizhikin <andrey.z@gmail.com>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Kefeng Wang <wangkefeng.wang@huawei.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Petr Mladek <pmladek@suse.com>
Cc: Stephane Eranian <eranian@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lore.kernel.org/lkml/20200402154357.107873-2-irogers@google.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/Documentation/perf-bench.txt | 8 ++
tools/perf/bench/Build | 2 +-
tools/perf/bench/bench.h | 2 +-
tools/perf/bench/synthesize.c | 101 ++++++++++++++++++++++++
tools/perf/builtin-bench.c | 6 ++
5 files changed, 117 insertions(+), 2 deletions(-)
create mode 100644 tools/perf/bench/synthesize.c
diff --git a/tools/perf/Documentation/perf-bench.txt b/tools/perf/Documentation/perf-bench.txt
index 0921a3c67381..bad16512c48d 100644
--- a/tools/perf/Documentation/perf-bench.txt
+++ b/tools/perf/Documentation/perf-bench.txt
@@ -61,6 +61,9 @@ SUBSYSTEM
'epoll'::
Eventpoll (epoll) stressing benchmarks.
+'internals'::
+ Benchmark internal perf functionality.
+
'all'::
All benchmark subsystems.
@@ -214,6 +217,11 @@ Suite for evaluating concurrent epoll_wait calls.
*ctl*::
Suite for evaluating multiple epoll_ctl calls.
+SUITES FOR 'internals'
+~~~~~~~~~~~~~~~~~~~~~~
+*synthesize*::
+Suite for evaluating perf's event synthesis performance.
+
SEE ALSO
--------
linkperf:perf[1]
diff --git a/tools/perf/bench/Build b/tools/perf/bench/Build
index e4e321b6f883..042827385c87 100644
--- a/tools/perf/bench/Build
+++ b/tools/perf/bench/Build
@@ -6,9 +6,9 @@ perf-y += futex-wake.o
perf-y += futex-wake-parallel.o
perf-y += futex-requeue.o
perf-y += futex-lock-pi.o
-
perf-y += epoll-wait.o
perf-y += epoll-ctl.o
+perf-y += synthesize.o
perf-$(CONFIG_X86_64) += mem-memcpy-x86-64-lib.o
perf-$(CONFIG_X86_64) += mem-memcpy-x86-64-asm.o
diff --git a/tools/perf/bench/bench.h b/tools/perf/bench/bench.h
index 4aa6de1aa67d..4d669c803237 100644
--- a/tools/perf/bench/bench.h
+++ b/tools/perf/bench/bench.h
@@ -41,9 +41,9 @@ int bench_futex_wake_parallel(int argc, const char **argv);
int bench_futex_requeue(int argc, const char **argv);
/* pi futexes */
int bench_futex_lock_pi(int argc, const char **argv);
-
int bench_epoll_wait(int argc, const char **argv);
int bench_epoll_ctl(int argc, const char **argv);
+int bench_synthesize(int argc, const char **argv);
#define BENCH_FORMAT_DEFAULT_STR "default"
#define BENCH_FORMAT_DEFAULT 0
diff --git a/tools/perf/bench/synthesize.c b/tools/perf/bench/synthesize.c
new file mode 100644
index 000000000000..6291257bc9c9
--- /dev/null
+++ b/tools/perf/bench/synthesize.c
@@ -0,0 +1,101 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Benchmark synthesis of perf events such as at the start of a 'perf
+ * record'. Synthesis is done on the current process and the 'dummy' event
+ * handlers are invoked that support dump_trace but otherwise do nothing.
+ *
+ * Copyright 2019 Google LLC.
+ */
+#include <stdio.h>
+#include "bench.h"
+#include "../util/debug.h"
+#include "../util/session.h"
+#include "../util/synthetic-events.h"
+#include "../util/target.h"
+#include "../util/thread_map.h"
+#include "../util/tool.h"
+#include <linux/err.h>
+#include <linux/time64.h>
+#include <subcmd/parse-options.h>
+
+static unsigned int iterations = 10000;
+
+static const struct option options[] = {
+ OPT_UINTEGER('i', "iterations", &iterations,
+ "Number of iterations used to compute average"),
+ OPT_END()
+};
+
+static const char *const usage[] = {
+ "perf bench internals synthesize <options>",
+ NULL
+};
+
+
+static int do_synthesize(struct perf_session *session,
+ struct perf_thread_map *threads,
+ struct target *target, bool data_mmap)
+{
+ const unsigned int nr_threads_synthesize = 1;
+ struct timeval start, end, diff;
+ u64 runtime_us;
+ unsigned int i;
+ double average;
+ int err;
+
+ gettimeofday(&start, NULL);
+ for (i = 0; i < iterations; i++) {
+ err = machine__synthesize_threads(&session->machines.host,
+ target, threads, data_mmap,
+ nr_threads_synthesize);
+ if (err)
+ return err;
+ }
+
+ gettimeofday(&end, NULL);
+ timersub(&end, &start, &diff);
+ runtime_us = diff.tv_sec * USEC_PER_SEC + diff.tv_usec;
+ average = (double)runtime_us/(double)iterations;
+ printf("Average %ssynthesis took: %f usec\n",
+ data_mmap ? "data " : "", average);
+ return 0;
+}
+
+int bench_synthesize(int argc, const char **argv)
+{
+ struct perf_tool tool;
+ struct perf_session *session;
+ struct target target = {
+ .pid = "self",
+ };
+ struct perf_thread_map *threads;
+ int err;
+
+ argc = parse_options(argc, argv, options, usage, 0);
+
+ session = perf_session__new(NULL, false, NULL);
+ if (IS_ERR(session)) {
+ pr_err("Session creation failed.\n");
+ return PTR_ERR(session);
+ }
+ threads = thread_map__new_by_pid(getpid());
+ if (!threads) {
+ pr_err("Thread map creation failed.\n");
+ err = -ENOMEM;
+ goto err_out;
+ }
+ perf_tool__fill_defaults(&tool);
+
+ err = do_synthesize(session, threads, &target, false);
+ if (err)
+ goto err_out;
+
+ err = do_synthesize(session, threads, &target, true);
+
+err_out:
+ if (threads)
+ perf_thread_map__put(threads);
+
+ perf_session__delete(session);
+ return err;
+}
diff --git a/tools/perf/builtin-bench.c b/tools/perf/builtin-bench.c
index c06fe21c8613..11c79a8d85d6 100644
--- a/tools/perf/builtin-bench.c
+++ b/tools/perf/builtin-bench.c
@@ -76,6 +76,11 @@ static struct bench epoll_benchmarks[] = {
};
#endif // HAVE_EVENTFD
+static struct bench internals_benchmarks[] = {
+ { "synthesize", "Benchmark perf event synthesis", bench_synthesize },
+ { NULL, NULL, NULL }
+};
+
struct collection {
const char *name;
const char *summary;
@@ -92,6 +97,7 @@ static struct collection collections[] = {
#ifdef HAVE_EVENTFD
{"epoll", "Epoll stressing benchmarks", epoll_benchmarks },
#endif
+ { "internals", "Perf-internals benchmarks", internals_benchmarks },
{ "all", "All benchmarks", NULL },
{ NULL, NULL, NULL }
};
--
2.21.1
next prev parent reply other threads:[~2020-04-13 16:51 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-13 16:51 [GIT PULL] perf/core fixes and improvements Arnaldo Carvalho de Melo
2020-04-13 16:51 ` [PATCH 01/26] perf tools: Synthesize bpf_trampoline/dispatcher ksymbol event Arnaldo Carvalho de Melo
2020-04-13 16:51 ` [PATCH 02/26] perf machine: Set ksymbol dso as loaded on arrival Arnaldo Carvalho de Melo
2020-04-13 16:51 ` [PATCH 03/26] perf annotate: Add basic support for bpf_image Arnaldo Carvalho de Melo
2020-04-13 16:51 ` [PATCH 04/26] tools arch x86: Sync the msr-index.h copy with the kernel sources Arnaldo Carvalho de Melo
2020-04-13 16:51 ` [PATCH 05/26] capabilities: Introduce CAP_PERFMON to kernel and user space Arnaldo Carvalho de Melo
2020-04-13 16:51 ` [Intel-gfx] " Arnaldo Carvalho de Melo
2020-04-13 16:51 ` Arnaldo Carvalho de Melo
2020-04-13 16:51 ` [PATCH 06/26] perf/core: Open access to the core for CAP_PERFMON privileged process Arnaldo Carvalho de Melo
2020-04-13 16:51 ` [Intel-gfx] " Arnaldo Carvalho de Melo
2020-04-13 16:51 ` [PATCH 07/26] perf/core: open access to probes " Arnaldo Carvalho de Melo
2020-04-13 16:51 ` [Intel-gfx] " Arnaldo Carvalho de Melo
2020-04-13 16:51 ` [PATCH 08/26] perf tools: Support CAP_PERFMON capability Arnaldo Carvalho de Melo
2020-04-13 16:51 ` [Intel-gfx] " Arnaldo Carvalho de Melo
2020-04-13 16:51 ` [PATCH 09/26] drm/i915/perf: Open access for CAP_PERFMON privileged process Arnaldo Carvalho de Melo
2020-04-13 16:51 ` [Intel-gfx] " Arnaldo Carvalho de Melo
2020-04-13 16:51 ` Arnaldo Carvalho de Melo
2020-04-13 16:51 ` [PATCH 10/26] trace/bpf_trace: " Arnaldo Carvalho de Melo
2020-04-13 16:51 ` [Intel-gfx] " Arnaldo Carvalho de Melo
2020-04-13 16:51 ` [PATCH 11/26] powerpc/perf: open " Arnaldo Carvalho de Melo
2020-04-13 16:51 ` [Intel-gfx] " Arnaldo Carvalho de Melo
2020-04-13 16:51 ` Arnaldo Carvalho de Melo
2020-04-13 16:51 ` [PATCH 12/26] parisc/perf: " Arnaldo Carvalho de Melo
2020-04-13 16:51 ` [Intel-gfx] " Arnaldo Carvalho de Melo
2020-04-13 16:51 ` [PATCH 13/26] drivers/perf: Open " Arnaldo Carvalho de Melo
2020-04-13 16:51 ` [Intel-gfx] " Arnaldo Carvalho de Melo
2020-04-13 16:51 ` Arnaldo Carvalho de Melo
2020-04-13 16:51 ` [PATCH 14/26] drivers/oprofile: " Arnaldo Carvalho de Melo
2020-04-13 16:51 ` [Intel-gfx] " Arnaldo Carvalho de Melo
2020-04-13 16:51 ` [PATCH 15/26] doc/admin-guide: Update perf-security.rst with CAP_PERFMON information Arnaldo Carvalho de Melo
2020-04-13 16:51 ` [Intel-gfx] " Arnaldo Carvalho de Melo
2020-04-13 16:51 ` [PATCH 16/26] doc/admin-guide: update kernel.rst " Arnaldo Carvalho de Melo
2020-04-13 16:51 ` [Intel-gfx] " Arnaldo Carvalho de Melo
2020-04-13 16:51 ` [PATCH 17/26] perf python: Check if clang supports -fno-semantic-interposition Arnaldo Carvalho de Melo
2020-04-13 16:51 ` Arnaldo Carvalho de Melo
2020-04-13 16:51 ` [PATCH 18/26] perf script: Simplify auxiliary event printing functions Arnaldo Carvalho de Melo
2020-04-13 16:51 ` Arnaldo Carvalho de Melo [this message]
2020-04-13 16:51 ` [PATCH 20/26] tools api fs: Make xxx__mountpoint() more scalable Arnaldo Carvalho de Melo
2020-04-13 16:51 ` [PATCH 21/26] perf synthetic-events: save 4kb from 2 stack frames Arnaldo Carvalho de Melo
2020-04-13 16:51 ` [PATCH 22/26] perf stat: Fix no metric header if --per-socket and --metric-only set Arnaldo Carvalho de Melo
2020-04-13 16:52 ` [PATCH 23/26] perf expr: Add expr_ prefix for parse_ctx and parse_id Arnaldo Carvalho de Melo
2020-04-13 16:52 ` Arnaldo Carvalho de Melo
2020-04-13 16:52 ` Arnaldo Carvalho de Melo
2020-04-13 16:52 ` [PATCH 24/26] perf expr: Add expr_scanner_ctx object Arnaldo Carvalho de Melo
2020-04-13 16:52 ` Arnaldo Carvalho de Melo
2020-04-13 16:52 ` Arnaldo Carvalho de Melo
2020-04-13 16:52 ` [PATCH 25/26] perf metrictroup: Split the metricgroup__add_metric function Arnaldo Carvalho de Melo
2020-04-13 16:52 ` Arnaldo Carvalho de Melo
2020-04-13 16:52 ` Arnaldo Carvalho de Melo
2020-04-13 16:52 ` [PATCH 26/26] perf script: Add flamegraph.py script Arnaldo Carvalho de Melo
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=20200413165203.1816-20-acme@kernel.org \
--to=acme@kernel.org \
--cc=acme@redhat.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=andrey.z@gmail.com \
--cc=eranian@google.com \
--cc=irogers@google.com \
--cc=jolsa@kernel.org \
--cc=jolsa@redhat.com \
--cc=kan.liang@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=mingo@kernel.org \
--cc=namhyung@kernel.org \
--cc=peterz@infradead.org \
--cc=pmladek@suse.com \
--cc=tglx@linutronix.de \
--cc=wangkefeng.wang@huawei.com \
--cc=williams@redhat.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.