如何启动和停止性能采样

Bra*_*ram 6 profiling perf

我正在使用 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
Run Code Online (Sandbox Code Playgroud)

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

$ perf record -g -e cycles --filter="start render_image" ./bench
--filter option should follow a -e tracepoint option
Run Code Online (Sandbox Code Playgroud)

我很困惑,因为过滤器标志确实遵循 -e 选项。这里发生了什么?

我也对 perf.data 的体积如此之小感到困惑,难道它真的只收集了 93 个样本吗?它运行了几秒钟。

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

更新:正如 Arnabjyoti Kalita 所解释的,有一类特殊的事件称为跟踪点。如果我以 root 身份运行 perf,它们只会出现在我的“perf 列表”中。

太糟糕了,只有当您跟踪该类型的事件而不是默认的 cpu 周期时,perf 似乎才能启动/停止收集。

Arn*_*ita 1

我建议开始阅读perf record过滤器选项的手册页。perf record --filter在手册页的帮助下浏览完选项后,我发现:-

--filter

事件过滤器。此选项应遵循事件选择器 ( -e),该选择器选择跟踪点事件或硬件跟踪 PMU(例如Intel PTCoreSight

基本上,只有当事件是跟踪点事件或硬件跟踪事件(如 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]
Run Code Online (Sandbox Code Playgroud)

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

kmem:kmalloc                             [Tracepoint event]
Run Code Online (Sandbox Code Playgroud)

可以perf.data根据许多参数收集数据包。已收集的样本是按特定频率/周期收集的。

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

是的,当您说这-e cycles是默认事件时,您是对的,即如果您没有指定任何事件并执行 a perf record, perf 默认情况下将仅收集周期事件。