/proc/sys/kernel/perf_event_paranoid
作为非 root 用户,即使我已设置为-1
并设置CAP_SYS_ADMIN
为 on,perf mem record 也不起作用/usr/bin/perf
getcap /usr/bin/perf
/usr/bin/perf = cap_sys_admin+ep
cat /proc/sys/kernel/perf_event_paranoid
-1
bash$ perf mem record id
Error:
You may not have permission to collect stats.
Consider tweaking /proc/sys/kernel/perf_event_paranoid, which controls use of the performance events system by unprivileged users (without CAP_SYS_ADMIN).
The current value is -1:
-1: Allow use of (almost) all events by all users
Ignore mlock limit after perf_event_mlock_kb without CAP_IPC_LOCK.
>= 0: Disallow ftrace function tracepoint by users without CAP_SYS_ADMIN
Disallow raw tracepoint acess by users without CAP_SYS_ADMIN
>= 1: Disallow CPU event access by users without CAP_SYS_ADMIN
>= 2: Disallow kernel profiling by users without CAP_SYS_ADMIN
To make this setting permanent, edit /etc/sysctl.conf too, e.g.:
kernel.perf_event_paranoid = -1
我不明白为什么这不起作用。
奇怪的是,如果我用 strace 运行它,我不会收到权限错误。在这种情况下似乎有效。
(同样,这是作为非 root 用户)
strace -f -e perf_event_open perf mem record id
运行perf --debug verbose=2 perf mem record id
显示 perf_event_open 系统调用返回 errno 13 (EACCES)
perf_event_open 手册页显示:
EACCES 当请求的事件需要 CAP_SYS_ADMIN 权限(或更宽松的 perf_event_paranoid 设置)时返回。
非特权进程可能会遇到此错误的一些常见情况:附加到不同用户拥有的进程;
监视给定 CPU 上的所有进程(即将 pid 参数指定为 -1);
并且当偏执设置需要时不设置 except_kernel 。
这是 CentOS 7.6。