Re: [PATCH v2 0/7] Share events between metrics

From: kajoljain
Date: Fri May 22 2020 - 05:26:32 EST




On 5/20/20 11:50 PM, Ian Rogers wrote:
> Metric groups contain metrics. Metrics create groups of events to
> ideally be scheduled together. Often metrics refer to the same events,
> for example, a cache hit and cache miss rate. Using separate event
> groups means these metrics are multiplexed at different times and the
> counts don't sum to 100%. More multiplexing also decreases the
> accuracy of the measurement.
>
> This change orders metrics from groups or the command line, so that
> the ones with the most events are set up first. Later metrics see if
> groups already provide their events, and reuse them if
> possible. Unnecessary events and groups are eliminated.
>
> The option --metric-no-group is added so that metrics aren't placed in
> groups. This affects multiplexing and may increase sharing.
>
> The option --metric-mo-merge is added and with this option the
> existing grouping behavior is preserved.
>
> Using skylakex metrics I ran the following shell code to count the
> number of events for each metric group (this ignores metric groups
> with a single metric, and one of the duplicated TopdownL1 and
> TopDownL1 groups):
>
> for i in all Branches BrMispredicts Cache_Misses FLOPS Instruction_Type Memory_BW Pipeline Power SMT Summary TopdownL1 TopdownL1_SMT
> do
> echo Metric group: $i
> echo -n " - No merging (old default, now --metric-no-merge): "
> /tmp/perf/perf stat -a --metric-no-merge -M $i sleep 1 2>&1 | grep -v "^ *#" | egrep " +[0-9,.]+ [^s]" | wc -l
> echo -n " - Merging over metrics (new default) : "
> /tmp/perf/perf stat -a -M $i sleep 1 2>&1 | grep -v "^ *#" | egrep " +[0-9,.]+ [^s]"|wc -l
> echo -n " - No event groups and merging (--metric-no-group): "
> /tmp/perf/perf stat -a --metric-no-group -M $i sleep 1 2>&1 | grep -v "^ *#" | egrep " +[0-9,.]+ [^s]"|wc -l
> done
>
> Metric group: all
> - No merging (old default, now --metric-no-merge): 193
> - Merging over metrics (new default) : 142
> - No event groups and merging (--metric-no-group): 84
> Metric group: Branches
> - No merging (old default, now --metric-no-merge): 8
> - Merging over metrics (new default) : 8
> - No event groups and merging (--metric-no-group): 4
> Metric group: BrMispredicts
> - No merging (old default, now --metric-no-merge): 11
> - Merging over metrics (new default) : 11
> - No event groups and merging (--metric-no-group): 10
> Metric group: Cache_Misses
> - No merging (old default, now --metric-no-merge): 11
> - Merging over metrics (new default) : 9
> - No event groups and merging (--metric-no-group): 6
> Metric group: FLOPS
> - No merging (old default, now --metric-no-merge): 18
> - Merging over metrics (new default) : 10
> - No event groups and merging (--metric-no-group): 10
> Metric group: Instruction_Type
> - No merging (old default, now --metric-no-merge): 6
> - Merging over metrics (new default) : 6
> - No event groups and merging (--metric-no-group): 4
> Metric group: Pipeline
> - No merging (old default, now --metric-no-merge): 6
> - Merging over metrics (new default) : 6
> - No event groups and merging (--metric-no-group): 5
> Metric group: Power
> - No merging (old default, now --metric-no-merge): 16
> - Merging over metrics (new default) : 16
> - No event groups and merging (--metric-no-group): 10
> Metric group: SMT
> - No merging (old default, now --metric-no-merge): 11
> - Merging over metrics (new default) : 8
> - No event groups and merging (--metric-no-group): 7
> Metric group: Summary
> - No merging (old default, now --metric-no-merge): 19
> - Merging over metrics (new default) : 17
> - No event groups and merging (--metric-no-group): 17
> Metric group: TopdownL1
> - No merging (old default, now --metric-no-merge): 16
> - Merging over metrics (new default) : 7
> - No event groups and merging (--metric-no-group): 7
> Metric group: TopdownL1_SMT
> - No merging (old default, now --metric-no-merge): 24
> - Merging over metrics (new default) : 7
> - No event groups and merging (--metric-no-group): 7
>
> There are 5 out of 12 metric groups where no events are shared, such
> as Power, however, disabling grouping of events always reduces the
> number of events.
>
> The result for Memory_BW needs explanation:
>
> Metric group: Memory_BW
> - No merging (old default, now --metric-no-merge): 9
> - Merging over metrics (new default) : 5
> - No event groups and merging (--metric-no-group): 11
>
> Both with and without merging the groups fail to be set up and so the
> event counts here are for broken metrics. The --metric-no-group number
> is accurate as all the events are scheduled. Ideally a constraint
> would be added for these metrics in the json code to avoid grouping.
>
> v2. rebases on kernel/git/acme/linux.git branch tmp.perf/core, fixes a
> missing comma with metric lists (reported-by Jiri Olsa
> <jolsa@xxxxxxxxxx>) and adds early returns to metricgroup__add_metric
> (suggested-by Jiri Olsa).
>
> v1. was prepared on kernel/git/acme/linux.git branch tmp.perf/core
>
> Compared to RFC v3: fix a bug where unnecessary commas were passed to
> parse-events and were echoed. Fix a bug where the same event could be
> matched more than once with --metric-no-group, causing there to be
> events missing.
> https://lore.kernel.org/lkml/20200508053629.210324-1-irogers@xxxxxxxxxx/
>
> Ian Rogers (7):
> perf metricgroup: Always place duration_time last
> perf metricgroup: Use early return in add_metric
> perf metricgroup: Delay events string creation
> perf metricgroup: Order event groups by size
> perf metricgroup: Remove duped metric group events
> perf metricgroup: Add options to not group or merge
> perf metricgroup: Remove unnecessary ',' from events
>

Reviewd-By: Kajol Jain <kjain@xxxxxxxxxxxxx>
Tested-By: Kajol Jain <kjain@xxxxxxxxxxxxx> ( Tested it to see behavior with some metric groups in both x86 and Power machine)

Thanks,
Kajol Jain

> tools/perf/Documentation/perf-stat.txt | 19 ++
> tools/perf/builtin-stat.c | 11 +-
> tools/perf/util/metricgroup.c | 239 ++++++++++++++++++-------
> tools/perf/util/metricgroup.h | 6 +-
> tools/perf/util/stat.h | 2 +
> 5 files changed, 207 insertions(+), 70 deletions(-)
>