为了账号安全,请及时绑定邮箱和手机立即绑定

perf.data转换为文本或csv

perf.data转换为文本或csv

泛舟湖上清波郎朗 2021-04-07 13:10:56
我正在使用“ perf record”命令在1毫秒内对硬件计数器进行采样。它为我提供了一个“ perf.data”作为输出文件,但是我不知道有什么工具/命令可以帮助我将“ perf.data”二进制文件中的计数器数据读取为文本或CSV文件。或者简单地说,我需要每隔1毫秒从“ perf.data”文件中读取硬件计数器事件数据。更多详细信息:我已经使用“ perf stat”命令在10ms处获取硬件计数器事件数据,但是它不允许以小于10ms的采样间隔进行采样。因此,我使用“性能记录”而不是性能统计来进行1ms采样。一些有用的链接使我诱使我使用性能记录: Perf Stat vs Perf Record,并 每1毫秒从PMU收集一个partiulcar进程的数据我也尝试过“性能脚本”,但它仅提供对某些硬件事件的支持。例如:perf脚本不支持缓存事件。链接:无法使用linux perf采样硬件缓存事件有人可以帮我吗?请假设我知道如何使用perf record命令,并且已经有perf.data文件(从perf record生成)
查看完整描述

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。


查看完整回答
反对 回复 2021-04-16
  • 1 回答
  • 0 关注
  • 753 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信