perf_event_open 上的权限被拒绝,除了使用 sudo 或更改 perf_event_paranoid 文件之外,还有其他方法吗?
Permission denied on perf_event_open, is there another way than to use sudo or changing the perf_event_paranoid file?
我能找到的关于该主题的唯一信息是 link:,根据我的理解,建议使用 CONFIG_HW_PERF_EVENTS 配置,但我仍然遇到同样的问题.
我正在实施一个受 perf_event_open
手册页启发的程序:
static long
perf_event_open(struct perf_event_attr *hw_event, pid_t pid,
int cpu, int group_fd, unsigned long flags)
{
int ret;
ret= syscall(__NR_perf_event_open, hw_event, pid, cpu,
group_fd, flags);
return ret;
}
struct perf_event_attr pe;
int pid = fork();
if (pid > 0 ) {
memset(&pe, 0, sizeof(pe));
pe.type = PERF_TYPE_HARDWARE;
pe.size = sizeof(pe);
pe.config = PERF_COUNT_HW_CPU_CYCLES;
pe.disabled = 0;
pe.exclude_kernel = 0;
pe.exclude_hv = 0;
fd = perf_event_open(&pe, pid, -1, -1, 0);
if (fd == -1) {
perror(0);
exit(EXIT_FAILURE);
}
}
对于 fd,我总是得到 -1 return,perror 表示权限被拒绝。
当然我可以使用 sudo 解决这个问题,但是有没有其他方法允许执行 perf_event_open?
PS:我不想更改perf_event_paranoid文件,它使程序在设置为-1时运行;我假设它会在 2.
RETURN VALUE section of the Linux perf_event_open()
system call 部分陈述:
...
EACCES Returned when the requested event requires CAP_PERFMON
(since Linux 5.8) or CAP_SYS_ADMIN permissions (or a more
permissive perf_event paranoid setting). Some common
cases where an unprivileged process may encounter this
error: attaching to a process owned by a different user;
monitoring all processes on a given CPU (i.e., specifying
the pid argument as -1); and not setting exclude_kernel
when the paranoid setting requires it.
...
EPERM Returned on many (but not all) architectures when an
unsupported exclude_hv, exclude_idle, exclude_user, or
exclude_kernel setting is specified.
It can also happen, as with EACCES, when the requested
event requires CAP_PERFMON (since Linux 5.8) or
CAP_SYS_ADMIN permissions (or a more permissive perf_event
paranoid setting). This includes setting a breakpoint on
a kernel address, and (since Linux 3.13) setting a kernel
function-trace tracepoint.
根据发布的示例代码,值 pe.exclude_kernel = 0;
或 pe.exclude_hv = 0;
可能会导致权限问题,因为您对 paranoid 设置的声明。
我能找到的关于该主题的唯一信息是 link:
我正在实施一个受 perf_event_open
手册页启发的程序:
static long
perf_event_open(struct perf_event_attr *hw_event, pid_t pid,
int cpu, int group_fd, unsigned long flags)
{
int ret;
ret= syscall(__NR_perf_event_open, hw_event, pid, cpu,
group_fd, flags);
return ret;
}
struct perf_event_attr pe;
int pid = fork();
if (pid > 0 ) {
memset(&pe, 0, sizeof(pe));
pe.type = PERF_TYPE_HARDWARE;
pe.size = sizeof(pe);
pe.config = PERF_COUNT_HW_CPU_CYCLES;
pe.disabled = 0;
pe.exclude_kernel = 0;
pe.exclude_hv = 0;
fd = perf_event_open(&pe, pid, -1, -1, 0);
if (fd == -1) {
perror(0);
exit(EXIT_FAILURE);
}
}
对于 fd,我总是得到 -1 return,perror 表示权限被拒绝。
当然我可以使用 sudo 解决这个问题,但是有没有其他方法允许执行 perf_event_open?
PS:我不想更改perf_event_paranoid文件,它使程序在设置为-1时运行;我假设它会在 2.
RETURN VALUE section of the Linux perf_event_open()
system call 部分陈述:
... EACCES Returned when the requested event requires CAP_PERFMON (since Linux 5.8) or CAP_SYS_ADMIN permissions (or a more permissive perf_event paranoid setting). Some common cases where an unprivileged process may encounter this error: attaching to a process owned by a different user; monitoring all processes on a given CPU (i.e., specifying the pid argument as -1); and not setting exclude_kernel when the paranoid setting requires it. ... EPERM Returned on many (but not all) architectures when an unsupported exclude_hv, exclude_idle, exclude_user, or exclude_kernel setting is specified. It can also happen, as with EACCES, when the requested event requires CAP_PERFMON (since Linux 5.8) or CAP_SYS_ADMIN permissions (or a more permissive perf_event paranoid setting). This includes setting a breakpoint on a kernel address, and (since Linux 3.13) setting a kernel function-trace tracepoint.
根据发布的示例代码,值 pe.exclude_kernel = 0;
或 pe.exclude_hv = 0;
可能会导致权限问题,因为您对 paranoid 设置的声明。