将perf.data转换为文本或CSV

4
我正在使用"perf record"命令以1毫秒的采样率对硬件计数器进行取样。它会提供一个"perf.data"作为输出文件,但我不知道有什么工具/命令可以帮助我从"perf.data"二进制文件中读取计数器数据并转换为文本或CSV文件。简而言之,我需要从"perf.data"文件中每隔1毫秒读取硬件计数器事件数据。
更多细节:
  1. 我使用了'perf stat'命令以10ms的间隔获取硬件计数器事件数据,但它不允许在小于10ms的采样间隔下进行采样。因此,我使用'perf record'代替perf stat以1ms的采样间隔进行采样。以下是一些有用的链接,使我决定使用perf record: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 record生成的perf.data文件。

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

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

输出:

[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.017 MB perf.data (28 samples) ]

2) perf report -F sample,period --stdio

输出:

Total Lost Samples: 0
Samples: 9  of event 'LLC-stores'
Event count (approx.): 7440
     Samples        Period
............  ............
         9          7440

Samples: 9  of event 'LLC-loads'
Event count (approx.): 50008
     Samples        Period
............  ............
         9         50008

Samples: 10  of event 'cache-misses'
Event count (approx.): 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 report还是perf script,都提供了样本数量、周期和事件名称,但没有每个样本的事件计数。如果您能告诉我如何获取从perf record获得的每28个样本的事件计数,那将非常有帮助。


@jdv,我无法将此文件解析为csv或文本,因为我不知道/不知道任何将'perf.data'文件(二进制文件)转换为文本或csv的工具/命令。感谢您指出这一点。我会相应地编辑问题。 - onkar.omr
嗨@onkar.omr,你想要每个样本的事件计数还是总共的事件数量? - Arnabjyoti Kalita
@ArnabjyotiKalita,我想要每个样本的事件计数。 - onkar.omr
@onkar.omr,我添加了更多细节。如果这样可以满足您的要求,请告诉我。 - Arnabjyoti Kalita
@ArnabjyotiKalita,我按照你的建议得到了结果。谢谢!然而,许多PERF_RECORD_SAMPLE条目没有提到已记录哪个计数器(缓存未命中或参考周期)的实例/样本(一些样本显示特定计数器,但大多数样本在数据中没有计数器名称)。这是否意味着我必须为每个计数器每次都这样做?这将使我的工作变得困难、繁琐和耗时。除了perf之外,您能否提供任何其他方法/想法来获得每1ms的硬件计数器? - onkar.omr
显示剩余4条评论
1个回答

2
您应该使用perf record -e <event-name> ...来每1毫秒采样事件。看起来您正在尝试读取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进行评估。)
由于您想要每个采样中的事件数量,因此有几件事情需要注意。要计算每个采样的事件数,您需要知道采样周期。采样周期为您提供了性能计数器溢出并内核记录样本后的事件数。因此,在您的情况下, 采样周期=每个采样的事件数 现在有两种指定此采样周期的方法。要么您指定它,要么您不指定它。
如果在执行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记录。


正如我所说,您应该使用“perf report”命令来查看“perf.data”文件的可读格式。 - Arnabjyoti Kalita
谢谢!我已经根据您的评论和反馈编辑了问题。您能否请看一下修订后的问题。 - onkar.omr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接