Ir al contenido

async-profiler - Perfilador JVM de Bajo Overhead Hoja de Trucos

async-profiler - Perfilador JVM de Bajo Overhead Hoja de Trucos

async-profiler es un perfilador de muestreo de bajo overhead para la JVM. Los perfiladores Java tradicionales muestrean solo en safepoints, lo que sesga resultados hacia cualquier código que suceda estar cerca de un safepoint y puede ocultar el camino caliente real. async-profiler usa AsyncGetCallTrace más eventos perf para muestrear en cualquier lugar, incluyendo código nativo y frames de kernel, dando una imagen mucho más honesta. Perfila CPU, asignaciones, contención de bloqueos y más, y exporta flame graphs o JFR.

Instalación

MétodoCómo
DescargarObtener el tarball de release para tu plataforma
Extraertar xzf async-profiler-*.tar.gz
Ejecutar./bin/asprof <pid> (más nuevo) o ./profiler.sh <pid>
Permisospuede necesitar sysctl kernel.perf_event_paranoid=1 y kernel.kptr_restrict=0
Verificar./bin/asprof --version

Perfilado Básico

ComandoDescripción
asprof -d 30 -f out.html <pid>Perfilar 30s → flame graph
asprof -e alloc -d 30 -f alloc.html <pid>Perfilado de asignación
asprof -e lock -d 30 -f lock.html <pid>Contención de bloqueo
asprof -e wall -d 30 -f wall.html <pid>Wall-clock (incluye espera)
asprof start <pid> / asprof stop -f out.html <pid>Inicio/parada manual
jpsEncontrar el pid de JVM

Tipos de Evento

EventoMide
cpuTiempo de CPU (predeterminado)
allocAsignaciones de heap por stack
lockContención de lock/monitor
wallWall-clock incluyendo tiempo bloqueado
itimerFallback cuando perf no disponible
cache-misses, page-faultsEventos perf de hardware/software
# ¿Dónde está la app realmente gastando tiempo de wall-clock (incl. waits de IO)?
./bin/asprof -e wall -t -d 30 -f wall.html <pid>

Formatos de Salida

FlagProduce
-f out.htmlFlame graph interactivo
-o collapsedStacks plegados (para herramientas FlameGraph)
-o treeÁrbol de llamadas
-o flatLista plana de métodos calientes
-f out.jfrGrabación JFR (abrir en JMC)
-tDividir por thread

Lanzar con el Agente

# Perfilar desde el inicio de JVM (captura warmup)
java -agentpath:/path/libasyncProfiler.so=start,event=cpu,file=profile.html \
  -jar app.jar
Opción del agentePropósito
startComenzar inmediatamente
event=cpu|alloc|lockQué muestrear
file=NAMERuta de salida
interval=10msIntervalo de muestreo
jfrEmitir formato JFR

Leyendo el Flame Graph

CaracterísticaSignificado
AnchoProporción de muestras (tiempo) — más ancho es más caliente
AltoProfundidad de stack, no costo
ColoresJava (verde), nativo (amarillento), kernel (naranja)
ClickZoom en un subárbol
BúsquedaDestacar frames coincidentes

Busca mesetas anchas — un único frame consumiendo una gran parte horizontal es tu punto caliente. Frames mixtos Java/nativo/kernel son exactamente lo que perfiladores sesgados por safepoint ocultan.

Flujos de Trabajo Comunes

# 1) Puntos calientes de CPU en un servicio ejecutándose
./bin/asprof -d 60 -f cpu.html $(jps | grep MyApp | cut -d' ' -f1)

# 2) Persiguiendo presión de GC — ¿quién asigna más?
./bin/asprof -e alloc -d 60 -f alloc.html <pid>

# 3) Threads se ven inactivos pero la latencia es alta → wall-clock
./bin/asprof -e wall -t -d 30 -f wall.html <pid>

# 4) Contención en un recurso compartido
./bin/asprof -e lock -d 30 -f lock.html <pid>

async-profiler vs Alternativas

Aspectoasync-profilerJFRVisualVM
Sesgo de safepointEvitadoReducidoPresente
Frames de nativo/kernelLimitadoNo
OverheadMuy bajoBajoMayor
Perfilado de asignaciónBásico
Mejor paraPuntos calientes JVM precisosGrabación continua integradaInspección GUI rápida

La contrapartida de JVM a perf + FlameGraph para código nativo.

Recursos