我正在使用'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 Record和 Collecting 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记录:捕获并写入0.017 MB perf.data(28个样本)]
输出: 总丢失样本:0 样品:'LLC-stores'活动中的9个 活动计数(约):7440
Samples Period
............ ............
9 7440
样品:事件'LLC-loads'中的9个 活动计数(约):50008
Samples Period
............ ............
9 50008
示例:10个事件'缓存未命中' 活动计数(约):351826
Samples Period
............ ............
10 351826
输出:
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:
输出:
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个样本的事件计数,那将非常有用。
答案 0 :(得分:0)
您应该使用perf record -e <event-name> ...
每1ms对事件进行一次采样。您似乎正在尝试阅读perf.data
文件并将其组织为人类可读的数据。如果您不了解,请使用perf report
。 perf 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_FORK
和PERF_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 记录。