Perf instruction/cycles 计入 userspace/kernelspace 单独计入 Linux
Perf instruction/cycles count in userspace/kernelspace alone in Linux
我正在尝试使用 perf 分析具有用户空间和内核空间代码的应用程序。我尝试了启用各种内核配置的所有其他可能性,但我无法单独获得 userspace/kernelspace 中的 instructions/cycles 计数。我尝试使用 ":u" 和 ":k
指令和周期的扩展计数,但我得到的答复是
$ perf stat -e cycles:u,instructions:u ls
Performance counter stats for 'ls':
<not supported> cycles:u
<not supported> instructions:u
0.006047045 seconds time elapsed
0.000000000 seconds user
0.008098000 seconds sys
然而,运行 仅对 cycles/instructions 给出了如下所示的正确结果。
$ perf stat -e cycles,instructions ls
Performance counter stats for 'ls':
5362086 cycles
528783 instructions # 0.10 insn per cycle
0.005487940 seconds time elapsed
0.007800000 seconds user
0.000000000 seconds sys
注意:这里仅以 ls 为例,突出问题。
我是 运行 Linux 5.4 和 perf 版本 5.4.77.g1206eede9156。而且,我在 ARM 板上 运行 以上命令。以下是我在 Linux 内核
中启用的配置
CONFIG_PERF_EVENTS=y
CONFIG_PROFILING=y
CONFIG_TRACEPOINTS=y
CONFIG_KPROBES=y
CONFIG_OPTPROBES=y
CONFIG_KPROBES_ON_FTRACE=y
CONFIG_UPROBES=y
CONFIG_HAVE_KPROBES=y
CONFIG_HAVE_KRETPROBES=y
CONFIG_HAVE_OPTPROBES=y
CONFIG_HAVE_KPROBES_ON_FTRACE=y
CONFIG_DEBUG_INFO=y
CONFIG_DEBUG_INFO_DWARF4=y
CONFIG_FRAME_POINTER=y
CONFIG_FTRACE=y
CONFIG_KPROBE_EVENTS=y
CONFIG_UPROBE_EVENTS=y
CONFIG_PROBE_EVENTS=y
此外,命令行上的 perf list 会列出 hardware/software 事件等等
$ perf list
branch-instructions OR branches [Hardware event]
branch-misses [Hardware event]
cache-misses [Hardware event]
cache-references [Hardware event]
cpu-cycles OR cycles [Hardware event]
instructions [Hardware event]
alignment-faults [Software event]
bpf-output [Software event]
context-switches OR cs [Software event]
cpu-clock [Software event]
cpu-migrations OR migrations [Software event]
dummy [Software event]
emulation-faults [Software event]
major-faults [Software event]
minor-faults [Software event]
page-faults OR faults [Software event]
task-clock [Software event]
duration_time [Tool event]
L1-dcache-load-misses [Hardware cache event]
L1-dcache-loads [Hardware cache event]
L1-dcache-prefetch-misses [Hardware cache event]
L1-dcache-prefetches [Hardware cache event]
L1-dcache-store-misses [Hardware cache event]
L1-dcache-stores [Hardware cache event]
L1-icache-load-misses [Hardware cache event]
L1-icache-loads [Hardware cache event]
L1-icache-prefetch-misses [Hardware cache event]
L1-icache-prefetches [Hardware cache event]
branch-load-misses [Hardware cache event]
branch-loads [Hardware cache event]
dTLB-load-misses [Hardware cache event]
dTLB-store-misses [Hardware cache event]
iTLB-load-misses [Hardware cache event]
请建议如何解决此问题。我做错了什么吗?
适合我,444,022 cycles:u
适合 perf stat -e cycles:u ls
。 perf 版本 5.13.g62fb9874f5da,在 Linux 5.12.15-arch1-1 上,在裸机 (x86-64 Skylake) 上,perf_event_paranoid=0
.
(使用现代性能,您还可以使用 perf stat --all-user
来为所有事件暗示 :u
。)
我猜你的 ARM CPU 的硬件性能计数器不支持使用特权级掩码进行编程,因此 perf
报告没有硬件计数器能够仅计算用户-space 指令。
据我所知,在每个中断入口点都没有钩子来启用/禁用硬件计数器;仅计算内核、仅用户或两者,纯粹是硬件功能。
硬件支持对于准确计数显然是必不可少的,因为在软件实现中,计数器仍会计数,直到内核代码 运行 保存了当前计数。 (以及恢复状态后的内核代码,在返回到 user-space 之前。)此外,这会使每个中断和系统调用更加昂贵,而不是仅在每个上下文中通过 saving/restoring 虚拟化性能计数器在 tasks/threads 之间切换。因此,即使在硬件不支持特权掩码的 CPU 上,内核也有充分的理由不支持在软件中进行松散的尝试。
我正在尝试使用 perf 分析具有用户空间和内核空间代码的应用程序。我尝试了启用各种内核配置的所有其他可能性,但我无法单独获得 userspace/kernelspace 中的 instructions/cycles 计数。我尝试使用 ":u" 和 ":k 指令和周期的扩展计数,但我得到的答复是
$ perf stat -e cycles:u,instructions:u ls
Performance counter stats for 'ls':
<not supported> cycles:u
<not supported> instructions:u
0.006047045 seconds time elapsed
0.000000000 seconds user
0.008098000 seconds sys
然而,运行 仅对 cycles/instructions 给出了如下所示的正确结果。
$ perf stat -e cycles,instructions ls
Performance counter stats for 'ls':
5362086 cycles
528783 instructions # 0.10 insn per cycle
0.005487940 seconds time elapsed
0.007800000 seconds user
0.000000000 seconds sys
注意:这里仅以 ls 为例,突出问题。
我是 运行 Linux 5.4 和 perf 版本 5.4.77.g1206eede9156。而且,我在 ARM 板上 运行 以上命令。以下是我在 Linux 内核
中启用的配置CONFIG_PERF_EVENTS=y
CONFIG_PROFILING=y
CONFIG_TRACEPOINTS=y
CONFIG_KPROBES=y
CONFIG_OPTPROBES=y
CONFIG_KPROBES_ON_FTRACE=y
CONFIG_UPROBES=y
CONFIG_HAVE_KPROBES=y
CONFIG_HAVE_KRETPROBES=y
CONFIG_HAVE_OPTPROBES=y
CONFIG_HAVE_KPROBES_ON_FTRACE=y
CONFIG_DEBUG_INFO=y
CONFIG_DEBUG_INFO_DWARF4=y
CONFIG_FRAME_POINTER=y
CONFIG_FTRACE=y
CONFIG_KPROBE_EVENTS=y
CONFIG_UPROBE_EVENTS=y
CONFIG_PROBE_EVENTS=y
此外,命令行上的 perf list 会列出 hardware/software 事件等等
$ perf list
branch-instructions OR branches [Hardware event]
branch-misses [Hardware event]
cache-misses [Hardware event]
cache-references [Hardware event]
cpu-cycles OR cycles [Hardware event]
instructions [Hardware event]
alignment-faults [Software event]
bpf-output [Software event]
context-switches OR cs [Software event]
cpu-clock [Software event]
cpu-migrations OR migrations [Software event]
dummy [Software event]
emulation-faults [Software event]
major-faults [Software event]
minor-faults [Software event]
page-faults OR faults [Software event]
task-clock [Software event]
duration_time [Tool event]
L1-dcache-load-misses [Hardware cache event]
L1-dcache-loads [Hardware cache event]
L1-dcache-prefetch-misses [Hardware cache event]
L1-dcache-prefetches [Hardware cache event]
L1-dcache-store-misses [Hardware cache event]
L1-dcache-stores [Hardware cache event]
L1-icache-load-misses [Hardware cache event]
L1-icache-loads [Hardware cache event]
L1-icache-prefetch-misses [Hardware cache event]
L1-icache-prefetches [Hardware cache event]
branch-load-misses [Hardware cache event]
branch-loads [Hardware cache event]
dTLB-load-misses [Hardware cache event]
dTLB-store-misses [Hardware cache event]
iTLB-load-misses [Hardware cache event]
请建议如何解决此问题。我做错了什么吗?
适合我,444,022 cycles:u
适合 perf stat -e cycles:u ls
。 perf 版本 5.13.g62fb9874f5da,在 Linux 5.12.15-arch1-1 上,在裸机 (x86-64 Skylake) 上,perf_event_paranoid=0
.
(使用现代性能,您还可以使用 perf stat --all-user
来为所有事件暗示 :u
。)
我猜你的 ARM CPU 的硬件性能计数器不支持使用特权级掩码进行编程,因此 perf
报告没有硬件计数器能够仅计算用户-space 指令。
据我所知,在每个中断入口点都没有钩子来启用/禁用硬件计数器;仅计算内核、仅用户或两者,纯粹是硬件功能。
硬件支持对于准确计数显然是必不可少的,因为在软件实现中,计数器仍会计数,直到内核代码 运行 保存了当前计数。 (以及恢复状态后的内核代码,在返回到 user-space 之前。)此外,这会使每个中断和系统调用更加昂贵,而不是仅在每个上下文中通过 saving/restoring 虚拟化性能计数器在 tasks/threads 之间切换。因此,即使在硬件不支持特权掩码的 CPU 上,内核也有充分的理由不支持在软件中进行松散的尝试。