理解Perf工具输出

我最近在我的平台上安装了Perf工具,并想用它来分析我的平台。 我开始分析一个独立的应用程序。我使用了下面的命令

perf启动./helloworld

“./helloworld”的性能计数器统计信息:

4.555957 task-clock # 0.000 CPUs utilized 1 context-switches # 0.219 K/sec 0 cpu-migrations # 0.000 K/sec 124 page-faults # 0.027 M/sec <not supported> cycles <not supported> stalled-cycles-frontend <not supported> stalled-cycles-backend <not supported> instructions <not supported> branches <not supported> branch-misses 60.005519331 seconds time elapsed 

现在我不知道该如何解释这个输出。

另外,我应该在这里提交<不支持>,在运行命令之前是否需要启用以支持此字段?

这些行表明你正在运行的内核缺少对perf所需的特定功能的支持,以便对你程序的这些方面进行分析。 由于perf的大部分位于内核空间中,因此您需要确保您的内核支持您所需的功能。

编辑:

当在内核中启用这些功能时,这取决于。 除非这些组件已被编译为内核模块,否则您需要自己编译它们。 如果他们被编译为模块,你可以modprobe它们。 尝试:

 find /lib/modules/`uname -r` -regex .*perf.* 

如果出现列表,请尝试对每个模块名称进行modprobe 。 否则,你需要自己编译模块或者自己编译整个内核。

在dmesg输出中搜索“Performance Events”。 它可能被禁用。

例如,在我的机器上,我有这个>>

 Performance Events: SandyBridge events, Intel PMU driver. PEBS disabled due to CPU errata. CPUID marked event: 'cpu cycles' unavailable CPUID marked event: 'instructions' unavailable CPUID marked event: 'bus cycles' unavailable CPUID marked event: 'cache references' unavailable CPUID marked event: 'cache misses' unavailable CPUID marked event: 'branch instructions' unavailable CPUID marked event: 'branch misses' unavailable 

即使内核启用了perf模块,内核不支持perf也是“不支持”的。 或者硬件没有像一些虚拟硬件那样的性能计数器? 如果没有内核支持perf,你可能会看到“不算”

这取决于你想要的资料。 Perf没有提供最终答案,告诉你程序有多快。 如果你想衡量表现,你必须知道在哪里看。 对于这些行说,尝试手动给他们-e标志。 如perf perf -e cycles ./helloworld