使用perf探针监视特定function期间的性能状态

我试图在使用linux perf工具的特定function期间监视性能状态。

我按照https://perf.wiki.kernel.org/index.php/Jolsa_Features_Togle_Event#Example_-_using_u.28ret.29probs

我试图得到一个简单的C程序的指令计数。 (如下所示)

1)我简单的C代码

#include<stdio.h> int sum=0; int i=0; void func(void) { for(i=0;i<100;i++) { sum=sum+i; } } int main(void) { func(); return 0; } 

2)编译和添加探针

 root@sunimal-laptop:/home/sunimal/temp# gcc -o ex source.c root@sunimal-laptop:/home/sunimal/temp# perf probe -x ./ex entry=func Added new event: probe_ex:entry (on 0x4ed) You can now use it in all perf tools, such as: perf record -e probe_ex:entry -aR sleep 1 root@sunimal-laptop:/home/sunimal/temp# perf probe -x ./ex exit=func%return Added new event: probe_ex:exit (on 0x4ed%return) You can now use it in all perf tools, such as: perf record -e probe_ex:exit -aR sleep 1 

3)尝试使用perf stat来测量func()函数内的指令数量。 这导致错误。

 root@sunimal-laptop:/home/sunimal/temp# perf stat -e instructions:u,probe_ex:entry/on=instructions/,probe_ex:exit/off=instructions/ ./ex invalid or unsupported event: 'instructions:u,probe_ex:entry/on=instructions/,probe_ex:exit/off=instructions/' Run 'perf list' for a list of valid events 

有人能指出我做错了吗?

[我正在使用linux内核3.11.0-12-generic]

Solutions Collecting From Web of "使用perf探针监视特定function期间的性能状态"

我认为你所遵循的指令还没有包含在主线Linux内核中。 因此,perf会告诉你事件不被支持:perf不知道这个页面上提到的“切换”机制。

我可以看到两个解决方法:

  1. 如果您有权访问要配置的源代码,则可以直接使用源代码中的perf_event_open系统调用来启动和停止依靠函数进入和退出。
  2. 克隆jolsa仓库git clone https://kernel.googlesource.com/pub/scm/linux/kernel/git/jolsa/perf切换core_toggle分支git co remotes/origin/perf/core_toggle然后编译并运行这个内核支持。

关于2,我对内核版本和开发并不熟悉,我认为这个解决方案使用和维护可能会很复杂。 也许你应该在perf用户邮件列表上询问是否有任何将切换功能集成到mainline内核的计划。