新版本的Linux内核有一个sysfs可调参数
从kernel documenation中我们可以看到各个值的行为:
简单的阅读会暗示无法访问CPU性能计数器事件(如Intel PMU事件),但似乎我可以正常访问这些事件。例如:
/proc/sys/kernel/perf_event_paranoid
,允许用户为非root用户调整perf_events
的可用功能,更高的数字表示更安全(相应地提供更少的功能):从kernel documenation中我们可以看到各个值的行为:
我在我的perf_event_paranoid:
控制非特权用户(没有CAP_SYS_ADMIN权限)使用性能事件系统的使用。默认值为2。
-1:允许所有用户(几乎)使用所有事件,在没有CAP_IPC_LOCK的情况下忽略perf_event_mlock_kb的mlock限制
>=0:禁止没有CAP_SYS_ADMIN权限的用户使用ftrace函数跟踪点;禁止没有CAP_SYS_ADMIN权限的用户访问原始跟踪点
>=1:禁止没有CAP_SYS_ADMIN权限的用户访问CPU事件
>=2:禁止没有CAP_SYS_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事件(cycles
、instructions
、branches
、branch-misses
、cache-misses
)。
如果这些不是指的CPU事件,那么它们是什么?
uops_issued.any
? - Peter Cordesocperf stat -e uops_issued.any sleep 1
也可以。 - BeeOnRope2
会阻止内核分析,实际上任何内核CPU事件(使用:k
后缀)在使用2时都返回零。由于2应该比1更安全,这意味着用户模式事件在1和2中都被允许,并且内核模式事件在1中被允许(确实,在使用1时,:k
有效),因此“CPU事件”必须意味着比普通PMU事件更狭窄或不同的东西... - BeeOnRope