性能:为什么我没有 "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 = 0
和 kernel.yama.ptrace_scope = 0
放在 /etc/sysctl.d/99-local.conf
中,以便在单个用户上进行调试/跟踪/分析一直不使用 root
的桌面。
显然 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.
如果内核不是用 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 = 0
和 kernel.yama.ptrace_scope = 0
放在 /etc/sysctl.d/99-local.conf
中,以便在单个用户上进行调试/跟踪/分析一直不使用 root
的桌面。