性能错误:针对事件(msr / tsc /)的sys_perf_event_open()系统调用返回了22(无效的参数)

时间:2018-11-19 12:41:21

标签: profiling perf tsc msr

我正在使用性能监视特定事件的系统。但是,由于出现在perf列表中,因此出现以下错误,我也不知道它来自何处

sudo性能记录-e msr / tsc / -a

Error:
The sys_perf_event_open() syscall returned with 22 (Invalid argument) for event (msr/tsc/).
/bin/dmesg may provide additional information.
No CONFIG_PERF_EVENTS=y kernel support configured?

如何检查未配置CONFIG_PERF_EVENTS = y内核支持?

**一些测试结果:

sudo dmesg | grep "perf\|pmu"**
[    0.029179] ENERGY_PERF_BIAS: Set to 'normal', was 'performance'
[    0.029179] ENERGY_PERF_BIAS: View and update with x86_energy_perf_policy(8)
[ 9475.406967] perf: interrupt took too long (2509 > 2500), lowering kernel.perf_event_max_sample_rate to 79500
[ 9475.990901] perf: interrupt took too long (3146 > 3136), lowering kernel.perf_event_max_sample_rate to 63500
[ 9476.886941] perf: interrupt took too long (3942 > 3932), lowering kernel.perf_event_max_sample_rate to 50500
[76057.268195] perf: interrupt took too long (4934 > 4927), lowering kernel.perf_event_max_sample_rate to 40500
[167368.007839] perf: interrupt took too long (6171 > 6167), lowering kernel.perf_event_max_sample_rate to 32250
[168338.165608] perf: interrupt took too long (7804 > 7713), lowering kernel.perf_event_max_sample_rate to 25500

性能列表| grep msr

  msr/aperf/                                         [Kernel PMU event]
  msr/mperf/                                         [Kernel PMU event]
  msr/pperf/                                         [Kernel PMU event]
  msr/smi/                                           [Kernel PMU event]
  msr/tsc/   

sudo uname -a Linux bla 4.9.0-amd64#1 SMP Debian 4.9.130-2(2018-10-27)x86_64 GNU / Linux

sudo /proc/config.gz 返回找不到命令 任何帮助/想法表示赞赏。

2 个答案:

答案 0 :(得分:3)

可以使用组采样通过perf record来收集此信息。例如,以下命令

perf record -a -e '{cycles,msr/aperf/,msr/tsc/}:S'

基于cycle(第一个计数器)溢出收集所有三个事件的值。未记录的:S修饰符是必需的,它可以确保只有组长触发样本。要查看此信息,请使用perf report --group,该参数可能不是必需的。恐怕每个样本的实际值仅在非常冗长的perf script -D中可见。

答案 1 :(得分:2)

perf中引入了patch,以支持MSR性能监视单元。这些MSR PMU支持自由运行的MSR计数器。这些计数器包括基于时间和频率的计数器,例如TSCIA32_APERFIA32_MPERFIA32_PPERF

这些MSR事件不支持采样模式。如Linux内核(v4.9)源代码中的this行代码所示。

摘要:

if event->attr.sample_period) /* no sampling */ return -EINVAL;

perf_events可以通过三种方式(计数事件,采样事件和bpf事件)进行检测。请记住,运行perf record时,您现在正在调用采样模式。即使您未明确指定sampling period,内部采样仍会以默认采样频率进行。

要对msr个事件进行计数,您需要在计数/聚合模式下运行perf_events。为此,您运行perf stat-

perf stat -e msr/tsc/ -a

^C

Performance counter stats for 'system wide':

 34,83,07,96,035      msr/tsc/                                                    

 2.419151644 seconds time elapsed

阅读this,以了解有关计数和采样事件/模式的更多信息。