代码之家  ›  专栏  ›  技术社区  ›  Sunimal Rathnayake

使用perfprobe监视特定函数期间的性能统计信息

  •  5
  • Sunimal Rathnayake  · 技术社区  · 12 年前

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

    1 回复  |  直到 12 年前
        1
  •  3
  •   Manuel Selva    12 年前

    我认为您所遵循的指令尚未包含在主线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 users mailing list 如果有计划将toggle特性集成到主线内核中。