Linux 对“perf record”的输出运行“perf stat”?
有了(v4.15.18),我可以运行Linux 对“perf record”的输出运行“perf stat”?,linux,performance,optimization,perf,Linux,Performance,Optimization,Perf,有了(v4.15.18),我可以运行perf stat$命令来获取该命令的一些简单统计信息。如果我运行perf record,它会将大量数据保存到perf.data文件中 我可以在perf record的输出上运行perf stat吗?这样我既可以查看性能记录数据,又可以获得一个简单的概述?不,您不能。性能记录输出是一个数据文件。perf stat需要一个应用程序。 您可以使用perf脚本运行一个预先封装的脚本,该脚本聚合并汇总跟踪数据。可以使用以下命令列出可能的脚本。 性能脚本-l 除了数量有
perf stat$命令
来获取该命令的一些简单统计信息。如果我运行perf record
,它会将大量数据保存到perf.data
文件中
我可以在
perf record
的输出上运行perf stat
吗?这样我既可以查看性能记录数据,又可以获得一个简单的概述?不,您不能。性能记录输出是一个数据文件。perf stat需要一个应用程序。
您可以使用perf脚本运行一个预先封装的脚本,该脚本聚合并汇总跟踪数据。可以使用以下命令列出可能的脚本。性能脚本-l
除了数量有限的预封装脚本外,还可以用python或perl定义自定义性能数据处理脚本。
有关详细信息,请参阅和。
perf stat
在计数模式下使用,而perf record
/perf report
和perf.data文件在溢出模式下使用相同的单位。在这两种模式下,都将控制寄存器配置为某种性能事件(例如cpu周期或执行的指令),并且计数器将在每个事件上递增
在计数模式下,perf stat
将在程序启动时将计数器配置为零,并在程序退出时读取最终计数器值(实际计数可能被分割为多个具有相同结果的段-完整运行时的单个值)
在分析模式下()perf record
将计数器配置为一些负值,例如-100000
并将安装溢出处理程序(实际值将自动调谐到某些频率)。每100000个事件,计数器将溢出到零并生成一个中断<代码>性能事件中断处理程序将把“样本”(当前时间、pid、指令指针、可选调用堆栈)记录到环形缓冲区中,该缓冲区将保存到性能数据。此处理程序还将再次将计数器重置为-100000
。因此,在运行足够长的时间后,将有数千个样本存储在perf.data
中,这些样本可用于生成程序的统计配置文件(程序的哪些部分运行得更频繁)
perf stat
显示什么?在x86_64 cpu的默认模式下:程序运行时间(任务时钟和运行时间)、3个软件事件(上下文切换、cpu迁移、页面错误)、4个硬件计数器:周期、指令、分支、分支未命中:
$ echo '3^123456%3' | perf stat bc
0
Performance counter stats for 'bc':
325.604672 task-clock (msec) # 0.998 CPUs utilized
0 context-switches # 0.000 K/sec
0 cpu-migrations # 0.000 K/sec
181 page-faults # 0.556 K/sec
828,234,675 cycles # 2.544 GHz
1,840,146,399 instructions # 2.22 insn per cycle
348,965,282 branches # 1071.745 M/sec
15,385,371 branch-misses # 4.41% of all branches
0.326152702 seconds time elapsed
记录的性能记录是什么?在单个唤醒事件(环形缓冲区溢出)中,它确实将1246个样本保存到perf.data中,并使用了默认的hw事件(周期)
使用perf report--header | less
、perf script
和perf script-D
可以查看性能数据内容:
$ perf report --header |grep event
# event : name = cycles:uppp, , size = 112, { sample_period, sample_freq } = 4000, sample_type = IP|TID|TIME|PERIOD ...
# Samples: 1K of event 'cycles:uppp'
$ perf script 2>/dev/null |grep cycles|wc -l
1293
性能数据中有一些时间戳,以及一些用于程序启动和退出的附加事件(perf script-D | egrep exec\| exit
),但默认的perf.data
中没有足够的信息来完全重建perf stat
输出。运行时间仅记录为启动和退出的时间戳,对于每个事件样本,不记录软件事件,只使用单个硬件事件(周期;无指令、分支、分支未命中)。可以对使用的硬件计数器进行近似,但不精确(实际周期约为820-825 mln):
使用性能数据的非默认记录
可以估计更多事件:
$ echo '3^123456%3' | perf record -e cycles,instructions,branches,branch-misses bc
[ perf record: Captured and wrote 0.238 MB perf.data (5164 samples) ]
$ perf report --header |egrep Event\|Samples
# Samples: 1K of event 'cycles'
# Event count (approx.): 834809036
# Samples: 1K of event 'instructions'
# Event count (approx.): 1834083643
# Samples: 1K of event 'branches'
# Event count (approx.): 347750459
# Samples: 1K of event 'branch-misses'
# Event count (approx.): 15382047
因此,您可以,但您可以要求
perf report
打印带有事件计数估计的标题。您还可以尝试从perf script
/perf script-D
解析时间戳。是否有脚本提供类似perf stat
的输出,给定perf记录中的perf.data
?如果你给出一个答案,这将是一个有用的答案。这显然是问题真正想要的,不管措辞是否笨拙。perf report--header | egrep Event\| Samples
从perf.data
文件中估算总事件数,但它并不精确,而且仅限于事件,记录到perf.data
文件中。相关:似乎perf stat report
仅适用于perf stat record
保存的数据,而不是常规的perf record
。这个问题不是重复的吗?我本来打算把它关闭,但后来看到你在两个网站上都贴出了类似的答案。除非这个问题意味着什么,否则我认为这是一个重复的问题。
$ perf report --header |grep Event
# Event count (approx.): 836622729
$ echo '3^123456%3' | perf record -e cycles,instructions,branches,branch-misses bc
[ perf record: Captured and wrote 0.238 MB perf.data (5164 samples) ]
$ perf report --header |egrep Event\|Samples
# Samples: 1K of event 'cycles'
# Event count (approx.): 834809036
# Samples: 1K of event 'instructions'
# Event count (approx.): 1834083643
# Samples: 1K of event 'branches'
# Event count (approx.): 347750459
# Samples: 1K of event 'branch-misses'
# Event count (approx.): 15382047