aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Ahern <dsa@cumulusnetworks.com>2016-11-29 12:15:43 -0500
committerArnaldo Carvalho de Melo <acme@redhat.com>2016-12-01 11:02:45 -0500
commita91f4c473fa1655a2a5f1ceba46f76a95eef35bb (patch)
treeb4600475102d836393f1aab2938de908f450805f
parentc284d669a20d408b70ce0dc9b2d995971f5fe0c7 (diff)
perf script: Add option to specify time window of interest
Add option to allow user to control analysis window. e.g., collect data for some amount of time and analyze a segment of interest within that window. Committer notes: Testing it: # perf evlist -v cycles:ppp: size: 112, { sample_period, sample_freq }: 4000, sample_type: IP|TID|TIME|CALLCHAIN|CPU|PERIOD, disabled: 1, inherit: 1, mmap: 1, comm: 1, freq: 1, task: 1, precise_ip: 3, sample_id_all: 1, exclude_guest: 1, mmap2: 1, comm_exec: 1 # # perf script --hide-call-graph | head -15 swapper 0 [0] 9693.370039: 1 cycles:ppp: ffffffffb90072ad x86_pmu_enable (.../4.8.8-300.fc25.x86_64/vmlinux) swapper 0 [0] 9693.370044: 1 cycles:ppp: ffffffffb900ca1b intel_pmu_handle_irq (.../4.8.8-300.fc25.x86_64/vmlinux) swapper 0 [0] 9693.370046: 7 cycles:ppp: ffffffffb902fd93 native_sched_clock (.../4.8.8-300.fc25.x86_64/vmlinux) swapper 0 [0] 9693.370048: 126 cycles:ppp: ffffffffb902fd93 native_sched_clock (.../4.8.8-300.fc25.x86_64/vmlinux) swapper 0 [0] 9693.370049: 2701 cycles:ppp: ffffffffb902fd93 native_sched_clock (.../4.8.8-300.fc25.x86_64/vmlinux) swapper 0 [0] 9693.370051: 58823 cycles:ppp: ffffffffb90cd2e0 idle_cpu (.../4.8.8-300.fc25.x86_64/vmlinux) swapper 0 [1] 9693.370059: 1 cycles:ppp: ffffffffb91a713a ctx_resched (.../4.8.8-300.fc25.x86_64/vmlinux) swapper 0 [1] 9693.370062: 1 cycles:ppp: ffffffffb900ca1b intel_pmu_handle_irq (.../4.8.8-300.fc25.x86_64/vmlinux) swapper 0 [1] 9693.370064: 13 cycles:ppp: ffffffffb902fd93 native_sched_clock (.../4.8.8-300.fc25.x86_64/vmlinux) swapper 0 [1] 9693.370065: 250 cycles:ppp: ffffffffb902fd93 native_sched_clock (.../4.8.8-300.fc25.x86_64/vmlinux) swapper 0 [1] 9693.370067: 5269 cycles:ppp: ffffffffb902fe79 sched_clock (.../4.8.8-300.fc25.x86_64/vmlinux) swapper 0 [1] 9693.370069: 114602 cycles:ppp: ffffffffb90c1c5a atomic_notifier_call_chain (.../4.8.8-300.fc25.x86_64/vmlinux) perf 5124 [2] 9693.370076: 1 cycles:ppp: ffffffffb91a76c1 __perf_event_enable (.../4.8.8-300.fc25.x86_64/vmlinux) perf 5124 [2] 9693.370091: 1 cycles:ppp: ffffffffb900ca1b intel_pmu_handle_irq (.../4.8.8-300.fc25.x86_64/vmlinux) perf 5124 [2] 9693.370095: 3 cycles:ppp: ffffffffb902fd93 native_sched_clock (.../4.8.8-300.fc25.x86_64/vmlinux) # # perf script --hide-call-graph --time ,9693.370048 swapper 0 [0] 9693.370039: 1 cycles:ppp: ffffffffb90072ad x86_pmu_enable (.../4.8.8-300.fc25.x86_64/vmlinux) swapper 0 [0] 9693.370044: 1 cycles:ppp: ffffffffb900ca1b intel_pmu_handle_irq (.../4.8.8-300.fc25.x86_64/vmlinux) swapper 0 [0] 9693.370046: 7 cycles:ppp: ffffffffb902fd93 native_sched_clock (.../4.8.8-300.fc25.x86_64/vmlinux) # perf script --hide-call-graph --time 9693.370064,9693.370076 swapper 0 [1] 9693.370064: 13 cycles:ppp: ffffffffb902fd93 native_sched_clock (.../4.8.8-300.fc25.x86_64/vmlinux) swapper 0 [1] 9693.370065: 250 cycles:ppp: ffffffffb902fd93 native_sched_clock (.../4.8.8-300.fc25.x86_64/vmlinux) swapper 0 [1] 9693.370067: 5269 cycles:ppp: ffffffffb902fe79 sched_clock (.../4.8.8-300.fc25.x86_64/vmlinux) swapper 0 [1] 9693.370069: 114602 cycles:ppp: ffffffffb90c1c5a atomic_notifier_call_chain (.../4.8.8-300.fc25.x86_64/vmlinux) # Signed-off-by: David Ahern <dsahern@gmail.com> Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> Acked-by: Namhyung Kim <namhyung@kernel.org> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Link: http://lkml.kernel.org/r/1480439746-42695-4-git-send-email-dsahern@gmail.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rw-r--r--tools/perf/Documentation/perf-script.txt7
-rw-r--r--tools/perf/builtin-script.c15
2 files changed, 21 insertions, 1 deletions
diff --git a/tools/perf/Documentation/perf-script.txt b/tools/perf/Documentation/perf-script.txt
index 0f6ee09f7256..5dc5c6a09ac4 100644
--- a/tools/perf/Documentation/perf-script.txt
+++ b/tools/perf/Documentation/perf-script.txt
@@ -292,6 +292,13 @@ include::itrace.txt[]
292--force:: 292--force::
293 Don't do ownership validation. 293 Don't do ownership validation.
294 294
295--time::
296 Only analyze samples within given time window: <start>,<stop>. Times
297 have the format seconds.microseconds. If start is not given (i.e., time
298 string is ',x.y') then analysis starts at the beginning of the file. If
299 stop time is not given (i.e, time string is 'x.y,') then analysis goes
300 to end of file.
301
295SEE ALSO 302SEE ALSO
296-------- 303--------
297linkperf:perf-record[1], linkperf:perf-script-perl[1], 304linkperf:perf-record[1], linkperf:perf-script-perl[1],
diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
index 066b4bf73780..2f3ff69fc4e7 100644
--- a/tools/perf/builtin-script.c
+++ b/tools/perf/builtin-script.c
@@ -22,6 +22,7 @@
22#include "util/thread_map.h" 22#include "util/thread_map.h"
23#include "util/stat.h" 23#include "util/stat.h"
24#include "util/thread-stack.h" 24#include "util/thread-stack.h"
25#include "util/time-utils.h"
25#include <linux/bitmap.h> 26#include <linux/bitmap.h>
26#include <linux/stringify.h> 27#include <linux/stringify.h>
27#include <linux/time64.h> 28#include <linux/time64.h>
@@ -833,6 +834,8 @@ struct perf_script {
833 struct cpu_map *cpus; 834 struct cpu_map *cpus;
834 struct thread_map *threads; 835 struct thread_map *threads;
835 int name_width; 836 int name_width;
837 const char *time_str;
838 struct perf_time_interval ptime;
836}; 839};
837 840
838static int perf_evlist__max_name_len(struct perf_evlist *evlist) 841static int perf_evlist__max_name_len(struct perf_evlist *evlist)
@@ -1014,6 +1017,9 @@ static int process_sample_event(struct perf_tool *tool,
1014 struct perf_script *scr = container_of(tool, struct perf_script, tool); 1017 struct perf_script *scr = container_of(tool, struct perf_script, tool);
1015 struct addr_location al; 1018 struct addr_location al;
1016 1019
1020 if (perf_time__skip_sample(&scr->ptime, sample->time))
1021 return 0;
1022
1017 if (debug_mode) { 1023 if (debug_mode) {
1018 if (sample->time < last_timestamp) { 1024 if (sample->time < last_timestamp) {
1019 pr_err("Samples misordered, previous: %" PRIu64 1025 pr_err("Samples misordered, previous: %" PRIu64
@@ -2186,7 +2192,8 @@ int cmd_script(int argc, const char **argv, const char *prefix __maybe_unused)
2186 "Enable symbol demangling"), 2192 "Enable symbol demangling"),
2187 OPT_BOOLEAN(0, "demangle-kernel", &symbol_conf.demangle_kernel, 2193 OPT_BOOLEAN(0, "demangle-kernel", &symbol_conf.demangle_kernel,
2188 "Enable kernel symbol demangling"), 2194 "Enable kernel symbol demangling"),
2189 2195 OPT_STRING(0, "time", &script.time_str, "str",
2196 "Time span of interest (start,stop)"),
2190 OPT_END() 2197 OPT_END()
2191 }; 2198 };
2192 const char * const script_subcommands[] = { "record", "report", NULL }; 2199 const char * const script_subcommands[] = { "record", "report", NULL };
@@ -2465,6 +2472,12 @@ int cmd_script(int argc, const char **argv, const char *prefix __maybe_unused)
2465 if (err < 0) 2472 if (err < 0)
2466 goto out_delete; 2473 goto out_delete;
2467 2474
2475 /* needs to be parsed after looking up reference time */
2476 if (perf_time__parse_str(&script.ptime, script.time_str) != 0) {
2477 pr_err("Invalid time string\n");
2478 return -EINVAL;
2479 }
2480
2468 err = __cmd_script(&script); 2481 err = __cmd_script(&script);
2469 2482
2470 flush_scripting(); 2483 flush_scripting();