perf.data 到文本或 csv

Posted

技术标签:

【中文标题】perf.data 到文本或 csv【英文标题】:perf.data to text or csv 【发布时间】:2018-05-03 20:12:53 【问题描述】:

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

更多细节:

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

    我也尝试过“性能脚本”,但它只支持一些硬件事件。例如:perf 脚本不支持缓存事件。链接:Can't sample hardware cache events with linux perf

谁能帮我解决这个问题,好吗?请假设我知道如何使用 perf record 命令并且已经有了 perf.data 文件(从 perf record 生成)

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

1) 性能记录 -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) 性能报告 -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 script -F period,event

输出:

     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 个样本的事件计数,那将非常有帮助。

【问题讨论】:

“我无法将此文件解析为文本或 CSV”,“我需要每 1 毫秒读取一次硬件计数器事件数据,但我无法从 'perf.data 'file" 分享为什么会这样。 @jdv,我无法将此文件解析为 csv 或文本,因为我不知道/我不知道任何转换“perf.data”文件的工具/命令(a二进制文件)到文本或 csv。谢谢你指出。我将相应地编辑问题。 所以,这更像是对 perf.data 文件格式的查询?如果是这样,那么您最好的选择是研究这种格式以及可用于读取和访问该数据的许多工具。像“perf perf.data format”这样的网络搜索应该可以帮助您入门。不幸的是,这可能与该站点无关,除非您需要有关为解决此问题而编写的特定脚本或程序的帮助。在unix.stackexchange.com 或serverfault.com 上进行研究可能会获得更好的结果 嗨@onkar.omr 你想要每个样本的事件计数吗?还是事件总数? @ArnabjyotiKalita,我想要每个样本的事件计数。 【参考方案1】:

您应该使用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 进行评估。)

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

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 记录。

【讨论】:

正如我所说,您应该使用perf report 命令查看perf.data 文件的可读格式。 谢谢!我已经用你的 cmets 和反馈编辑了这个问题。你能看看修改后的问题吗。

以上是关于perf.data 到文本或 csv的主要内容,如果未能解决你的问题,请参考以下文章