perf-map-agent 使用步骤
使用 asyncProfiler 能捕获 Java 的栈, 使用 perf 能捕获操作系统栈, 由于 JVM 使用自己单独的虚拟机, 所以不能同时访问 2 部分栈. Netflix 的教程(https://netflixtechblog.com/java-in-flames-e763b3d32166), 能捕获 2 个在一起的栈. 需要做 2 件事情:
- 对 Java 进程添加 -XX:+PreserveFramePointer flag
- 生成 Java 进程的 符号表文件. 下面就是关于如何产生符号表文件的教程.
下面是详细教程:
clone 或者下载最新版本 https://github.com/jvm-profiling-tools/perf-map-agent
curl -vvv 'https://github.com/jvm-profiling-tools/perf-map-agent/archive/refs/heads/master.zip' --output perf-map-agent.zip # or git clone https://github.com/jvm-profiling-tools/perf-map-agent.git
设置 JAVA_HOME 环境变量
export JAVA_HOME=/home/supra/work/tools/ebayjdk/jdk11/jdk
编译
cmake . make
产生 perf-<pid>.map
./bin/create-java-perf-map.sh $(pgrep java) # 到 /tmp 目录查看对应的 perf-<pid>.map 是不是存在了
更多实用工具在 bin 目录
可能遇到问题:
如果遇到下面:
-- The C compiler identification is GNU 7.5.0 -- The CXX compiler identification is unknown -- Check for working C compiler: /usr/bin/cc -- Check for working C compiler: /usr/bin/cc -- broken CMake Error at /usr/share/cmake-3.10/Modules/CMakeTestCCompiler.cmake:52 (message): The C compiler "/usr/bin/cc" is not able to compile a simple test program. It fails with the following output:
则安装编译工具
sudo apt-get cmake sudo apt-get install build-essential
如果遇到下面:
Sorry, user xxx is not allowed to execute '/yyyy/bin/java -cp /home/xxx/perf-map-agent-master/bin/../out/attach-main.jar:/yyyy/lib/tools.jar net.virtualvoid.perf.AttachOnce 23545 ' as xxx on hostzzzz.txh.com.
那么我们可以到 perf-map-agent-master/out/ 目录下去执行这个命令就好了, 不是执行 create-java-perf-map.sh.
- 关于要如何使用 root 的, 查看 Netflix 的那个文档
- 创建 perf-<pid>.map 要使用 java 应用启动相同的用户名, 因为 java 应用的 agent 要使用同样的用户才能访问对应的 java 程序.