perf stat: Report summary for interval mode
Currently 'perf stat' supports to print counts at regular interval (-I), but it's not very easy for user to get the overall statistics. The patch uses 'evsel->prev_raw_counts' to get counts for summary. Copy the counts to 'evsel->counts' after printing the interval results. Next, we just follow the non-interval processing. Let's see some examples, root@kbl-ppc:~# perf stat -e cycles -I1000 --interval-count 2 # time counts unit events 1.000412064 2,281,114 cycles 2.001383658 2,547,880 cycles Performance counter stats for 'system wide': 4,828,994 cycles 2.002860349 seconds time elapsed root@kbl-ppc:~# perf stat -e cycles,instructions -I1000 --interval-count 2 # time counts unit events 1.000389902 1,536,093 cycles 1.000389902 420,226 instructions # 0.27 insn per cycle 2.001433453 2,213,952 cycles 2.001433453 735,465 instructions # 0.33 insn per cycle Performance counter stats for 'system wide': 3,750,045 cycles 1,155,691 instructions # 0.31 insn per cycle 2.003023361 seconds time elapsed root@kbl-ppc:~# perf stat -M CPI,IPC -I1000 --interval-count 2 # time counts unit events 1.000435121 905,303 inst_retired.any # 2.9 CPI 1.000435121 2,663,333 cycles 1.000435121 914,702 inst_retired.any # 0.3 IPC 1.000435121 2,676,559 cpu_clk_unhalted.thread 2.001615941 1,951,092 inst_retired.any # 1.8 CPI 2.001615941 3,551,357 cycles 2.001615941 1,950,837 inst_retired.any # 0.5 IPC 2.001615941 3,551,044 cpu_clk_unhalted.thread Performance counter stats for 'system wide': 2,856,395 inst_retired.any # 2.2 CPI 6,214,690 cycles 2,865,539 inst_retired.any # 0.5 IPC 6,227,603 cpu_clk_unhalted.thread 2.003403078 seconds time elapsed Committer testing: Before: # perf stat -e cycles -I1000 --interval-count 2 # time counts unit events 1.000618627 26,877,408 cycles 2.001417968 233,672,829 cycles # After: # perf stat -e cycles -I1000 --interval-count 2 # time counts unit events 1.001531815 5,341,388,792 cycles 2.002936530 100,073,912 cycles Performance counter stats for 'system wide': 5,441,462,704 cycles 2.004893794 seconds time elapsed # Signed-off-by: Jin Yao <yao.jin@linux.intel.com> Reviewed-by: Jiri Olsa <jolsa@redhat.com> Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Andi Kleen <ak@linux.intel.com> Cc: Kan Liang <kan.liang@linux.intel.com> Cc: Peter Zijlstra <peterz@infradead.org> Link: http://lore.kernel.org/lkml/20200520042737.24160-6-yao.jin@linux.intel.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Родитель
905365f493
Коммит
c7e5b328a8
|
@ -314,14 +314,14 @@ static int read_counter_cpu(struct evsel *counter, struct timespec *rs, int cpu)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void read_counters(struct timespec *rs)
|
||||
static int read_affinity_counters(struct timespec *rs)
|
||||
{
|
||||
struct evsel *counter;
|
||||
struct affinity affinity;
|
||||
int i, ncpus, cpu;
|
||||
|
||||
if (affinity__setup(&affinity) < 0)
|
||||
return;
|
||||
return -1;
|
||||
|
||||
ncpus = perf_cpu_map__nr(evsel_list->core.all_cpus);
|
||||
if (!target__has_cpu(&target) || target__has_per_thread(&target))
|
||||
|
@ -341,6 +341,15 @@ static void read_counters(struct timespec *rs)
|
|||
}
|
||||
}
|
||||
affinity__cleanup(&affinity);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void read_counters(struct timespec *rs)
|
||||
{
|
||||
struct evsel *counter;
|
||||
|
||||
if (!stat_config.summary && (read_affinity_counters(rs) < 0))
|
||||
return;
|
||||
|
||||
evlist__for_each_entry(evsel_list, counter) {
|
||||
if (counter->err)
|
||||
|
@ -763,6 +772,20 @@ try_again_reset:
|
|||
if (stat_config.walltime_run_table)
|
||||
stat_config.walltime_run[run_idx] = t1 - t0;
|
||||
|
||||
if (interval) {
|
||||
stat_config.interval = 0;
|
||||
stat_config.summary = true;
|
||||
init_stats(&walltime_nsecs_stats);
|
||||
update_stats(&walltime_nsecs_stats, t1 - t0);
|
||||
|
||||
if (stat_config.aggr_mode == AGGR_GLOBAL)
|
||||
perf_evlist__save_aggr_prev_raw_counts(evsel_list);
|
||||
|
||||
perf_evlist__copy_prev_raw_counts(evsel_list);
|
||||
perf_evlist__reset_prev_raw_counts(evsel_list);
|
||||
runtime_stat_reset(&stat_config);
|
||||
perf_stat__reset_shadow_per_stat(&rt_stat);
|
||||
} else
|
||||
update_stats(&walltime_nsecs_stats, t1 - t0);
|
||||
|
||||
/*
|
||||
|
@ -2159,7 +2182,7 @@ int cmd_stat(int argc, const char **argv)
|
|||
}
|
||||
}
|
||||
|
||||
if (!forever && status != -1 && !interval)
|
||||
if (!forever && status != -1 && (!interval || stat_config.summary))
|
||||
print_counters(NULL, argc, argv);
|
||||
|
||||
if (STAT_RECORD) {
|
||||
|
|
|
@ -408,7 +408,7 @@ int perf_stat_process_counter(struct perf_stat_config *config,
|
|||
* interval mode, otherwise overall avg running
|
||||
* averages will be shown for each interval.
|
||||
*/
|
||||
if (config->interval) {
|
||||
if (config->interval || config->summary) {
|
||||
for (i = 0; i < 3; i++)
|
||||
init_stats(&ps->res_stats[i]);
|
||||
}
|
||||
|
|
|
@ -110,6 +110,7 @@ struct perf_stat_config {
|
|||
bool all_kernel;
|
||||
bool all_user;
|
||||
bool percore_show_thread;
|
||||
bool summary;
|
||||
FILE *output;
|
||||
unsigned int interval;
|
||||
unsigned int timeout;
|
||||
|
|
Загрузка…
Ссылка в новой задаче