首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对` `perf record`的输出运行` `perf stat`?

对` `perf record`的输出运行` `perf stat`?
EN

Stack Overflow用户
提问于 2020-06-24 16:00:19
回答 2查看 800关注 0票数 3

使用perf (the Linux profiler) (v4.15.18),我可以运行perf stat $COMMAND来获取该命令的一些简单统计信息。如果我运行perf record,它会将大量数据保存到perf.data文件中。

EN

回答 2

Stack Overflow用户

发布于 2020-06-30 05:27:20

perf stat在计数模式下使用hardware performance monitoring unit,而带有perf.data文件的perf record/perf report在溢出模式下使用相同的单位。在这两种模式下,hardware performance counters都配置了控制寄存器,以获得某种类型的性能事件(例如,cpu周期或执行的指令),并且计数器将在每个事件上递增。

在计数模式下,perf stat将在程序开始时将计数器配置为零,并在程序退出时读取最终计数器值(实际计数可能被分成几个具有相同结果的段-完整运行的单个值)。

在分析模式下(sampling profiling perf record将计数器配置为某个负值,例如将安装-100000和溢出处理程序)(实际值将自动调整为某个频率)。每发生100000个事件,计数器就会溢出为零并产生一个中断。perf_events中断处理程序会将“采样”(当前时间、pid、指令指针,可选的-g中的调用堆栈)记录到环形缓冲区中,该缓冲区将保存到perf.data中。此处理程序还会再次将计数器重置为-100000。因此,经过足够长的运行时间后,将有成千上万的样本存储在perf.data中,这些样本可以用来生成程序的统计配置文件(程序中哪些部分运行得更频繁)。

perf stat显示了什么?在x86_64 cpu的默认模式下:程序运行时间(任务时钟和已用时间),3个软件事件(上下文切换、cpu迁移、页面故障),4个硬件计数器:周期、指令、分支、分支未命中:

代码语言:javascript
复制
$ 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

记录perf record的内容是什么?在单个唤醒事件(环形缓冲区溢出)中,它将1246个样本保存到perf.data中,并使用默认hw事件(周期)

代码语言:javascript
复制
$ echo '3^123456%3' | perf record bc
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.049 MB perf.data (1293 samples) ]

使用perf report --header|lessperf scriptperf script -D,您可以查看perf.data内容:

代码语言:javascript
复制
$ 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.data内部有一些时间戳和一些用于程序启动和退出(perf script -D |egrep exec\|EXIT)的附加事件,但是默认perf.data中没有足够的信息来完全重建perf stat输出。运行时间仅记录为启动和退出的时间戳,并且对于每个事件样本,不记录软件事件,仅使用单个硬件事件(周期;无指令、分支、分支未命中)。可以近似使用硬件计数器,但它不准确(实际周期约为820-825mln):

代码语言:javascript
复制
$ perf report --header |grep Event
# Event count (approx.): 836622729

使用perf.data的非默认记录,可以估计更多事件:

代码语言:javascript
复制
$ 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中的时间戳。

票数 1
EN

Stack Overflow用户

发布于 2020-06-26 17:52:31

perf stat需要应用程序。您可以使用perf脚本来运行聚合和汇总跟踪数据的预封装脚本。可以使用以下命令列出可能的脚本。

性能脚本-l

除了有限数量的预装脚本外,您还可以使用python或perl定义自定义的perf.data处理脚本。

详情请参见perf scriptperf script in pythonperf script in perl

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62550369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档