一尘不染

使用性能探针监视特定功能期间的性能统计信息

linux

我正在尝试使用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-通用]


阅读 234

收藏
2020-06-07

共1个答案

一尘不染

我认为您遵循的说明尚未包含在主线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用户邮件列表上询问是否有将切换功能集成到主线内核中的计划。

2020-06-07