aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorAndrew Vagin <avagin@openvz.org>2011-12-20 09:32:45 -0500
committerArnaldo Carvalho de Melo <acme@redhat.com>2011-12-20 09:50:09 -0500
commit3e76ac78b08479e84a3eca3fb1b3066fb8230461 (patch)
tree974a1ca64ec49605232f2d4800e6b8b23c0837c7 /tools
parent124ba9403318d834ef21bcd899c22c870708d2c4 (diff)
perf record: Add ability to record event period
The problem is that when SAMPLE_PERIOD is not set, the kernel generates a number of samples in proportion to an event's period. Number of these samples may be too big and the kernel throttles all samples above a defined limit. E.g.: I want to trace when a process sleeps. I created a process which sleeps for 1ms and for 4ms. perf got 100 events in both cases. swapper 0 [000] 1141.371830: sched_stat_sleep: comm=foo pid=1801 delay=1386750 [ns] swapper 0 [000] 1141.369444: sched_stat_sleep: comm=foo pid=1801 delay=4499585 [ns] In the first case a kernel want to send 4499585 events and in the second case it wants to send 1386750 events. perf-reports shows that process sleeps in both places equal time. Instead of this we can get only one sample with an attribute period. As result we have less data transferring between kernel and user-space and we avoid throttling of samples. The patch "events: Don't divide events if it has field period" added a kernel part of this functionality. Acked-by: Arun Sharma <asharma@fb.com> Cc: Arun Sharma <asharma@fb.com> Cc: David Ahern <dsahern@gmail.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: devel@openvz.org Link: http://lkml.kernel.org/r/1324391565-1369947-1-git-send-email-avagin@openvz.org Signed-off-by: Andrew Vagin <avagin@openvz.org> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools')
-rw-r--r--tools/perf/builtin-record.c1
-rw-r--r--tools/perf/perf.h1
-rw-r--r--tools/perf/util/evsel.c3
3 files changed, 5 insertions, 0 deletions
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 766fa0a91a32..f8fd14fb62ec 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -700,6 +700,7 @@ const struct option record_options[] = {
700 OPT_BOOLEAN('d', "data", &record.opts.sample_address, 700 OPT_BOOLEAN('d', "data", &record.opts.sample_address,
701 "Sample addresses"), 701 "Sample addresses"),
702 OPT_BOOLEAN('T', "timestamp", &record.opts.sample_time, "Sample timestamps"), 702 OPT_BOOLEAN('T', "timestamp", &record.opts.sample_time, "Sample timestamps"),
703 OPT_BOOLEAN('P', "period", &record.opts.period, "Sample period"),
703 OPT_BOOLEAN('n', "no-samples", &record.opts.no_samples, 704 OPT_BOOLEAN('n', "no-samples", &record.opts.no_samples,
704 "don't sample"), 705 "don't sample"),
705 OPT_BOOLEAN('N', "no-buildid-cache", &record.no_buildid_cache, 706 OPT_BOOLEAN('N', "no-buildid-cache", &record.no_buildid_cache,
diff --git a/tools/perf/perf.h b/tools/perf/perf.h
index ea804f5a8cc2..64f8bee31ced 100644
--- a/tools/perf/perf.h
+++ b/tools/perf/perf.h
@@ -200,6 +200,7 @@ struct perf_record_opts {
200 bool sample_time; 200 bool sample_time;
201 bool sample_id_all_avail; 201 bool sample_id_all_avail;
202 bool system_wide; 202 bool system_wide;
203 bool period;
203 unsigned int freq; 204 unsigned int freq;
204 unsigned int mmap_pages; 205 unsigned int mmap_pages;
205 unsigned int user_freq; 206 unsigned int user_freq;
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 4a8c8b02e9cc..60ad0286759e 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -108,6 +108,9 @@ void perf_evsel__config(struct perf_evsel *evsel, struct perf_record_opts *opts)
108 if (opts->system_wide) 108 if (opts->system_wide)
109 attr->sample_type |= PERF_SAMPLE_CPU; 109 attr->sample_type |= PERF_SAMPLE_CPU;
110 110
111 if (opts->period)
112 attr->sample_type |= PERF_SAMPLE_PERIOD;
113
111 if (opts->sample_id_all_avail && 114 if (opts->sample_id_all_avail &&
112 (opts->sample_time || opts->system_wide || 115 (opts->sample_time || opts->system_wide ||
113 !opts->no_inherit || opts->cpu_list)) 116 !opts->no_inherit || opts->cpu_list))