Ir al contenido

Bytehound - Perfilador de memoria para Linux

Bytehound - Perfilador de memoria para Linux

Bytehound es un perfilador de memoria para Linux que rastrea cada asignación y desasignación en un programa y presenta los resultados en una UI web inusualmente buena. Más allá de encontrar leaks, muestra asignación churn a lo largo del tiempo, agrupa asignaciones por call stack, y te permite filtrar interactivamente — “muéstrame asignaciones mayores de 1MB que nunca fueron liberadas, desde este módulo.” Es una herramienta basada en Rust que funciona con cualquier programa nativo (C, C++, Rust) vía LD_PRELOAD.

Instalación

MétodoCómo
ReleaseDescargar bytehound + libbytehound.so desde GitHub Releases
Desde sourcecargo build --release en el repo
RequisitosLinux x86-64; programa con símbolos (-g)
Verificar./bytehound --version

Perfilando un programa

# Precargar el perfilador y ejecutar tu programa
LD_PRELOAD=./libbytehound.so ./my-program

# Esto produce memory-profiling_*.dat
VariablePropósito
LD_PRELOAD=./libbytehound.soInyectar hooks del allocator
MEMORY_PROFILER_OUTPUTRuta del archivo de salida
MEMORY_PROFILER_LOG=warnNivel de log
MEMORY_PROFILER_CULL_TEMPORARY_ALLOCATIONSReducir ruido de asignaciones corta-vida
MEMORY_PROFILER_DISABLE_BY_DEFAULTIniciar pausado, habilitar programáticamente

Viendo resultados

# Iniciar la UI web en los datos capturados
./bytehound server memory-profiling_*.dat
# → abrir http://localhost:8080
VistaMuestra
GrafosUso de memoria a lo largo del tiempo (activa, leaked, asignada)
AsignacionesCada asignación con stack, tamaño, duración de vida
Flame graphVolumen de asignación atribuido a call stacks
LeakedAsignaciones nunca liberadas
FiltradoConstructor de queries interactivo

El lenguaje de filtrado

La fortaleza de Bytehound está en segmentar los datos:

FiltroEncuentra
Solo leakedAsignaciones vivas al salir
Rango de tamañop.ej. > 1 MiB
Duración de vidaCorta-vida (churn) vs larga-vida
Backtrace contieneAsignaciones desde una función/módulo específico
Rango de tiempoAsignaciones durante una ventana
# Conceptual: asignaciones leaked mayores de 1MB del módulo parser
leaked AND size > 1048576 AND backtrace contains "parser::"

Qué buscar

SíntomaInvestigar
RSS crece sin límiteVista “Leaked” — asignaciones nunca liberadas
CPU alta en allocatorChurn de asignación temporal
Memory spike en un momentoFiltro de rango de tiempo alrededor del spike
Una función dominaFlame graph de asignación
FragmentaciónMuchas asignaciones pequeñas larga-vida

Scripting del análisis

Bytehound expone una API y CLI para automatización:

ComandoPropósito
bytehound server DATAUI interactiva
bytehound export-heaptrack DATAConvertir para tooling de heaptrack
REST APIConsultar asignaciones programáticamente
ScriptingAnálisis personalizados sobre el dataset

Reduciendo overhead

SettingEfecto
Cull asignaciones temporalesSalida mucho más pequeña, menos ruido
Deshabilitar por defecto + habilitar en códigoPerfilar solo la fase interesante
Ejecuciones más cortasLos archivos de datos crecen rápidamente

Bytehound vs otros perfiladores de memoria

AspectoBytehoundheaptrackValgrind massifjemalloc prof
OverheadBajoBajoMuy altoMuy bajo
UIRica UI webQt GUIText/visualizerText + tooling
FiltradoExcelenteBuenoLimitadoLimitado
SetupLD_PRELOADheaptrack ./progvalgrind --tool=massifConfiguración de allocator
Mejor paraExploración interactivaPerfilado rápido de heapCorrección profundaMuestreo en producción

Compara con heaptrack para un enfoque similar de bajo overhead con Qt UI; ambos vencen a Valgrind para workloads realistas.

Recursos