diff options
author | Namhyung Kim <namhyung@kernel.org> | 2016-12-22 01:03:50 -0500 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2016-12-27 19:47:57 -0500 |
commit | 9396c9cb0d9534ca67bda8a34b2413a2ca1c67e9 (patch) | |
tree | 1df5b1dead770526f9fe1f95cedc7681068d65ab /tools/perf/builtin-sched.c | |
parent | 3705b97505bcbf6440f38119c0e7d6058f585b54 (diff) |
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>
Diffstat (limited to 'tools/perf/builtin-sched.c')
-rw-r--r-- | tools/perf/builtin-sched.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c index d53e706a6f17..5b134b0d1ff3 100644 --- a/tools/perf/builtin-sched.c +++ b/tools/perf/builtin-sched.c | |||
@@ -209,6 +209,7 @@ struct perf_sched { | |||
209 | u64 skipped_samples; | 209 | u64 skipped_samples; |
210 | const char *time_str; | 210 | const char *time_str; |
211 | struct perf_time_interval ptime; | 211 | struct perf_time_interval ptime; |
212 | struct perf_time_interval hist_time; | ||
212 | }; | 213 | }; |
213 | 214 | ||
214 | /* per thread run time data */ | 215 | /* per thread run time data */ |
@@ -2460,6 +2461,11 @@ static int timehist_sched_change_event(struct perf_tool *tool, | |||
2460 | timehist_print_sample(sched, sample, &al, thread, t); | 2461 | timehist_print_sample(sched, sample, &al, thread, t); |
2461 | 2462 | ||
2462 | out: | 2463 | out: |
2464 | if (sched->hist_time.start == 0 && t >= ptime->start) | ||
2465 | sched->hist_time.start = t; | ||
2466 | if (ptime->end == 0 || t <= ptime->end) | ||
2467 | sched->hist_time.end = t; | ||
2468 | |||
2463 | if (tr) { | 2469 | if (tr) { |
2464 | /* time of this sched_switch event becomes last time task seen */ | 2470 | /* time of this sched_switch event becomes last time task seen */ |
2465 | tr->last_time = sample->time; | 2471 | tr->last_time = sample->time; |
@@ -2624,6 +2630,7 @@ static void timehist_print_summary(struct perf_sched *sched, | |||
2624 | struct thread *t; | 2630 | struct thread *t; |
2625 | struct thread_runtime *r; | 2631 | struct thread_runtime *r; |
2626 | int i; | 2632 | int i; |
2633 | u64 hist_time = sched->hist_time.end - sched->hist_time.start; | ||
2627 | 2634 | ||
2628 | memset(&totals, 0, sizeof(totals)); | 2635 | memset(&totals, 0, sizeof(totals)); |
2629 | 2636 | ||
@@ -2665,7 +2672,7 @@ static void timehist_print_summary(struct perf_sched *sched, | |||
2665 | totals.sched_count += r->run_stats.n; | 2672 | totals.sched_count += r->run_stats.n; |
2666 | printf(" CPU %2d idle for ", i); | 2673 | printf(" CPU %2d idle for ", i); |
2667 | print_sched_time(r->total_run_time, 6); | 2674 | print_sched_time(r->total_run_time, 6); |
2668 | printf(" msec\n"); | 2675 | printf(" msec (%6.2f%%)\n", 100.0 * r->total_run_time / hist_time); |
2669 | } else | 2676 | } else |
2670 | printf(" CPU %2d idle entire time window\n", i); | 2677 | printf(" CPU %2d idle entire time window\n", i); |
2671 | } | 2678 | } |
@@ -2701,12 +2708,16 @@ static void timehist_print_summary(struct perf_sched *sched, | |||
2701 | 2708 | ||
2702 | printf("\n" | 2709 | printf("\n" |
2703 | " Total number of unique tasks: %" PRIu64 "\n" | 2710 | " Total number of unique tasks: %" PRIu64 "\n" |
2704 | "Total number of context switches: %" PRIu64 "\n" | 2711 | "Total number of context switches: %" PRIu64 "\n", |
2705 | " Total run time (msec): ", | ||
2706 | totals.task_count, totals.sched_count); | 2712 | totals.task_count, totals.sched_count); |
2707 | 2713 | ||
2714 | printf(" Total run time (msec): "); | ||
2708 | print_sched_time(totals.total_run_time, 2); | 2715 | print_sched_time(totals.total_run_time, 2); |
2709 | printf("\n"); | 2716 | printf("\n"); |
2717 | |||
2718 | printf(" Total scheduling time (msec): "); | ||
2719 | print_sched_time(hist_time, 2); | ||
2720 | printf(" (x %d)\n", sched->max_cpu); | ||
2710 | } | 2721 | } |
2711 | 2722 | ||
2712 | typedef int (*sched_handler)(struct perf_tool *tool, | 2723 | typedef int (*sched_handler)(struct perf_tool *tool, |