linux-perf-users.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 00/18] Switch the default perf stat metrics to json
@ 2025-11-06 23:14 Ian Rogers
  2025-11-06 23:14 ` [PATCH v2 01/18] perf metricgroup: Add care to picking the evsel for displaying a metric Ian Rogers
                   ` (18 more replies)
  0 siblings, 19 replies; 21+ messages in thread
From: Ian Rogers @ 2025-11-06 23:14 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Namhyung Kim, Alexander Shishkin, Jiri Olsa, Ian Rogers,
	Adrian Hunter, James Clark, Xu Yang, Chun-Tse Shao,
	Thomas Richter, Sumanth Korikkar, Collin Funk, Thomas Falcon,
	Howard Chu, Dapeng Mi, Levi Yun, Yang Li, linux-kernel,
	linux-perf-users, Andi Kleen, Weilin Wang

Prior to this series stat-shadow would produce hard coded metrics if
certain events appeared in the evlist. This series produces equivalent
json metrics and cleans up the consequences in tests and display
output. A before and after of the default display output on a
tigerlake is:

Before:
```
$ perf stat -a sleep 1

 Performance counter stats for 'system wide':

    16,041,816,418      cpu-clock                        #   15.995 CPUs utilized             
             5,749      context-switches                 #  358.376 /sec                      
               121      cpu-migrations                   #    7.543 /sec                      
             1,806      page-faults                      #  112.581 /sec                      
       825,965,204      instructions                     #    0.70  insn per cycle            
     1,180,799,101      cycles                           #    0.074 GHz                       
       168,945,109      branches                         #   10.532 M/sec                     
         4,629,567      branch-misses                    #    2.74% of all branches           
 #     30.2 %  tma_backend_bound      
                                                  #      7.8 %  tma_bad_speculation    
                                                  #     47.1 %  tma_frontend_bound     
 #     14.9 %  tma_retiring           
```

After:
```
$ perf stat -a sleep 1

 Performance counter stats for 'system wide':

             2,890      context-switches                 #    179.9 cs/sec  cs_per_second     
    16,061,923,339      cpu-clock                        #     16.0 CPUs  CPUs_utilized       
                43      cpu-migrations                   #      2.7 migrations/sec  migrations_per_second
             5,645      page-faults                      #    351.5 faults/sec  page_faults_per_second
         5,708,413      branch-misses                    #      1.4 %  branch_miss_rate         (88.83%)
       429,978,120      branches                         #     26.8 K/sec  branch_frequency     (88.85%)
     1,626,915,897      cpu-cycles                       #      0.1 GHz  cycles_frequency       (88.84%)
     2,556,805,534      instructions                     #      1.5 instructions  insn_per_cycle  (88.86%)
                        TopdownL1                 #     20.1 %  tma_backend_bound      
                                                  #     40.5 %  tma_bad_speculation      (88.90%)
                                                  #     17.2 %  tma_frontend_bound       (78.05%)
                                                  #     22.2 %  tma_retiring             (88.89%)

       1.002994394 seconds time elapsed
```

Having the metrics in json brings greater uniformity, allows events to
be shared by metrics, and it also allows descriptions like:
```
$ perf list cs_per_second
...
  cs_per_second
       [Context switches per CPU second]
```

A thorn in the side of doing this work was that the hard coded metrics
were used by perf script with '-F metric'. This functionality didn't
work for me (I was testing `perf record -e instructions,cycles`
with/without leader sampling and then `perf script -F metric` but saw
nothing but empty lines) but anyway I decided to fix it to the best of
my ability in this series. So the script side counters were removed
and the regular ones associated with the evsel used. The json metrics
were all searched looking for ones that have a subset of events
matching those in the perf script session, and all metrics are
printed. This is kind of weird as the counters are being set by the
period of samples, but I carried the behavior forward. I suspect there
needs to be follow up work to make this better, but what is in the
series is superior to what is currently in the tree. Follow up work
could include finding metrics for the machine in the perf.data rather
than using the host, allowing multiple metrics even if the metric ids
of the events differ, fixing pre-existing `perf stat record/report`
issues, etc.

There is a lot of stat tests that, for example, assume '-e
instructions,cycles' will produce an IPC metric. These things needed
tidying as now the metric must be explicitly asked for and when doing
this ones using software events were preferred to increase
compatibility. As the test updates were numerous they are distinct to
the patches updating the functionality causing periods in the series
where not all tests are passing. If this is undesirable the test fixes
can be squashed into the functionality updates, but this will be kind
of messy, especially as at some points in the series both the old
metrics and the new metrics will be displayed.

v2: Drop merged patches, add json to document target_cpu/core_wide and
    example to "Add care to picking the evsel for displaying a metric"
    commit message (Namhyung).

v1: https://lore.kernel.org/lkml/20251024175857.808401-1-irogers@google.com/

Ian Rogers (18):
  perf metricgroup: Add care to picking the evsel for displaying a
    metric
  perf expr: Add #target_cpu literal
  perf jevents: Add set of common metrics based on default ones
  perf jevents: Add metric DefaultShowEvents
  perf stat: Add detail -d,-dd,-ddd metrics
  perf script: Change metric format to use json metrics
  perf stat: Remove hard coded shadow metrics
  perf stat: Fix default metricgroup display on hybrid
  perf stat: Sort default events/metrics
  perf stat: Remove "unit" workarounds for metric-only
  perf test stat+json: Improve metric-only testing
  perf test stat: Ignore failures in Default[234] metricgroups
  perf test stat: Update std_output testing metric expectations
  perf test metrics: Update all metrics for possibly failing default
    metrics
  perf test stat: Update shadow test to use metrics
  perf test stat: Update test expectations and events
  perf test stat csv: Update test expectations and events
  perf tool_pmu: Make core_wide and target_cpu json events

 tools/perf/builtin-script.c                   | 238 ++++++++++-
 tools/perf/builtin-stat.c                     | 154 ++-----
 .../arch/common/common/metrics.json           | 151 +++++++
 .../pmu-events/arch/common/common/tool.json   |  12 +
 tools/perf/pmu-events/empty-pmu-events.c      | 229 ++++++----
 tools/perf/pmu-events/jevents.py              |  28 +-
 tools/perf/pmu-events/pmu-events.h            |   2 +
 .../tests/shell/lib/perf_json_output_lint.py  |   4 +-
 tools/perf/tests/shell/lib/stat_output.sh     |   2 +-
 tools/perf/tests/shell/stat+csv_output.sh     |   2 +-
 tools/perf/tests/shell/stat+json_output.sh    |   2 +-
 tools/perf/tests/shell/stat+shadow_stat.sh    |   4 +-
 tools/perf/tests/shell/stat+std_output.sh     |   4 +-
 tools/perf/tests/shell/stat.sh                |   6 +-
 .../perf/tests/shell/stat_all_metricgroups.sh |   3 +
 tools/perf/tests/shell/stat_all_metrics.sh    |   7 +-
 tools/perf/util/evsel.h                       |   1 +
 tools/perf/util/expr.c                        |   8 +-
 tools/perf/util/metricgroup.c                 |  92 +++-
 tools/perf/util/stat-display.c                |  55 +--
 tools/perf/util/stat-shadow.c                 | 404 +-----------------
 tools/perf/util/stat.h                        |   2 +-
 tools/perf/util/tool_pmu.c                    |  24 +-
 tools/perf/util/tool_pmu.h                    |   9 +-
 24 files changed, 756 insertions(+), 687 deletions(-)
 create mode 100644 tools/perf/pmu-events/arch/common/common/metrics.json

-- 
2.51.2.1041.gc1ab5b90ca-goog


^ permalink raw reply	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2025-11-11  3:46 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-11-06 23:14 [PATCH v2 00/18] Switch the default perf stat metrics to json Ian Rogers
2025-11-06 23:14 ` [PATCH v2 01/18] perf metricgroup: Add care to picking the evsel for displaying a metric Ian Rogers
2025-11-06 23:14 ` [PATCH v2 02/18] perf expr: Add #target_cpu literal Ian Rogers
2025-11-06 23:14 ` [PATCH v2 03/18] perf jevents: Add set of common metrics based on default ones Ian Rogers
2025-11-06 23:14 ` [PATCH v2 04/18] perf jevents: Add metric DefaultShowEvents Ian Rogers
2025-11-06 23:14 ` [PATCH v2 05/18] perf stat: Add detail -d,-dd,-ddd metrics Ian Rogers
2025-11-06 23:14 ` [PATCH v2 06/18] perf script: Change metric format to use json metrics Ian Rogers
2025-11-06 23:14 ` [PATCH v2 07/18] perf stat: Remove hard coded shadow metrics Ian Rogers
2025-11-06 23:14 ` [PATCH v2 08/18] perf stat: Fix default metricgroup display on hybrid Ian Rogers
2025-11-06 23:14 ` [PATCH v2 09/18] perf stat: Sort default events/metrics Ian Rogers
2025-11-06 23:15 ` [PATCH v2 10/18] perf stat: Remove "unit" workarounds for metric-only Ian Rogers
2025-11-06 23:15 ` [PATCH v2 11/18] perf test stat+json: Improve metric-only testing Ian Rogers
2025-11-06 23:15 ` [PATCH v2 12/18] perf test stat: Ignore failures in Default[234] metricgroups Ian Rogers
2025-11-06 23:15 ` [PATCH v2 13/18] perf test stat: Update std_output testing metric expectations Ian Rogers
2025-11-06 23:15 ` [PATCH v2 14/18] perf test metrics: Update all metrics for possibly failing default metrics Ian Rogers
2025-11-06 23:15 ` [PATCH v2 15/18] perf test stat: Update shadow test to use metrics Ian Rogers
2025-11-06 23:15 ` [PATCH v2 16/18] perf test stat: Update test expectations and events Ian Rogers
2025-11-06 23:15 ` [PATCH v2 17/18] perf test stat csv: " Ian Rogers
2025-11-06 23:15 ` [PATCH v2 18/18] perf tool_pmu: Make core_wide and target_cpu json events Ian Rogers
2025-11-10  8:38 ` [PATCH v2 00/18] Switch the default perf stat metrics to json Mi, Dapeng
2025-11-11  3:46   ` Ian Rogers

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).