1 回答
TA贡献1827条经验 获得超9个赞
您应该perf record -e <event-name> ...每隔1毫秒对事件进行一次采样。看来您正在尝试读取perf.data文件并将其组织为人类可读的数据。perf report如果您不知道,则应使用。该perf report命令读取perf.data文件并生成简明的执行配置文件。以下链接应为您提供帮助-
性能报告样本分析
您可以根据需要修改perf report输出。您也可以使用perf report -Fcsv格式指定多个列。
但是,此外,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_RECORD_SAMPLE记录perf.data。
- 1 回答
- 0 关注
- 753 浏览
添加回答
举报