Linux kernel perf_event_paranoid==1对x86性能的实际限制是什么?

Linux kernel perf_event_paranoid==1对x86性能的实际限制是什么?,linux-kernel,x86,profiling,perf,intel-pmu,Linux Kernel,X86,Profiling,Perf,Intel Pmu,较新的Linux内核有一个sysfs可调的/proc/sys/kernel/perf_event_paranoid,它允许用户为非root用户调整perf_events的可用功能,数字越大,安全性就越高(提供的功能也相应减少): 从中,我们对各种值具有以下行为: 性能事件偏执狂: 控制非特权用户对性能事件系统的使用 (无CAP_系统管理)。默认值为2 -1:允许所有用户使用(几乎)所有事件 忽略性能事件后的mlock限制\u mlock\u kb,无CAP\u IPC\u锁定 >=0:不允许没有

较新的Linux内核有一个sysfs可调的
/proc/sys/kernel/perf_event_paranoid
,它允许用户为非root用户调整
perf_events
的可用功能,数字越大,安全性就越高(提供的功能也相应减少):

从中,我们对各种值具有以下行为:

性能事件偏执狂:

控制非特权用户对性能事件系统的使用 (无CAP_系统管理)。默认值为2

-1:允许所有用户使用(几乎)所有事件 忽略性能事件后的mlock限制\u mlock\u kb,无CAP\u IPC\u锁定

>=0:不允许没有CAP\u SYS\u ADMIN的用户使用ftrace函数跟踪点 不允许没有CAP_SYS_ADMIN的用户访问原始跟踪点

>=1:不允许没有CAP\u SYS\u ADMIN的用户访问CPU事件

>=2:不允许没有CAP\u SYS\u ADMIN的用户进行内核评测

我的
perf_event_paranoid
文件中有
1
,它应该“禁止CPU事件访问”-但这到底意味着什么

简单的读取意味着无法访问CPU性能计数器事件(如Intel PMU事件),但我似乎可以很好地访问这些事件。例如:

$ perf stat sleep 1

 Performance counter stats for 'sleep 1':

          0.408734      task-clock (msec)         #    0.000 CPUs utilized          
                 1      context-switches          #    0.002 M/sec                  
                 0      cpu-migrations            #    0.000 K/sec                  
                57      page-faults               #    0.139 M/sec                  
         1,050,362      cycles                    #    2.570 GHz                    
           769,135      instructions              #    0.73  insn per cycle         
           152,661      branches                  #  373.497 M/sec                  
             6,942      branch-misses             #    4.55% of all branches        

       1.000830821 seconds time elapsed
这里,许多事件是CPU PMU事件(
周期
指令
分支
分支未命中
缓存未命中

如果这些不是被引用的CPU事件,它们是什么?

在这种情况下,CPU事件是指监视每个CPU而不是每个任务的事件。对于
perf
工具,这限制了

-C, --cpu=
    Count only on the list of CPUs provided. Multiple CPUs can be provided as a comma-separated list with no space: 0,1.
    Ranges of CPUs are specified with -: 0-2. In per-thread mode, this option is ignored. The -a option is still necessary
    to activate system-wide monitoring. Default is to count on all CPUs.

-a, --all-cpus
    system-wide collection from all CPUs (default if no target is specified)
对于
perf\u event\u open
这将考虑以下情况:

pid == -1 and cpu >= 0
       This measures all processes/threads on the specified CPU.  This requires CAP_SYS_ADMIN capability or a /proc/sys/ker‐
       nel/perf_event_paranoid value of less than 1.

这可能是特定版本的,引用的文件来自4.17。这是。

随机猜测:限制非通用uarch特定事件,如发出的
uops\u。任何
?@PeterCordes-nope,
ocperf stat-e uops\u发出。任何睡眠1
也起作用。另一个表明它不是普通PMU事件的迹象是值
2
会阻止内核评测,甚至阻止任何内核CPU事件(
:k
后缀)在使用2时返回零。由于2被认为严格地比1更安全,这意味着1和2中允许用户模式事件,1中允许内核模式事件(实际上,
:k
在使用1时起作用),因此“CPU事件”必须意味着比普通PMU事件更窄或不同的东西…新猜测:它用于系统范围的评测,或整个CPU而不是我的进程。您可以使用
1
评测您自己的进程调用的内核代码,但可能它试图防止直接对其他用户的进程进行计时,只留下超读计时方面的通道els.2013年提出了“3”的值:“安全,性能:允许进一步限制性能事件打开”。该选项是在2009年添加的。我们应该检查LKML以获取更多注释。值得一提的是,在另一个问题上,wrt
paranoid==2
似乎是错误的。对于
paranoid==2
我肯定仍然可以使用
perf stat
来获取事件,但我只是看不到内核PMU计数(仅限用户)。我可以通过查看代码来确认这个答案是正确的。此外,还将执行检查
sysctl_perf_event_paranoid>0
,以确定是否允许在P4处理器上使用线程共享(逻辑处理器之间共享)事件(正式称为TI事件)。通过本地测试确认。