perf.data to text或csv

时间:2018-05-03 20:12:53

标签: linux profiling performancecounter perf

我正在使用'perf record'命令在1 ms时对硬件计数器进行采样。它为我提供了一个'perf.data'作为输出文件,但我不知道任何工具/命令可以帮助我将'perf.data'二进制文件中的计数器数据读入文本或CSV文件。或者简单地说,我需要从'perf.data'文件每隔1ms读取硬件计数器事件数据。

更多细节:

1)我使用'perf stat'命令获取10ms的硬件计数器事件数据,但不允许以小于10ms的采样间隔进行采样。所以,我使用'perf record'代替perf stat在1ms采样。 一些有用的链接说服我使用perf记录: Perf Stat vs Perf RecordCollecting the data for a partiulcar process from PMU for every 1 milli second

2)我也试过'perf script'但它只提供支持一些硬件事件。例如:perf脚本不支持缓存事件。链接:Can't sample hardware cache events with linux perf

有人可以帮帮我吗?请假设我知道如何使用perf record命令并且已经有perf.data文件(从perf记录生成)

编辑:以下是使用答案反馈的终端上的命令及其输出消息:

1) perf record -e LLC-stores,LLC-loads,cache-missses -F 999 -R -T ls> ls.txt

输出

[性能记录:唤醒1次写入数据]

[perf记录:捕获并写入0.017 MB perf.data(28个样本)]

2) perf报告-F示例,期间--stdio

输出: 总丢失样本:0 样品:'LLC-stores'活动中的9个 活动计数(约):7440

  Samples        Period

............ ............

         9          7440

样品:事件'LLC-loads'中的9个  活动计数(约):50008

  Samples        Period

............ ............

         9         50008

示例:10个事件'缓存未命中'  活动计数(约):351826

  Samples        Period

............ ............

        10        351826

3) perf脚本-F期间,事件

输出:

     1   LLC-stores: 
     1    LLC-loads: 
     1 cache-misses: 
     1    LLC-loads: 
     1 cache-misses: 
    61    LLC-loads: 
    58 cache-misses: 
  3097 cache-misses: 
     1   LLC-stores: 
    13   LLC-stores: 
  4748    LLC-loads: 
  1390   LLC-stores: 
190186 cache-misses: 
     1   LLC-stores: 
     1    LLC-loads: 
     1 cache-misses: 
     1    LLC-loads: 
     1 cache-misses: 
     1   LLC-stores: 
    52 cache-misses: 
    50    LLC-loads: 
    20   LLC-stores: 
  4110 cache-misses: 
  2002    LLC-loads: 
   748   LLC-stores: 
154319 cache-misses: 
 43143    LLC-loads: 
  5265   LLC-stores: 

4) perf stat -I 1 -e LLC-stores,LLC-loads,cache-misses ls> ls.txt

输出:

       time             counts unit events
 0.006476856              1,115      LLC-stores                                                  
 0.006476856             13,121      LLC-loads                                                   
 0.006476856              9,371      cache-misses                                                

perf报告 perf脚本都提供了样本数,期间和事件名称,但没有提供每个样本的事件计数。如果您能告诉我如何获取从perf记录中获得的每28个样本的事件计数,那将非常有用。

1 个答案:

答案 0 :(得分:0)

您应该使用perf record -e <event-name> ...每1ms对事件进行一次采样。您似乎正在尝试阅读perf.data文件并将其组织为人类可读的数据。如果您不了解,请使用perf reportperf report命令读取perf.data文件并生成简明的执行配置文件。以下链接可以帮助您 -

Sample analysis with perf report

您可以根据需要修改perf report输出。您还可以使用perf report -F以csv格式指定多个列。

但是,此外,perf stat确实有一种使用perf stat -x命令以csv格式收集信息的机制。

编辑#1:

(我正在使用Linux-Kernel 4.14.3进行评估。)

由于您需要每个样本的事件数量,因此需要注意几点。要计算每个样本的事件数,您需要知道采样周期。采样周期为您提供事件数,在此之后性能计数器将溢出并且内核将记录样本。基本上,在你的情况下,

sampling period = number of events per sample

现在有两种方法可以指定此采样周期。您可以指定它,也可以不指定它。

如果在执行perf record时,您指定了采样周期......如下所示: -

perf record -e <some_event_name> -c 1000 ...

此处-c 1000表示采样周期为1000.在这种情况下,您故意强制系统每个样本记录1000个事件,因为采样周期由您确定。

另一方面,如果您未指定采样周期,系统将尝试以 1000个样本/秒的默认频率记录事件。这意味着如果需要,系统将自动改变采样周期,以保持1000个样本/秒的频率。在这种情况下,要确定采样周期,您需要观察perf.data文件。

具体来说,您需要使用以下命令打开perf.data文件:

perf script -D

输出看起来很像: -

0 0 0x108 [0x38]: PERF_RECORD_FORK(1:1):(0:0)

0x140 [0x30]: event: 3
.
. ... raw event: size 48 bytes
.  0000:  03 00 00 00 00 00 30 00 01 00 00 00 01 00 00 00  ......0.........
.  0010:  73 79 73 74 65 6d 64 00 00 00 00 00 00 00 00 00  systemd.........
.  0020:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

0 0 0x140 [0x30]: PERF_RECORD_COMM: systemd:1/1

0x170 [0x38]: event: 7
.
. ... raw event: size 56 bytes
.  0000:  07 00 00 00 00 00 38 00 02 00 00 00 00 00 00 00  ......8.........
.  0010:  02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
.  0020:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
.  0030:  00 00 00 00 00 00 00 00                          ........ 

您可以看到不同类型的记录,例如PERF_RECORD_FORKPERF_RECORD_COMM,甚至PERF_RECORD_MMAP。您需要专门查找文件中以 PERF_RECORD_SAMPLE 开头的记录。像这样:

14 173826354106096 0x10d40 [0x28]: PERF_RECORD_SAMPLE(IP, 0x1): 28179/28179: 0xffffffffa500d3b5 period: 3000 addr: 0
 ... thread: perf:28179
 ...... dso: [kernel.kallsyms]
            perf 28179 [014] 173826.354106: cache-misses:  ffffffffa500d3b5 [unknown] ([kernel.kallsyms])

正如您所看到的,在这种情况下,周期为3000,即在之前的采样事件和此采样事件之间收集的事件数量为3000.(即每个样本的事件数量为3000)请注意,如上所述期间可能会被调整。因此,您需要从perf.data文件中收集所有 PERF_RECORD_SAMPLE 记录。