首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可以从perf.data文件生成perf-stat结果吗?

可以从perf.data文件生成perf-stat结果吗?
EN

Stack Overflow用户
提问于 2012-04-26 01:53:47
回答 2查看 1.1K关注 0票数 8

当我想使用Linux工具套件perf中的perf-stat和perf-report生成性能报告时,我会运行:

代码语言:javascript
复制
$ perf record -o my.perf.data myCmd
$ perf report -i my.perf.data

和:

代码语言:javascript
复制
$ perf stat myCmd

但这意味着我再次运行'myCmd‘,这需要几分钟的时间。相反,我希望:

代码语言:javascript
复制
$ perf stat -i my.perf.data

但与perf套件中的大多数工具不同的是,我没有看到perf- -i选项。有没有其他工具可以做到这一点,或者有办法让perf-report生成类似于perf-stat的输出?

EN

回答 2

Stack Overflow用户

发布于 2012-12-30 07:29:30

我深入研究了kernel.org上的源代码,发现似乎无法让perf stat解析perf.data

http://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=blob;f=tools/perf/builtin-stat.c;h=c70d72003557f17f29345b0f219dc5ca9f572d75;hb=refs/heads/linux-2.6.33.y

如果你看一下第245行,你会看到函数"run_perf_stat“,308-320附近的行似乎是真正做记录和整理的。

我没有深入研究这一点,以确定是否有可能启用您想要的那种功能。

它看起来不像perf report有很多额外格式化功能。如果你喜欢,你可以在这里进一步查看:

http://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=blob;f=tools/perf/builtin-report.c;h=860f1eeeea7dbf8e43779308eaaffb1dbcf79d10;hb=refs/heads/linux-2.6.33.y

票数 4
EN

Stack Overflow用户

发布于 2020-06-30 05:39:44

perf stat不能用于解析perf.data文件,但您可以要求perf report使用perf report --header |egrep Event\|Samples打印带有事件计数估计的头部。只有记录到perf.data文件中的事件才会被估计。

perf stat在计数模式下使用hardware performance monitoring unit,而带有perf.data文件的perf record/perf report使用在定期溢出模式下配置的相同硬件单元(sampling profiling。在这两种模式下,hardware performance counters与它们的控制寄存器一起被设置为一组性能事件(例如,cpu周期或执行的指令),并且计数器将在每个事件上由硬件递增。

在计数模式下,perf stat使用在程序开始时初始设置为零的计数器,它们由硬件递增,perf将在程序退出时读取最终计数器值(实际上,计数将由操作系统以类似的最终结果分成几个段-整个程序运行的单个值)。

在分析模式下,perf record会将每个硬件计数器设置为某个负值,例如-200000和溢出处理程序将被注册并启用(实际值将由操作系统内核自动调整为某个频率)。每计数200000个事件,计数器就会从-1溢出到0,并生成溢出中断。perf_events中断处理程序会将"sample“(当前时间、pid、指令指针,在-g模式下可选的调用堆栈)记录到环形缓冲区(由perf进行mmaped),然后将数据保存到perf.data中。此处理程序还会再次将计数器重置为-200000。因此,在运行足够长的时间后,将有许多样本存储在perf.data中。这个样本集可以用来生成程序的统计配置文件(程序的哪些部分运行得更频繁)。但如果每个样本每200000个事件生成一次,我们也可以得到总事件的一些估计。由于内核的值自动调整(它试图以4000 Hz的频率生成样本)估计将更加困难,使用类似-c 1000000的东西来禁用采样周期的自动调整。

perf stat在默认模式下显示什么?对于一些x86_64处理器,我有:程序的运行时间(任务时钟和已用时间),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是什么?当硬件事件可用时,它是周期事件。在单次唤醒(环形缓冲区溢出)中,perf确实将1246个样本保存到perf.data中

代码语言: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.dataperf report可以估计更多事件

代码语言: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

可以使用固定周期,但如果-c选项的值太低,内核可能会限制某些事件(每秒生成样本的次数不应超过1000-4000次):

代码语言:javascript
复制
$ echo '3^123456%3' | perf record -e cycles,instructions,branches,branch-misses -c 1000000 bc
$ perf report --header |egrep Event\|Samples
[ perf record: Captured and wrote 0.118 MB perf.data (3029 samples) ]
# Samples: 823  of event 'cycles'
# Event count (approx.): 823000000
# Samples: 1K of event 'instructions'
# Event count (approx.): 1842000000
# Samples: 349  of event 'branches'
# Event count (approx.): 349000000
# Samples: 15  of event 'branch-misses'
# Event count (approx.): 15000000
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10321073

复制
相关文章

相似问题

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