Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Next »

Install

(For Java11at least version 1.5 is needed) Download Async Profiler from: https://github.com/jvm-profiling-tools/async-profiler

wget https://github.com/jvm-profiling-tools/async-profiler/releases/download/v1.7.1/async-profiler-1.7.1-linux-x64.tar.gz
mkdir /opt/async-profiler
tar xvzf async-profiler-*-linux-x64.tar.gz -C /opt/async-profiler

 Since Kernel 4.6 the following commands must be executed as root on the system to enable profiling

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

Usage


Find the HiveMQ process id (must be user root or user hivemq)

#Java Process ID Tool
jps

#or

#ps with filter for only pid and only processes by user hivemq
ps -u hivemq -o pid=

#or

#always works
ps aux | grep hivemq


Run profiler.sh (-d is the duration of the recording in seconds)

/opt/async-profiler/profiler.sh -d 600 -f /(absolute path)/flamegraph.svg <hivemq process id>

Quick command (can be run as root, only works if hivemq is the only process running for user `hivemq`)

/opt/async-profiler/profiler.sh -d 600 -f /opt/hivemq/flamegraph.svg `ps -u hivemq -o pid=`

Kubernetes / Docker

As usual, container platforms have some paranoid settings that are read-only. On the up side, we can leverage the fact that HiveMQ is always PID 1 in containers (unless shared namespaces are used in K8s):

Here's an idempotent block you can simply execute to generate a flamegraph in a container:

curl -L https://github.com/jvm-profiling-tools/async-profiler/releases/download/v1.7.1/async-profiler-1.7.1-linux-x64.tar.gz > async.tar.gz
tar xfvz async.tar.gz
rm -f flame.svg
./profiler.sh -d 60 -f $(pwd)/flame.svg 1 --all-user -e alloc

Then use kubectl cp or docker cp to copy the graph from the container.

systemd

Alternative: When using systemd, you can simply use 

systemctl show --property MainPID hivemq | sed -e "s/MainPID=//"

Using async profiler in the systemd unit (start with HiveMQ):

sed -i -e "s|-Djava.net.preferIPv4Stack=true|-Djava.net.preferIPv4Stack=true -agentpath:/opt/async-profiler/build/libasyncProfiler.so=start,svg,file=flamegraph.svg|" /opt/hivemq/bin/run.sh
  • No labels