perf record: Throttle user defined frequencies to the maximum allowed
tip-bot for Arnaldo Carvalho de Melo
merge botCommit-ID: b09c2364a4dc2a67e640c2b839d936302815693f Gitweb: https://git.kernel.org/tip/b09c2364a4dc2a67e640c2b839d936302815693f Author: Arnaldo Carvalho de Melo <[email protected]> AuthorDate: Thu, 1 Mar 2018 14:52:50 -0300 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 5 Mar 2018 09:58:44 -0300
perf record: Throttle user defined frequencies to the maximum allowed
# perf record -F 200000 sleep 1
warning: Maximum frequency rate (15,000 Hz) exceeded, throttling from 200,000 Hz to 15,000 Hz.
The limit can be raised via /proc/sys/kernel/perf_event_max_sample_rate.
The kernel will lower it when perf's interrupts take too long.
Use --strict-freq to disable this throttling, refusing to record.
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.019 MB perf.data (15 samples) ]
# perf evlist -v
cycles:ppp: size: 112, { sample_period, sample_freq }: 15000, sample_type: IP|TID|TIME|PERIOD, disabled: 1, inherit: 1, mmap: 1, comm: 1, freq: 1, enable_on_exec: 1, task: 1, precise_ip: 3, sample_id_all: 1, exclude_guest: 1, mmap2: 1, comm_exec: 1For those wanting that it fails if the desired frequency can't be used:
# perf record --strict-freq -F 200000 sleep 1
error: Maximum frequency rate (15,000 Hz) exceeded.
Please use -F freq option with a lower value or consider
tweaking /proc/sys/kernel/perf_event_max_sample_rate.
#Suggested-by Ingo Molnar <[email protected]>
Cc Adrian Hunter <[email protected]>
Cc David Ahern <[email protected]>
Cc Jiri Olsa <[email protected]>
Cc Namhyung Kim <[email protected]>
Cc Wang Nan <[email protected]>
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>
--- tools/perf/Documentation/perf-record.txt | 7 ++++++- tools/perf/builtin-record.c | 2 ++ tools/perf/perf.h | 1 + tools/perf/util/record.c | 20 +++++++++++++++----- 4 files changed, 24 insertions(+), 6 deletions(-)
tools/perf/Documentation/perf-record.txt +6 -1
@@ -191,11 +191,16 @@ OPTIONS -i:: --no-inherit:: Child tasks do not inherit counters. + -F:: --freq=:: Profile at this frequency. Use 'max' to use the currently maximum allowed frequency, i.e. the value in the kernel.perf_event_max_sample_rate - sysctl. + sysctl. Will throttle down to the currently maximum allowed frequency. + See --strict-freq. + +--strict-freq:: + Fail if the specified frequency can't be used. -m:: --mmap-pages=::
tools/perf/builtin-record.c +2 -0
@@ -1543,6 +1543,8 @@ static struct option __record_options[] = {OPT_BOOLEAN (0 ,"tail-synthesize" , &record.opts.tail_synthesize,"synthesize non-sample events at the end of output" ),OPT_BOOLEAN (0 ,"overwrite" , &record.opts.overwrite,"use overwrite mode" ), +OPT_BOOLEAN (0 ,"strict-freq" , &record.opts.strict_freq, +"Fail if the specified frequency can't be used" ),OPT_CALLBACK ('F' ,"freq" , &record.opts,"freq or 'max'" ,"profile at this frequency" , record__parse_freq),
tools/perf/perf.h +1 -0
@@ -61,6 +61,7 @@ struct record_opts {bool tail_synthesize;bool overwrite;bool ignore_missing_thread; +bool strict_freq;unsigned int freq;unsigned int mmap_pages;unsigned int auxtrace_mmap_pages;
tools/perf/util/record.c +15 -5
@@ -216,11 +216,21 @@ static int record_opts__config_freq(struct record_opts *opts)* User specified frequency is over current maximum. */ if (user_freq && (max_rate < opts->freq)) { -pr_err ("Maximum frequency rate (%u) reached.\n" -"Please use -F freq option with lower value or consider\n" -"tweaking /proc/sys/kernel/perf_event_max_sample_rate.\n" , - max_rate); -return -1 ; +if (opts->strict_freq) { +pr_err ("error: Maximum frequency rate (%'u Hz) exceeded.\n" +" Please use -F freq option with a lower value or consider\n" +" tweaking /proc/sys/kernel/perf_event_max_sample_rate.\n" , + max_rate); +return -1 ; + }else { +pr_warning ("warning: Maximum frequency rate (%'u Hz) exceeded, throttling from %'u Hz to %'u Hz.\n" +" The limit can be raised via /proc/sys/kernel/perf_event_max_sample_rate.\n" +" The kernel will lower it when perf's interrupts take too long.\n" +" Use --strict-freq to disable this throttling, refusing to record.\n" , + max_rate, opts->freq, max_rate); + + opts->freq = max_rate; + } }/*