理解 perf stat 输出中的数字

Posted

技术标签:

【中文标题】理解 perf stat 输出中的数字【英文标题】:Make sense of numbers in perf stat output 【发布时间】:2020-07-24 01:35:05 【问题描述】:

我一直在尝试使用 perf 来分析我的运行过程,但我无法理解 perf 输出的一些数字,这是我使用的命令和我得到的输出:

$ sudo perf stat -x, -v -e branch-misses,cpu-cycles,cache-misses  sleep 1
Using CPUID GenuineIntel-6-55-4
branch-misses: 7751 444665 444665
cpu-cycles: 1212296 444665 444665
cache-misses: 4902 444665 444665
7751,,branch-misses,444665,100.00,,
1212296,,cpu-cycles,444665,100.00,,
4902,,cache-misses,444665,100.00,,

我可以知道数字“444665”代表什么事件吗?

【问题讨论】:

不要使用-x,使用带有列标题的默认输出格式!哪些列代表事件在整个时间间隔内的计数会更加清楚。或者至少与没有-x 的输出进行比较以查看匹配的内容。 (sleep 不是一个很好的分析选择,它几乎不花任何时间运行,所以结果比较嘈杂。选择像 awk 'BEGINfor(i=0;i<10000000;i++)' 这样的东西 【参考方案1】:

perf stat-x 格式在man page of perf-stat,CSV 格式部分中进行了描述。此手册页的片段没有可选列:

CSV FORMAT         top

       With -x, perf stat is able to output a not-quite-CSV format output
       Commas in the output are not put into "". To make it easy to parse it
       is recommended to use a different character like -x \;

       The fields are in this order:
       ·   counter value
       ·   unit of the counter value or empty
       ·   event name
       ·   run time of counter
       ·   percentage of measurement time the counter was running

       Additional metrics may be printed with all earlier fields being
       empty.

因此,您有计数器的值、计数器的空单位、事件名称、运行时间、活动计数器的百分比(与程序运行时间相比)。

通过比较这两个命令的输出(Peter Cordes in comment 推荐)

perf stat  awk 'BEGINfor(i=0;i<10000000;i++)'
perf stat -x \; awk 'BEGINfor(i=0;i<10000000;i++)'

我认为这个计数器一直处于活动状态的运行时间是纳秒。当您使用不冲突的事件集运行perf stat,并且有足够的硬件计数器来计算所有需要的事件时,运行时间将几乎是已分析程序在 CPU 上运行的总时间。 (过大事件集的示例:perf stat -x , -e cycles,instructions,branches,branch-misses,cache-misses,cache-references,mem-loads,mem-stores awk 'BEGINfor(i=0;i&lt;10000000;i++)' - 这些事件的运行时间会有所不同,因为它们在程序执行期间被动态多路复用;而sleep 1 太短而无法激活多路复用。)

对于sleep 1,CPU 上的活动代码非常少,它只是 libc 启动代码并调用系统调用 nanosleep 1 秒(检查 strace sleep 1)。因此,在您的输出中,444665 以 ns 为单位,或者只是 444 微秒或 0.444 毫秒或 0.000444 秒的 libc 启动,用于 sleep 1 进程。

如果您想测量一秒钟的整个系统活动,请尝试添加 perf stat 的 -a 选项(分析所有进程),可选择使用 -A 来分隔 cpu 内核的事件(或使用 -I 100 来定期进行打印):

perf stat -a   sleep 1
perf stat -Aa   sleep 1
perf stat -a -x ,  sleep 1
perf stat -Aa -x ,  sleep 1

【讨论】:

以上是关于理解 perf stat 输出中的数字的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 perf stat 计算 MIPS

perf 报告单个睡眠的多个 sched:sched_stat_sleep 事件

perf stat 前端和后端周期显示大于 100%

如何获取使用 perf stat 运行的程序的退出代码?

perf stat 上的 subprocess.communicate 未返回预期的 stdout、stderr

KVM虚拟机使用Perf stat 提示cycles not supported