【发布时间】:2019-12-30 09:31:19
【问题描述】:
我正在尝试分析具有相当复杂结构的现有应用程序。现在我正在使用perf_event_open 和所需的ioctl 调用来启用我感兴趣的事件。
manpage 坚持认为应该谨慎使用PERF_COUNT_HW_INSTRUCTIONS - 那么在Skylake 处理器的情况下应该首选哪一个?也许是特定的Intel PMU?
【问题讨论】:
我正在尝试分析具有相当复杂结构的现有应用程序。现在我正在使用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退休指令。请注意,这些可能会受到各种问题的影响,尤其是硬件中断计数。
我认为这意味着 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 的集成重复功能:
perf stat --repeat 10 -e cycles:u,instructions:u /bin/echo 123
对于执行的 20 万条指令,我有 +-10 条指令事件变化(小于 0.1%),所以它非常稳定。对于周期,我有 5% 的变化,所以它应该是带有仔细警告标记的周期事件。
【讨论】: