perf_event_open 和 PERF_COUNT_HW_INSTRUCTIONS

perf_event_open and PERF_COUNT_HW_INSTRUCTIONS

我正在尝试分析具有相当复杂结构的现有应用程序。现在我正在使用 perf_event_open 并且需要 ioctl 调用来启用我感兴趣的事件。

manpage 仍然认为 PERF_COUNT_HW_INSTRUCTIONS 应该谨慎使用 - 那么在 Skylake 处理器的情况下应该首选哪个?也许是特定的 Intel PMU

perf_event_open 联机帮助页 http://man7.org/linux/man-pages/man2/perf_event_open.2.html 说 PERF_COUNT_HW_INSTRUCTIONS:

PERF_COUNT_HW_INSTRUCTIONS Retired instructions. Be careful, these can be affected by various issues, most notably hardware interrupt counts.

我认为这意味着可以使用 COUNT_HW_INSTRUCTIONS(而且几乎所有地方都支持它)。但是由于来自中断或其他逻辑的噪声,某些代码片段的 COUNT_HW_INSTRUCTIONS 的确切值在几次运行中可能会略有不同。

因此在大多数 CPU 上使用事件 PERF_COUNT_HW_INSTRUCTIONS 和 PERF_COUNT_HW_CPU_CYCLES 是安全的。 Linux 内核中的 perf_events 子系统会将 COUNT_HW_CPU_CYCLES 映射到一些更适合当前使用的 CPU 及其 PMU 的原始事件。

根据您的目标,您应该尝试获取有关代码片段的 PERF_COUNT_HW_INSTRUCTIONS 值的一些统计信息。您还可以使用一些简单的程序多次运行 perf stat 来检查此计数器的稳定性:

perf stat -e cycles:u,instructions:u /bin/echo 123
perf stat -e cycles:u,instructions:u /bin/echo 123
perf stat -e cycles:u,instructions:u /bin/echo 123

或者使用perf stat的集成repeat函数:

perf stat --repeat 10 -e cycles:u,instructions:u /bin/echo 123

对于总共执行的 20 万条指令,我有 +-10 个指令事件变化(小于 0.1%),所以它非常稳定。对于循环,我有 5% 的变化,所以它应该是带有警告标记的循环事件。