Commit 3e76ac78b08479e84a3eca3fb1b3066fb8230461

Authored by Andrew Vagin
Committed by Arnaldo Carvalho de Melo
1 parent 124ba94033

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>

Showing 3 changed files with 5 additions and 0 deletions Side-by-side Diff

tools/perf/builtin-record.c
... ... @@ -700,6 +700,7 @@
700 700 OPT_BOOLEAN('d', "data", &record.opts.sample_address,
701 701 "Sample addresses"),
702 702 OPT_BOOLEAN('T', "timestamp", &record.opts.sample_time, "Sample timestamps"),
  703 + OPT_BOOLEAN('P', "period", &record.opts.period, "Sample period"),
703 704 OPT_BOOLEAN('n', "no-samples", &record.opts.no_samples,
704 705 "don't sample"),
705 706 OPT_BOOLEAN('N', "no-buildid-cache", &record.no_buildid_cache,
... ... @@ -200,6 +200,7 @@
200 200 bool sample_time;
201 201 bool sample_id_all_avail;
202 202 bool system_wide;
  203 + bool period;
203 204 unsigned int freq;
204 205 unsigned int mmap_pages;
205 206 unsigned int user_freq;
tools/perf/util/evsel.c
... ... @@ -108,6 +108,9 @@
108 108 if (opts->system_wide)
109 109 attr->sample_type |= PERF_SAMPLE_CPU;
110 110  
  111 + if (opts->period)
  112 + attr->sample_type |= PERF_SAMPLE_PERIOD;
  113 +
111 114 if (opts->sample_id_all_avail &&
112 115 (opts->sample_time || opts->system_wide ||
113 116 !opts->no_inherit || opts->cpu_list))