[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20200916063129.1061487-1-namhyung@kernel.org>
Date: Wed, 16 Sep 2020 15:31:25 +0900
From: Namhyung Kim <namhyung@...nel.org>
To: Arnaldo Carvalho de Melo <acme@...nel.org>,
Jiri Olsa <jolsa@...hat.com>
Cc: Ingo Molnar <mingo@...nel.org>,
Peter Zijlstra <a.p.zijlstra@...llo.nl>,
Mark Rutland <mark.rutland@....com>,
Alexander Shishkin <alexander.shishkin@...ux.intel.com>,
Stephane Eranian <eranian@...gle.com>,
LKML <linux-kernel@...r.kernel.org>,
Andi Kleen <ak@...ux.intel.com>,
Ian Rogers <irogers@...gle.com>
Subject: [PATCHSET v2 0/4] perf stat: Expand events for each cgroup
Hello,
When we profile cgroup events with perf stat, it's very annoying to
specify events and cgroups on the command line as it requires the
mapping between events and cgroups. (Note that perf record can use
cgroup sampling but it's not usable for perf stat).
I guess most cases we just want to use a same set of events (N) for
all cgroups (M), but we need to specify NxM events and NxM cgroups.
This is not good especially when profiling large number of cgroups:
say M=200.
So I added --for-each-cgroup option to make it easy for that case. It
will create NxM events from N events and M cgroups. One more upside
is that it can handle metrics too.
For example, the following example measures IPC metric for 3 cgroups
$ cat perf-expand-cgrp.sh
#!/bin/sh
METRIC=${1:-IPC}
CGROUP_DIR=/sys/fs/cgroup/perf_event
sudo mkdir $CGROUP_DIR/A $CGROUP_DIR/B $CGROUP_DIR/C
# add backgroupd workload for each cgroup
echo $$ | sudo tee $CGROUP_DIR/A/cgroup.procs > /dev/null
yes > /dev/null &
echo $$ | sudo tee $CGROUP_DIR/B/cgroup.procs > /dev/null
yes > /dev/null &
echo $$ | sudo tee $CGROUP_DIR/C/cgroup.procs > /dev/null
yes > /dev/null &
# run 'perf stat' in the root cgroup
echo $$ | sudo tee $CGROUP_DIR/cgroup.procs > /dev/null
perf stat -a -M $METRIC --for-each-cgroup A,B,C sleep 1
kill %1 %2 %3
sudo rmdir $CGROUP_DIR/A $CGROUP_DIR/B $CGROUP_DIR/C
$ ./perf-expand-cgrp.sh IPC
Performance counter stats for 'system wide':
11,284,850,010 inst_retired.any A # 2.71 IPC
4,157,915,982 cpu_clk_unhalted.thread A
11,342,188,640 inst_retired.any B # 2.72 IPC
4,173,014,732 cpu_clk_unhalted.thread B
11,135,863,604 inst_retired.any C # 2.67 IPC
4,171,375,184 cpu_clk_unhalted.thread C
1.011948803 seconds time elapsed
* Changes from v1:
- rename the option to --for-each-cgroup (Jiri)
- copy evsel fields explicitly (Jiri)
- add libpfm4 test (Ian)
The code is available at 'perf/cgroup-multiply-v2' branch on
git://git.kernel.org/pub/scm/linux/kernel/git/namhyung/linux-perf.git
Thanks
Namhyung
Namhyung Kim (4):
perf evsel: Add evsel__clone() function
perf stat: Add --for-each-cgroup option
perf tools: Copy metric events properly when expand cgroups
perf test: Add expand cgroup event test
tools/perf/builtin-stat.c | 21 ++-
tools/perf/tests/Build | 1 +
tools/perf/tests/builtin-test.c | 4 +
tools/perf/tests/expand-cgroup.c | 241 +++++++++++++++++++++++++++++++
tools/perf/tests/tests.h | 1 +
tools/perf/util/cgroup.c | 107 +++++++++++++-
tools/perf/util/cgroup.h | 3 +
tools/perf/util/evlist.c | 11 ++
tools/perf/util/evlist.h | 1 +
tools/perf/util/evsel.c | 85 +++++++++++
tools/perf/util/evsel.h | 1 +
tools/perf/util/metricgroup.c | 77 ++++++++++
tools/perf/util/metricgroup.h | 6 +
tools/perf/util/stat.h | 1 +
14 files changed, 554 insertions(+), 6 deletions(-)
create mode 100644 tools/perf/tests/expand-cgroup.c
--
2.28.0.618.gf4bc123cb7-goog
Powered by blists - more mailing lists