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étodo | Cómo |
|---|
| Release | Descargar bytehound + libbytehound.so desde GitHub Releases |
| Desde source | cargo build --release en el repo |
| Requisitos | Linux 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
| Variable | Propósito |
|---|
LD_PRELOAD=./libbytehound.so | Inyectar hooks del allocator |
MEMORY_PROFILER_OUTPUT | Ruta del archivo de salida |
MEMORY_PROFILER_LOG=warn | Nivel de log |
MEMORY_PROFILER_CULL_TEMPORARY_ALLOCATIONS | Reducir ruido de asignaciones corta-vida |
MEMORY_PROFILER_DISABLE_BY_DEFAULT | Iniciar pausado, habilitar programáticamente |
Viendo resultados
# Iniciar la UI web en los datos capturados
./bytehound server memory-profiling_*.dat
# → abrir http://localhost:8080
| Vista | Muestra |
|---|
| Grafos | Uso de memoria a lo largo del tiempo (activa, leaked, asignada) |
| Asignaciones | Cada asignación con stack, tamaño, duración de vida |
| Flame graph | Volumen de asignación atribuido a call stacks |
| Leaked | Asignaciones nunca liberadas |
| Filtrado | Constructor de queries interactivo |
El lenguaje de filtrado
La fortaleza de Bytehound está en segmentar los datos:
| Filtro | Encuentra |
|---|
| Solo leaked | Asignaciones vivas al salir |
| Rango de tamaño | p.ej. > 1 MiB |
| Duración de vida | Corta-vida (churn) vs larga-vida |
| Backtrace contiene | Asignaciones desde una función/módulo específico |
| Rango de tiempo | Asignaciones durante una ventana |
# Conceptual: asignaciones leaked mayores de 1MB del módulo parser
leaked AND size > 1048576 AND backtrace contains "parser::"
Qué buscar
| Síntoma | Investigar |
|---|
| RSS crece sin límite | Vista “Leaked” — asignaciones nunca liberadas |
| CPU alta en allocator | Churn de asignación temporal |
| Memory spike en un momento | Filtro de rango de tiempo alrededor del spike |
| Una función domina | Flame graph de asignación |
| Fragmentación | Muchas asignaciones pequeñas larga-vida |
Scripting del análisis
Bytehound expone una API y CLI para automatización:
| Comando | Propósito |
|---|
bytehound server DATA | UI interactiva |
bytehound export-heaptrack DATA | Convertir para tooling de heaptrack |
| REST API | Consultar asignaciones programáticamente |
| Scripting | Análisis personalizados sobre el dataset |
Reduciendo overhead
| Setting | Efecto |
|---|
| Cull asignaciones temporales | Salida mucho más pequeña, menos ruido |
| Deshabilitar por defecto + habilitar en código | Perfilar solo la fase interesante |
| Ejecuciones más cortas | Los archivos de datos crecen rápidamente |
Bytehound vs otros perfiladores de memoria
| Aspecto | Bytehound | heaptrack | Valgrind massif | jemalloc prof |
|---|
| Overhead | Bajo | Bajo | Muy alto | Muy bajo |
| UI | Rica UI web | Qt GUI | Text/visualizer | Text + tooling |
| Filtrado | Excelente | Bueno | Limitado | Limitado |
| Setup | LD_PRELOAD | heaptrack ./prog | valgrind --tool=massif | Configuración de allocator |
| Mejor para | Exploración interactiva | Perfilado rápido de heap | Corrección profunda | Muestreo en producción |
Compara con heaptrack para un enfoque similar de bajo overhead con Qt UI; ambos vencen a Valgrind para workloads realistas.
Recursos