perf

 perf top

        perf top无法显示信息的,需要sudo perf top或者echo -1 > /proc/sys/kernel/perf_event_paranoid(在Ubuntu16.04,还需要echo 0 > /proc/sys/kernel/kptr_restrict)。

  • 即可以正常显示perf top如下:
  1. 第一列:符号引发的性能事件的比例,指占用的cpu周期比例。
  2. 第二列:符号所在的DSO(Dynamic Shared Object),可以是应用程序、内核、动态链接库、模块。
  3. 第三列:DSO的类型。[.]表示此符号属于用户态的ELF文件,包括可执行文件与动态链接库;[k]表述此符号属于内核或模块。
  4. 第四列:符号名。有些符号不能解析为函数名,只能用地址表示。
  5. 通过perf top命令查找热点函数。 

    该命令统计各个函数在某个性能事件上的热度,默认显示CPU占用率,可以通过“-e”监控其它事件。

    • Overhead表示当前事件在全部事件中占的比例。
    • Shared Object表示当前事件生产者,如kernel、perf命令、C语言库函数等。
    • Symbol则表示热点事件对应的函数名称。

    通过热点函数,我们可以找到消耗资源较多的行为,从而有针对性的进行优化。

 

 

perf record

  • 运行一个命令,并将其数据保存到perf.data中。随后,可以使用perf report进行分析。
  • perf record和perf report可以更精确的分析一个应用,perf record可以精确到函数级别。并且在函数里面混合显示汇编语言和代码。
  • 创建一个fork.c文件用于测试:
  • 编译fork.c文件gcc fork.c -o fork-g -O0,同时可以使用此方法分析是否选择编译优化产生的结果。-g是只能callgraph功能,-O0是关闭优化。

常用选项

-e record指定PMU事件
--filter event事件过滤器
-a 录取所有CPU的事件
-p 录取指定pid进程的事件
-o 指定录取保存数据的文件名
-g 使能函数调用图功能
-C 录取指定CPU的事件
  • sudo perf record -a -g ./fork:会在当前目录生成perf.data文件。
  • sudo perf report --call-graph none结果如下,后面结合perf timechart分析.

 

 

 

 

perf report

  • 解析perf record产生的数据,并给出分析结果。

常用参数:

-i 导入的数据文件名称,如果没有则默认为perf.data
-g 生成函数调用关系图,此时内核要打开CONFIG_KALLSYMS;用户空间库或者执行文件需要带符号信息(not stripped),编译选项需要加上-g。
--sort 从更高层面显示分类统计信息,比如: pid, comm, dso, symbol, parent, cpu,socket, srcline, weight, local_weight.
  • 执行sudo perf report -i perf.data,可以看出main函数所占百分比,以及funcA和funcB分别所占百分比。
  • 在funcB执行过程中,还产生了apic timer,占用了一部分cpu资源。除此之外,占比基本上是1:10。

 

  • 根据之上描述,可以看出top适合监控整个系统的性能,stat比较适合单个程序的性能分析,record/report更适合对程序进行更细粒度的分析。

注意点:

  • 在使用perf report -g的时候,可能会提示Failed to open /lib/libpthread-0.9.33.2.so, continuing without symbols。
  • 这时候通过file xxx查看,如果提示xxxx stripped表示此文件不包含符号信息,需要xxxx not stripped文件。
 
posted @ 2022-07-22 12:01  滴滴滴  阅读(630)  评论(0编辑  收藏  举报