[PATCHSET,00/19] perf stat: Improve perf stat output (v1)

Message ID 20221114230227.1255976-1-namhyung@kernel.org
Headers
Series perf stat: Improve perf stat output (v1) |

Message

Namhyung Kim Nov. 14, 2022, 11:02 p.m. UTC
  Hello,

I'm working on cleanup up the perf stat code.  The main focus this time
is the display logic which has various combinations of options.

I split the code for each output mode - std, csv and json.  And then
organize them according to the purpose like header, prefix, value,
metric and footer.  I hope this would help maintaining the code a bit
more.

Also I found that cgroup support is missing or insufficient.
Specifically when --for-each-cgroup option is given, it'd have multiple
copies of the events for those cgroups.  Then the output should group
the result.  This is true for the normal output mode, but the metric-
only mode didn't support it well.

With this change, I can see the per-cgroup topdown metrics like below:

  $ sudo ./perf stat -a --topdown --for-each-cgroup user.slice,system.slice sleep 3
  nmi_watchdog enabled with topdown. May give wrong results.
  Disable with echo 0 > /proc/sys/kernel/nmi_watchdog

   Performance counter stats for 'system wide':

                                  retiring      bad speculation   frontend bound    backend bound
  S0-D0-C0      2  user.slice            117.3%         3.9%            47.8%           -69.1%
  S0-D0-C1      2  user.slice            119.8%         4.1%            49.3%           -73.2%
  S0-D0-C2      2  user.slice             24.4%         7.9%            68.4%             0.0%
  S0-D0-C3      2  user.slice             24.0%         9.2%            91.2%           -24.4%
  S0-D0-C0      2  system.slice           73.5%         4.0%            19.4%             3.1%
  S0-D0-C1      2  system.slice           90.0%         5.8%            19.7%           -15.5%
  S0-D0-C2      2  system.slice          101.2%         6.6%            33.4%           -41.1%
  S0-D0-C3      2  system.slice           90.7%         4.9%            22.3%           -18.0%

         3.001678216 seconds time elapsed

You can get it from 'perf/stat-display-v1' branch in

  git://git.kernel.org/pub/scm/linux/kernel/git/namhyung/linux-perf.git

Thanks,
Namhyung

Namhyung Kim (19):
  perf stat: Clear screen only if output file is a tty
  perf stat: Split print_running() function
  perf stat: Split print_noise_pct() function
  perf stat: Split print_cgroup() function
  perf stat: Split aggr_printout() function
  perf stat: Factor out print_counter_value() function
  perf stat: Handle bad events in abs_printout()
  perf stat: Add before_metric argument
  perf stat: Align cgroup names
  perf stat: Split print_metric_headers() function
  perf stat: Factor out prepare_interval()
  perf stat: Cleanup interval print alignment
  perf stat: Remove impossible condition
  perf stat: Rework header display
  perf stat: Move condition to print_footer()
  perf stat: Factor out prefix display
  perf stat: Factor out print_metric_{begin,end}()
  perf stat: Support --for-each-cgroup and --metric-only
  perf stat: Add print_aggr_cgroup() for --for-each-cgroup and --topdown

 tools/perf/builtin-stat.c      |   8 +
 tools/perf/util/stat-display.c | 996 ++++++++++++++++++++-------------
 2 files changed, 624 insertions(+), 380 deletions(-)


base-commit: 7565f9617efac0c0c8e2dbd08dbe0695d56684f5
  

Comments

Arnaldo Carvalho de Melo Nov. 15, 2022, 2:04 p.m. UTC | #1
Em Mon, Nov 14, 2022 at 03:02:08PM -0800, Namhyung Kim escreveu:
> Hello,
> 
> I'm working on cleanup up the perf stat code.  The main focus this time
> is the display logic which has various combinations of options.
> 
> I split the code for each output mode - std, csv and json.  And then
> organize them according to the purpose like header, prefix, value,
> metric and footer.  I hope this would help maintaining the code a bit
> more.
> 
> Also I found that cgroup support is missing or insufficient.
> Specifically when --for-each-cgroup option is given, it'd have multiple
> copies of the events for those cgroups.  Then the output should group
> the result.  This is true for the normal output mode, but the metric-
> only mode didn't support it well.
> 
> With this change, I can see the per-cgroup topdown metrics like below:
> 
>   $ sudo ./perf stat -a --topdown --for-each-cgroup user.slice,system.slice sleep 3
>   nmi_watchdog enabled with topdown. May give wrong results.
>   Disable with echo 0 > /proc/sys/kernel/nmi_watchdog
> 
>    Performance counter stats for 'system wide':
> 
>                                   retiring      bad speculation   frontend bound    backend bound
>   S0-D0-C0      2  user.slice            117.3%         3.9%            47.8%           -69.1%
>   S0-D0-C1      2  user.slice            119.8%         4.1%            49.3%           -73.2%
>   S0-D0-C2      2  user.slice             24.4%         7.9%            68.4%             0.0%
>   S0-D0-C3      2  user.slice             24.0%         9.2%            91.2%           -24.4%
>   S0-D0-C0      2  system.slice           73.5%         4.0%            19.4%             3.1%
>   S0-D0-C1      2  system.slice           90.0%         5.8%            19.7%           -15.5%
>   S0-D0-C2      2  system.slice          101.2%         6.6%            33.4%           -41.1%
>   S0-D0-C3      2  system.slice           90.7%         4.9%            22.3%           -18.0%
> 
>          3.001678216 seconds time elapsed
> 
> You can get it from 'perf/stat-display-v1' branch in
> 
>   git://git.kernel.org/pub/scm/linux/kernel/git/namhyung/linux-perf.git

applied locally, build testing.

- Arnaldo
 
> Thanks,
> Namhyung
> 
> Namhyung Kim (19):
>   perf stat: Clear screen only if output file is a tty
>   perf stat: Split print_running() function
>   perf stat: Split print_noise_pct() function
>   perf stat: Split print_cgroup() function
>   perf stat: Split aggr_printout() function
>   perf stat: Factor out print_counter_value() function
>   perf stat: Handle bad events in abs_printout()
>   perf stat: Add before_metric argument
>   perf stat: Align cgroup names
>   perf stat: Split print_metric_headers() function
>   perf stat: Factor out prepare_interval()
>   perf stat: Cleanup interval print alignment
>   perf stat: Remove impossible condition
>   perf stat: Rework header display
>   perf stat: Move condition to print_footer()
>   perf stat: Factor out prefix display
>   perf stat: Factor out print_metric_{begin,end}()
>   perf stat: Support --for-each-cgroup and --metric-only
>   perf stat: Add print_aggr_cgroup() for --for-each-cgroup and --topdown
> 
>  tools/perf/builtin-stat.c      |   8 +
>  tools/perf/util/stat-display.c | 996 ++++++++++++++++++++-------------
>  2 files changed, 624 insertions(+), 380 deletions(-)
> 
> 
> base-commit: 7565f9617efac0c0c8e2dbd08dbe0695d56684f5
> -- 
> 2.38.1.493.g58b659f92b-goog