我正在使用 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 似乎才能启动/停止收集。
我建议开始阅读perf record过滤器选项的手册页。perf record --filter在手册页的帮助下浏览完选项后,我发现:-
--filter事件过滤器。此选项应遵循事件选择器 (
-e),该选择器选择跟踪点事件或硬件跟踪 PMU(例如Intel PT或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]
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 默认情况下将仅收集周期事件。
| 归档时间: |
|
| 查看次数: |
6449 次 |
| 最近记录: |