環境
- Vagrant 2.2.16
- Ubuntu 18.04
- OpenJDK 11
- https://github.com/jvm-profiling-tools/perf-map-agent
- https://github.com/brendangregg/FlameGraph
Linux 環境準備
Vagrant を使って環境を作る。bento/ubuntu-18.04 を使うことにする。Linux perf tools が必要。
Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.box = "bento/ubuntu-18.04"
config.vm.synced_folder "./data", "/vagrant_data",create:true
config.vm.provider "virtualbox" do |vb|
vb.memory = "1536"
end
config.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get upgrade -y
apt-get install -y build-essential cmake openjdk-11-jdk maven default-jdk linux-tools-$(uname -r) linux-tools-generic apache2-utils
SHELL
end
ツールの準備
環境変数 FLAMEGRAPH_DIR
で perf-map-agent から FlameGraph を使えるようにする。
git clone --depth 1 https://github.com/jvm-profiling-tools/perf-map-agent.git
git clone --depth 1 https://github.com/brendangregg/FlameGraph.git
cd perf-map-agent
cmake .
make
プロファイリング対象になる JVM の実行時オプションに -XX:+PreserveFramePointer
を追加する必要がある。
perf top
CPU 時間を使っている関数、Java メソッドが見える。root ユーザーで実行する。
`perf-java-top <PID>`
出力例
34.28% [kernel] [k] finish_task_switch
1.26% [kernel] [k] _raw_spin_unlock_irqrestore
0.44% [kernel] [k] do_syscall_64
0.43% perf-5228.map [.] Lorg/glassfish/json/JsonGeneratorImpl;::writeEscapedString
0.39% perf-5228.map [.] Lcom/ibm/ws/tcpchannel/internal/ChannelSelector;::run
0.38% perf-5228.map [.] Interpreter
0.35% libjvm.so [.] 0x00000000009b7238
0.34% perf-5228.map [.] Lorg/apache/cxf/jaxrs/utils/JAXRSUtils$3;::run
0.31% perf-5228.map [.] Lorg/jboss/weld/manager/BeanManagerImpl;::getReference
Flame Graph
Flame Graph を出力する。root ユーザーで実行する。環境変数 FLAMEGRAPH_DIR
で FlameGraph のインストールパスを指定する。デフォルトでは 15 秒のみプロファイリングを行うが、環境変数 PERF_RECORD_SECONDS
で時間を変更可能。
export FLAMEGRAPH_DIR="/home/vagrant/github/FlameGraph"
./perf-java-flames <PID>