mips架构下使用perf工具遇到的问题及解决方法

在做程序性能分析时,perf是必不可少的分析工具。它的最简单的使用方式为:

$ perf record -e task-clock ./a.out  //抓取热点数据 
$ perf report  //查看热点 

这样我们可以精确定位到热点方法,甚至可以进一步定位到热点指令。但是在mips架构的机器上使用perf的过程中,会或多或少存在一些问题,在此记录。

问题1:perf不显示so库方法名称(Symbol列 只能显示热点PC)

出现这种情况,perf report的结果是:


 Overhead  Command   Shared Object     Symbol                
# ........  ........  ................  ......................
#
    26.16%  volatile  volatile          [.] 0x0000000000000d04
     0.29%  volatile  ld-2.20.so        [.] 0x000000000000ebd4
     0.29%  volatile  libc-2.20.so      [.] 0x000000000011d140
     0.29%  volatile  libc-2.20.so      [.] 0x00000000001231f4

这时候Symbol列没有显示具体的方法名称而是PC值。这时请确保当前系统下是否缺少libelf.so,如果已经安装还要确保在/lib64目录下。

 # ls -lh /lib64/libelf*
lrwxrwxrwx 1 root root 43 12月 24 12:42 /lib64/libelf.so -> ./lib/loongarch64-linux-gnu/libelf-0.176.so
lrwxrwxrwx 1 root root 43 12月 24 12:46 /lib64/libelf.so.1 -> ./lib/loongarch64-linux-gnu/libelf-0.176.so

问题2:perf不显示内核方法名称(Symbol列 只能显示热点PC)

出现这种情况,perf report的结果是:

Overhead  Command          Shared Object         Symbol
  11.58%  VM Thread        [kernel.vmlinux]      [k] 0x000000fffa2ab528

[k]标识这个热点为内核方法。这时候Symbol列没有显示具体的方法名称而是PC值。首先尝试切换root权限后执行命令:

echo -1 > /proc/sys/kernel/perf_event_paranoid
echo 0 > /proc/sys/kernel/kptr_restrict

这样普通用户(无需sudo)就可以通过/proc/kallsyms来获取到内核Symbols信息。
如果还是不行,尝试使用sudo,但是这可能会导致perf统计数据完全不准确(在3A4000 MIPS平台发现使用sudo perf record导致结果完全不可信)。
最后方法就是尝试指定vmlinux位置perf report -k /boot/vmlinux 。不过大部分机器都使用的vmlinuz,而没有vmlinux。

问题3:perf不显示java方法名称(Symbol列 只能显示热点PC)

出现这种情况,perf report的结果是:

Overhead  Command          Shared Object         Symbol
  16.38%  java             perf-3383.map         [.] 0x00000000002ab524
  12.59%  java             perf-3383.map         [.] 0x00000000002ab528

首先安装perf-map-agent-master (否则perf report 时不能显示java代码的方法名,Symbol列 只能显示热点PC)

export JAVA_HOME=/home/loongson/sunguoyun/j2sdk-image
cmake .
make
sudo bin/create-links-in /usr/local/bin

这样再执行perf record时,辅助使用create-java-perf-map.sh会生成/tmp/perf-PID.map信息,从而辅助perf report时的java方法符号解析并显示方法名称。
create-java-perf-map.sh要求参数是PID。故对于运行时间比较短的java程序,可以使用下面脚本:

 #! /bin/bash                                                                                                                                                    
 java helloworld &    
 PID=$!                                                                          
 sudo perf record -e cycles -p $PID &                                            
 sudo perf-map-agent-master/bin/create-java-perf-map.sh $PID &       
 echo $PID 

备注: 尽管如此,perf report还是仅仅能显示java方法名,却无法查看Annotate。

问题4:perf annotate不支持时,如何定位热点?

目前la平台还不支持perf annotate,故无法查看到热点方法的汇编指令即热点位置。可以利用Symbol列显示的PC值来定位热点指令。

对于java程序,在perf record时通过java参数 -XX:+PrintAssembly 打印出java方法的opto汇编指令和其对应PC。
然后取消perf-map-agent-master的使用,这样perf report时Symbol显示的是PC值。通过这个PC值在上面的optp汇编中找到热点指令位置。

问题5:内核perf如何编译?

最新mips分支的4.19内核已经支持"perf annotate",但是源码没有,需要手动编译内核perf工具,使用命令为:

 $ make tools/perf

 编译过程可能需要安装一些包,否则编译出来的perf还是会出现无法显示Symbol的情况。具体要安装哪些包,可以参看编译过程出现的警告信息:

$ make tools/perf
...
Auto-detecting system features:
...                         dwarf: [ OFF ]
...            dwarf_getlocations: [ OFF ]
...                         glibc: [ on  ]
...                          gtk2: [ OFF ]
...                      libaudit: [ OFF ]
...                        libbfd: [ OFF ]
...                        libelf: [ OFF ]         -->必须安装 ,可以使用 sudo yum install -y elfutils-libelf-devel
...                       libnuma: [ OFF ]
...        numa_num_possible_cpus: [ OFF ]
...                       libperl: [ OFF ]
...                     libpython: [ OFF ]
...                      libslang: [ OFF ]
...                     libcrypto: [ on  ]
...                     libunwind: [ OFF ]
...            libdw-dwarf-unwind: [ OFF ]
...                          zlib: [ on  ]
...                          lzma: [ OFF ]
...                     get_cpuid: [ OFF ]
...                           bpf: [ OFF ]

Makefile.config:320: No libelf found. Disables 'probe' tool, jvmti and BPF support in 'perf record'. Please install libelf-dev, libelf-devel or elfutils-libelf-devel
Makefile.config:520: Disabling post unwind, no support found.
Makefile.config:573: No libaudit.h found, disables 'trace' tool, please install audit-libs-devel or libaudit-dev
Makefile.config:600: slang not found, disables TUI support. Please install slang-devel, libslang-dev or libslang2-dev
Makefile.config:614: GTK2 not found, disables GTK2 support. Please install gtk2-devel or libgtk2.0-dev
Makefile.config:641: Missing perl devel files. Disabling perl scripting support, please install perl-ExtUtils-Embed/libperl-dev
Makefile.config:673: No 'python-config' tool was found: disables Python support - please install python-devel/python-dev
Makefile.config:754: No liblzma found, disables xz kernel module decompression, please install xz-devel/liblzma-dev
Makefile.config:767: No numa.h found, disables 'perf bench numa mem' benchmark, please install numactl-devel/libnuma-devel/libnuma-dev
Makefile.config:818: No libbabeltrace found, disables 'perf data' CTF format support, please install libbabeltrace-dev[el]/libbabeltrace-ctf-dev

也可以使用 " perf -vv " 来查看当前perf都支持哪些功能。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海棠花败

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值