我尝试使用linux perf工具监控特定功能期间的性能统计数据。
我按照https://perf.wiki.kernel.org/index.php/Jolsa_Features_Togle_Event#Example_-_using_u.28ret.29probes
上的说明进行操作我试图获得一个简单的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]
答案 0 :(得分:3)
我认为您所遵循的说明尚未包含在主线Linux内核中。因此,perf告诉您事件不受支持:perf不知道此页面上提到的“切换”机制。
我可以看到两个解决方法:
git clone https://kernel.googlesource.com/pub/scm/linux/kernel/git/jolsa/perf
切换core_toggle分支git co remotes/origin/perf/core_toggle
,然后使用此支持编译并运行内核。关于2,我对内核版本和开发并不熟悉,我认为这个解决方案使用和维护可能很复杂。也许您应该在perf users mailing list询问是否有任何计划将切换功能集成到主线内核中。