如何启动和停止 perf 采样

How to start and stop perf sampling

我正在使用 perf.

对程序的性能进行采样

这对我有用:

$ perf record -g  ./bench
...
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.023 MB perf.data (93 samples) ]
$ ls -al perf.data
-rw------- 1 bram bram 26848 Oct 25 10:22 perf.data

但现在我想在程序的特定点开始和停止收集。但如果我这样做:

$ perf record -g -e cycles --filter="start render_image" ./bench
--filter option should follow a -e tracepoint option

我很难过,因为过滤器标志确实跟在 -e 选项之后。这是怎么回事?

我也很疑惑perf.data这么小,难道真的只采集了93个样本吗?它 运行 几秒钟。

最后,我假设“-e cycles”是默认事件?

更新:正如 Arnabjyoti Kalita 所解释的,有一类特殊的事件称为 Tracepoints。如果我 运行 以 root 身份运行,它们只会出现在 'perf list' 中。

太糟糕了 perf 似乎只能 start/stop 收集只有当你跟踪那种类型的事件时,而不是默认的 cpu 周期。

我建议开始阅读 perf record 手册页以了解过滤器选项。在手册页的帮助下完成 perf record --filter 选项后,我发现了这个 :-

--filter

Event filter. This option should follow a event selector (-e) which selects either tracepoint event(s) or a hardware trace PMU (e.g. Intel PT or CoreSight)

基本上只有当事件是跟踪点事件或硬件跟踪事件(如 IntelPT)时,过滤器选项才会起作用。因此,让我们检查一下 -e cycles 表示的事件是否是跟踪点事件。

如果我在我的系统中执行 perf list,我会得到以下详细信息-

~/linux-4.11.3/tools/perf/perf list
List of pre-defined events (to be used in -e):
cpu-cycles OR cycles                               [Hardware event]

显然 cycles 不是 tracepoint 事件。这是一个基本的 硬件事件 。跟踪点事件的示例可以是:

kmem:kmalloc                             [Tracepoint event]

perf.data可以根据很多参数收集数据包。已收集的样本已在特定 frequency/period 完成。

perf record -F,您可以使用它设置特定的 频率 来收集数据包。我建议通读 perf record 提供的所有选项。因此,收集到的样本数量较少可能是因为这个频率——也许你可以尝试增加频率,看看是否有一些改进。还有一个选项可以设置事件的时间段。请注意,您通常可以将此频率增加到一个限制 - 超过该限制,即使 CPU 也会开始出现自我管理问题(由于中断和所有...)。

是的,当你说 -e cycles 是默认事件时你是对的,即如果你没有指定任何事件并执行 perf record,perf 默认只会收集 周期 个事件。

由于手册页指定仅硬件 PMU 跟踪事件支持跟踪过滤,您需要使用 -e 指定这些事件之一才能正确过滤您的记录。

我使用的系统支持Intel PT:

perf list
  intel_pt//                                         [Kernel PMU event]

您可以在 this blog post 中看到一些将 perf 与 Intel PT 结合使用的示例。在我的例子中,以下命令对我有用:

perf record --call-graph lbr -g -e "intel_pt//" --filter "filter main @ $HOME/test" -- ./test
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.047 MB perf.data ]

请注意,根据您的内核 运行时间配置,您可能需要 运行 此命令作为 root。

您无法使用 cycles 事件进行过滤的原因是它包含在处理器特定区域的硬件计数器上,称为性能监控单元 (PMU)。此计数器在每个周期都会递增,因此您可以通过读取和减去值来猜测两个时间点之间经过了多少个周期。

另一方面,

Intel PT是一种硬件设施,专门用于收集执行过程中的控制流信息。这种信息可以让您知道您的程序是否在代码的特定部分(例如函数)中 运行ning。