Salta ai contenuti

async-profiler - Cheatsheet del Profiler JVM a Basso Overhead

async-profiler - Cheatsheet del Profiler JVM a Basso Overhead

async-profiler è un profiler di sampling a basso overhead per la JVM. I profiler Java tradizionali campionano solo ai safepoint, il che distorce i risultati verso il codice che capita di stare vicino a un safepoint e può nascondere il vero percorso caldo. async-profiler usa AsyncGetCallTrace più perf events per campionare ovunque, incluso codice nativo e frame kernel, fornendo un quadro molto più onesto. Profila CPU, allocazioni, contesa di blocco e altro, ed esporta flame graph o JFR.

Installation

MethodHow
DownloadOttieni il tarball di rilascio per la tua piattaforma
Extracttar xzf async-profiler-*.tar.gz
Run./bin/asprof <pid> (più nuovo) o ./profiler.sh <pid>
Permissionspotrebbe essere necessario sysctl kernel.perf_event_paranoid=1 e kernel.kptr_restrict=0
Verify./bin/asprof --version

Basic Profiling

CommandDescription
asprof -d 30 -f out.html <pid>Profila 30s → flame graph
asprof -e alloc -d 30 -f alloc.html <pid>Profiling di allocazione
asprof -e lock -d 30 -f lock.html <pid>Contesa di blocco
asprof -e wall -d 30 -f wall.html <pid>Wall-clock (include tempo di attesa)
asprof start <pid> / asprof stop -f out.html <pid>Start/stop manuale
jpsTrova il pid della JVM

Event Types

EventMeasures
cpuTempo CPU (predefinito)
allocAllocazioni heap per stack
lockContesa di blocco/monitor
wallWall-clock incluso tempo bloccato
itimerFallback quando perf non è disponibile
cache-misses, page-faultsPerf events hardware/software
# Where is the app actually spending wall-clock time (incl. IO waits)?
./bin/asprof -e wall -t -d 30 -f wall.html <pid>

Output Formats

FlagProduces
-f out.htmlFlame graph interattivo
-o collapsedStack piegati (per tooling FlameGraph)
-o treeAlbero di chiamate
-o flatElenco piatto di hot-method
-f out.jfrRegistrazione JFR (apri in JMC)
-tDividi per thread

Launching With the Agent

# Profile from JVM startup (captures warmup)
java -agentpath:/path/libasyncProfiler.so=start,event=cpu,file=profile.html \
  -jar app.jar
Agent optionPurpose
startInizia immediatamente
event=cpu|alloc|lockCosa campionare
file=NAMEPercorso di output
interval=10msIntervallo di campionamento
jfrEmetti formato JFR

Reading the Flame Graph

FeatureMeaning
WidthQuota di campioni (tempo) — più largo è più caldo
HeightProfondità dello stack, non costo
ColorsJava (verde), nativo (giallo-ish), kernel (arancione)
ClickZoom in un sottoalbero
SearchEvidenzia frame corrispondenti

Cerca altipiani larghi — un singolo frame che consuma una grande quota orizzontale è il tuo hot spot. Frame misti Java/nativo/kernel sono esattamente ciò che i profiler distorsioni da safepoint nascondono.

Common Workflows

# 1) CPU hotspots in a running service
./bin/asprof -d 60 -f cpu.html $(jps | grep MyApp | cut -d' ' -f1)

# 2) Chasing GC pressure — who allocates most?
./bin/asprof -e alloc -d 60 -f alloc.html <pid>

# 3) Threads look idle but latency is high → wall-clock
./bin/asprof -e wall -t -d 30 -f wall.html <pid>

# 4) Contention on a shared resource
./bin/asprof -e lock -d 30 -f lock.html <pid>

async-profiler vs Alternatives

Aspectasync-profilerJFRVisualVM
Safepoint biasEvitatoRidottoPresente
Native/kernel framesLimitatoNo
OverheadMolto bassoBassoPiù alto
Allocation profilingDi base
Best forHotspot JVM accuratiRegistrazione continua integrataIspezione rapida GUI

L”omologo JVM di perf + FlameGraph per codice nativo.

Resources