性能:为什么我没有 "syscall" 个计数器?

perf: why don't I have "syscall" counters?

显然 Linux perf 中有一些计数器,例如 syscall:sys_enter_select,但在我的系统上 perf list 没有显示任何计数器

其他人确实有这些计数器的证据在这里:http://www.brendangregg.com/blog/2014-07-03/perf-counting.html

如果我 运行 perf top -e 'syscalls:sys_enter_*' 它说:

Can't open event dir: Permission denied
invalid or unsupported event: 'syscalls:sys_enter_*'

其他事件类型(perf list 中的事件类型)工作正常。

我需要做什么才能访问 perf 中的系统调用计数器?我在 x86_64.

上使用 Linux 内核和性能版本 3.10

如果内核不是用 CONFIG_HAVE_SYSCALL_TRACEPOINTS 构建的,这些将丢失。

您可以这样查看:

# grep TRACEPOINTS "/boot/config-$(uname -r)"
CONFIG_TRACEPOINTS=y
CONFIG_HAVE_SYSCALL_TRACEPOINTS=y

一些 perf 计数器,包括所有 syscall 计数器,仅对根用户可用。 sudo perf list 将显示所有计数器,包括 syscall 那些假设内核是用 CONFIG_HAVE_SYSCALL_TRACEPOINTS 构建的(参见 Grisha Levit 的回答)。

因此,要使 perf top -e 'syscalls:sys_enter_*' 工作,运行 它在 sudo 下——即使您不需要 sudo 用于其他计数器,例如 cycles .

你必须有一个旧版本的 perf 来配合你那老旧的 3.10 内核。

在现代系统上(x86-64 Arch Linux 与 Linux 4.15.8-1-ARCH,以及 perf), perf 为您解答此问题:

$ perf stat -e 'syscalls:sys_enter_*stat*' ls -l
event syntax error: 'syscalls:sys_enter_*stat*'
                     \___ can't access trace events

Error:  No permissions to read /sys/kernel/debug/tracing/events/syscalls/sys_enter_*stat*
Hint:   Try 'sudo mount -o remount,mode=755 /sys/kernel/debug/tracing'

Run 'perf list' for a list of valid events
...


$ ll /sys/kernel/debug/ -d
drwx------ 33 root root 0 Mar 14 00:02 /sys/kernel/debug/

有趣的是,你可以让它成为世界可读的,类似于你如何将 kernel.perf_event_paranoid = 0kernel.yama.ptrace_scope = 0 放在 /etc/sysctl.d/99-local.conf 中,以便在单个用户上进行调试/跟踪/分析一直不使用 root 的桌面。