perf sched timehist: Show total scheduling time
Show length of analyzed sample time and rate of idle task running. This also takes care of time range given by --time option. $ perf sched timehist -sI | tail Samples do not have callchains. Idle stats: CPU 0 idle for 930.316 msec ( 92.93%) CPU 1 idle for 963.614 msec ( 96.25%) CPU 2 idle for 885.482 msec ( 88.45%) CPU 3 idle for 938.635 msec ( 93.76%) Total number of unique tasks: 118 Total number of context switches: 2337 Total run time (msec): 3718.048 Total scheduling time (msec): 1001.131 (x 4) Suggested-by: David Ahern <dsahern@gmail.com> Signed-off-by: Namhyung Kim <namhyung@kernel.org> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Link: http://lkml.kernel.org/r/20161222060350.17655-3-namhyung@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
3705b97505
commit
9396c9cb0d
|
@ -209,6 +209,7 @@ struct perf_sched {
|
|||
u64 skipped_samples;
|
||||
const char *time_str;
|
||||
struct perf_time_interval ptime;
|
||||
struct perf_time_interval hist_time;
|
||||
};
|
||||
|
||||
/* per thread run time data */
|
||||
|
@ -2460,6 +2461,11 @@ static int timehist_sched_change_event(struct perf_tool *tool,
|
|||
timehist_print_sample(sched, sample, &al, thread, t);
|
||||
|
||||
out:
|
||||
if (sched->hist_time.start == 0 && t >= ptime->start)
|
||||
sched->hist_time.start = t;
|
||||
if (ptime->end == 0 || t <= ptime->end)
|
||||
sched->hist_time.end = t;
|
||||
|
||||
if (tr) {
|
||||
/* time of this sched_switch event becomes last time task seen */
|
||||
tr->last_time = sample->time;
|
||||
|
@ -2624,6 +2630,7 @@ static void timehist_print_summary(struct perf_sched *sched,
|
|||
struct thread *t;
|
||||
struct thread_runtime *r;
|
||||
int i;
|
||||
u64 hist_time = sched->hist_time.end - sched->hist_time.start;
|
||||
|
||||
memset(&totals, 0, sizeof(totals));
|
||||
|
||||
|
@ -2665,7 +2672,7 @@ static void timehist_print_summary(struct perf_sched *sched,
|
|||
totals.sched_count += r->run_stats.n;
|
||||
printf(" CPU %2d idle for ", i);
|
||||
print_sched_time(r->total_run_time, 6);
|
||||
printf(" msec\n");
|
||||
printf(" msec (%6.2f%%)\n", 100.0 * r->total_run_time / hist_time);
|
||||
} else
|
||||
printf(" CPU %2d idle entire time window\n", i);
|
||||
}
|
||||
|
@ -2701,12 +2708,16 @@ static void timehist_print_summary(struct perf_sched *sched,
|
|||
|
||||
printf("\n"
|
||||
" Total number of unique tasks: %" PRIu64 "\n"
|
||||
"Total number of context switches: %" PRIu64 "\n"
|
||||
" Total run time (msec): ",
|
||||
"Total number of context switches: %" PRIu64 "\n",
|
||||
totals.task_count, totals.sched_count);
|
||||
|
||||
printf(" Total run time (msec): ");
|
||||
print_sched_time(totals.total_run_time, 2);
|
||||
printf("\n");
|
||||
|
||||
printf(" Total scheduling time (msec): ");
|
||||
print_sched_time(hist_time, 2);
|
||||
printf(" (x %d)\n", sched->max_cpu);
|
||||
}
|
||||
|
||||
typedef int (*sched_handler)(struct perf_tool *tool,
|
||||
|
|
Loading…
Reference in New Issue