Pular para o conteúdo

async-profiler - Profiler de Overhead Baixo para JVM

async-profiler - Profiler de Overhead Baixo para JVM

async-profiler é um profiler de amostragem de overhead baixo para a JVM. Profilers Java tradicionais amostring apenas em safepoints, o que enviesça resultados em relação a tudo que acontece sentir um safepoint e pode esconder o hot path real. async-profiler usa AsyncGetCallTrace mais eventos de perf para amostrar em qualquer lugar, incluindo código nativo e frames de kernel, dando um quadro muito mais honesto. Ele perfila CPU, alocações, contenção de lock, e mais, e exporta flame graphs ou JFR.

Instalação

MétodoComo
DownloadPegar o tarball de release para sua plataforma
Extracttar xzf async-profiler-*.tar.gz
Executar./bin/asprof <pid> (mais novo) ou ./profiler.sh <pid>
Permissõespode precisar sysctl kernel.perf_event_paranoid=1 e kernel.kptr_restrict=0
Verificar./bin/asprof --version

Profiling Básico

ComandoDescrição
asprof -d 30 -f out.html <pid>Perfil 30s → flame graph
asprof -e alloc -d 30 -f alloc.html <pid>Profiling de alocação
asprof -e lock -d 30 -f lock.html <pid>Contenção de lock
asprof -e wall -d 30 -f wall.html <pid>Wall-clock (inclui espera)
asprof start <pid> / asprof stop -f out.html <pid>Manual start/stop
jpsEncontrar o pid da JVM

Tipos de Evento

EventoMede
cpuTempo de CPU (padrão)
allocAlocações de heap por stack
lockContenção de lock/monitor
wallWall-clock incluindo tempo bloqueado
itimerFallback quando perf não está disponível
cache-misses, page-faultsEventos de perf de hardware/software
# Onde a app realmente gasta wall-clock time (incl. IO waits)?
./bin/asprof -e wall -t -d 30 -f wall.html <pid>

Formatos de Saída

FlagProduz
-f out.htmlFlame graph interativo
-o collapsedStacks dobrados (para ferramentas FlameGraph)
-o treeCall tree
-o flatLista flat de hot-method
-f out.jfrGravação JFR (abrir em JMC)
-tDividir por thread

Lançando Com o Agent

# Perfil do JVM startup (captura warmup)
java -agentpath:/path/libasyncProfiler.so=start,event=cpu,file=profile.html \
  -jar app.jar
Opção de agentPropósito
startComeçar imediatamente
event=cpu|alloc|lockO que amostrar
file=NAMECaminho de saída
interval=10msIntervalo de amostragem
jfrEmitir formato JFR

Lendo o Flame Graph

CaracterísticaSignificado
LarguraCompartilhamento de amostras (tempo) — mais largo é mais quente
AlturaProfundidade de stack, não custo
CoresJava (verde), nativo (amarelado), kernel (laranja)
ClickZoom em uma subárvore
SearchDestacar frames correspondentes

Procure por plataaus largos — um único frame consumindo um grande compartilhamento horizontal é seu hot spot. Frames mistos Java/nativo/kernel são exatamente o que profilers enviesados por safepoint ocultam.

Workflows Comuns

# 1) Hot spots de CPU em um serviço rodando
./bin/asprof -d 60 -f cpu.html $(jps | grep MyApp | cut -d' ' -f1)

# 2) Perseguindo pressão de GC — quem aloca mais?
./bin/asprof -e alloc -d 60 -f alloc.html <pid>

# 3) Threads parecem ociosas mas latência é alta → wall-clock
./bin/asprof -e wall -t -d 30 -f wall.html <pid>

# 4) Contenção em um recurso compartilhado
./bin/asprof -e lock -d 30 -f lock.html <pid>

async-profiler vs Alternativas

Aspectoasync-profilerJFRVisualVM
Viés de safepointEvitadoReduzidoPresente
Frames nativo/kernelSimLimitadoNão
OverheadMuito baixoBaixoMaior
Profiling de alocaçãoSimSimBásico
Melhor paraHot spots precisos de JVMGravação contínua integradaInspeção GUI rápida

O contraparte JVM para perf + FlameGraph para código nativo.

Recursos