Linux 对“perf record”的输出运行“perf stat”?

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 除了数量有

有了(v4.15.18),我可以运行
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