我正在用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,它们只会出现在'perf list'中。
如果跟踪那种类型的事件而不是默认的cpu周期,那么看起来太糟糕了,似乎能够启动/停止收集。
答案 0 :(得分:2)
我建议您开始阅读perf record
手册页以了解过滤器选项。在人工页面的帮助下我完成了perf record --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]
显然,周期不是"跟踪点事件"。这是一个基本的硬件事件。跟踪点事件的示例可以是:
kmem:kmalloc [Tracepoint event]
perf.data
可以根据许多参数收集数据包。已经收集的样本已经在特定频率/周期完成。
使用perf record -F
可以设置特定的频率来收集数据包。我建议阅读perf record
提供的所有选项。因此,收集的样本数量较少可归因于此频率 - 也许您可以尝试增加频率并查看是否有一些改进。还可以选择设置事件的时间段。请注意,通常存在一个限制,您可以增加此频率 - 甚至CPU也会开始自我管理(由于中断和所有......)。
是的,当你说-e cycles
是默认事件时,你是对的,即如果你没有指定任何事件并执行perf record
,那么默认情况下只会收集周期事件。
答案 1 :(得分:2)
由于手册页指定仅硬件PMU跟踪事件支持跟踪过滤,因此您需要使用-e
指定这些事件之一,以便能够正确过滤记录。
我使用的系统支持Intel PT:
perf list
intel_pt// [Kernel PMU event]
您可以在this blog post中看到一些在Intel PT中使用perf的示例。就我而言,以下命令对我有用:
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是专门设计用于在执行期间收集控制流信息的硬件工具。这种信息可以让您知道程序是否在代码的特定部分(例如函数)中运行。