PERF_RECORD_SAMPLE 中的不同字段是什么意思?

What do the different fields in PERF_RECORD_SAMPLE mean?

我正在尝试了解 perf 如何在运行 Debian Wheezy 的基于 ARM 的物联网设备上收集事件样本。现在,我正在查看页面错误事件,并记录每个示例的数据。

我正在使用 -c 1 收集性能样本。典型的 PERF_RECORD_SAMPLE 数据如下所示。

2138094219370 0x15a8 [0x48]: PERF_RECORD_SAMPLE(IP, 2): 2408/2408: 0xb6f93820 period: 1 addr: 0xb6f93820

我找到了解释大多数字段含义的文档和来源,但我无法找出前两个字段的含义。我本质上是在寻找任何能够提供有关收集此样本时应用程序状态的更多信息的信息,例如收集样本时经过了多少时间(或时钟周期),我想知道这些字段是否提供了任何相关信息。

如有任何帮助,我们将不胜感激。

第一个字段是事件的时间戳,表示系统运行时间,单位纳秒。您可以减去两个连续样本的时间戳以了解它们之间经过了多少时间。对于您显示的示例,时间戳为 2138094219370。

第二个字段是样本记录在存储样本的文件中的偏移量。

为了完整起见,以下是其余字段的含义:

  • 0x48 是样本记录的字节大小。
  • PERF_RECORD_SAMPLE是样本的类型。
  • IP表示采样时包含指令指针。
  • 2表示样本是在用户模式下获取的。
  • 2408/2408 分别是进程和线程 ID。
  • 0xb6f93820 是 IP。
  • "period: 1"为采样周期。我不确定周期的单位是什么。
  • "addr: 0xb6f93820" 与此特定示例的 IP 相同(因为它仅包括如上所述的 IP)。 addr 可能包含其他信息,具体取决于样本。我想这也取决于你用来打印样本的工具。

我已经通过查看代码解决了所有这些问题:

  • 打印时间戳here
  • 打印接下来的几个字段 here
  • 打印其余字段here

之后,可以在 dump_sample 函数中打印其他信息,具体取决于示例中还有什么。