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 -g -p PID(查看进程号是PID的进程的cpu占用信息,加-g参数可以打印详细堆栈信息)
即可以正常显示perf top如下:
第一列:符号引发的性能事件的比例,指占用的cpu周期比例。
第二列:符号所在的DSO(Dynamic Shared Object),可以是应用程序、内核、动态链接库、模块。
第三列:DSO的类型。[.]表示此符号属于用户态的ELF文件,包括可执行文件与动态链接库;[k]表述此符号属于内核或模块。
第四列:符号名。有些符号不能解析为函数名,只能用地址表示。
进入perf top后,需要查看堆栈信息,或选择指定进程等操作可输入?查看手册
perf不能查看java进程的信息
缺失Java函数信息的原因:
- JVM内部即时编译器JIT,不会公开传统的符号表供系统分析器读取
- JVM默认使用帧指针寄存器(x86-64上的RBP)作为通用寄存器,与传统的栈不同
为了使java进程可以用上perf,此时需要用到perf代理:perf-map-agent
- 确保JDK版本Java 8 update 60 build 19及以上,该版本添加了
-XX:+PreserveFramePointer
选项的支持 - 安装
perf-map-agent步骤
sudo bash
yum -y install cmake
export JAVA_HOME=/path-to-your-new-jdk8
cd /destination-for-perf-map-agent # I use /usr/lib/jvm
git clone --depth=1 https://github.com/jvm-profiling-tools/perf-map-agent
cd perf-map-agent
cmake .
make