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: 1

For 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 <mingo@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Wang Nan <wangnan0@huawei.com>
Link: https://lkml.kernel.org/n/tip-oyebruc44nlja499nqkr1nzn@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Arnaldo Carvalho de Melo 2018-03-01 14:52:50 -03:00
parent 7831bf2365
commit b09c2364a4
4 changed files with 24 additions and 6 deletions

View File

@ -191,11 +191,16 @@ OPTIONS
-i:: -i::
--no-inherit:: --no-inherit::
Child tasks do not inherit counters. Child tasks do not inherit counters.
-F:: -F::
--freq=:: --freq=::
Profile at this frequency. Use 'max' to use the currently maximum 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 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:: -m::
--mmap-pages=:: --mmap-pages=::

View File

@ -1543,6 +1543,8 @@ static struct option __record_options[] = {
OPT_BOOLEAN(0, "tail-synthesize", &record.opts.tail_synthesize, OPT_BOOLEAN(0, "tail-synthesize", &record.opts.tail_synthesize,
"synthesize non-sample events at the end of output"), "synthesize non-sample events at the end of output"),
OPT_BOOLEAN(0, "overwrite", &record.opts.overwrite, "use overwrite mode"), 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'", OPT_CALLBACK('F', "freq", &record.opts, "freq or 'max'",
"profile at this frequency", "profile at this frequency",
record__parse_freq), record__parse_freq),

View File

@ -61,6 +61,7 @@ struct record_opts {
bool tail_synthesize; bool tail_synthesize;
bool overwrite; bool overwrite;
bool ignore_missing_thread; bool ignore_missing_thread;
bool strict_freq;
unsigned int freq; unsigned int freq;
unsigned int mmap_pages; unsigned int mmap_pages;
unsigned int auxtrace_mmap_pages; unsigned int auxtrace_mmap_pages;

View File

@ -216,11 +216,21 @@ static int record_opts__config_freq(struct record_opts *opts)
* User specified frequency is over current maximum. * User specified frequency is over current maximum.
*/ */
if (user_freq && (max_rate < opts->freq)) { if (user_freq && (max_rate < opts->freq)) {
pr_err("Maximum frequency rate (%u) reached.\n" if (opts->strict_freq) {
"Please use -F freq option with lower value or consider\n" pr_err("error: Maximum frequency rate (%'u Hz) exceeded.\n"
"tweaking /proc/sys/kernel/perf_event_max_sample_rate.\n", " Please use -F freq option with a lower value or consider\n"
max_rate); " tweaking /proc/sys/kernel/perf_event_max_sample_rate.\n",
return -1; 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;
}
} }
/* /*