Ir al contenido

DHAT - Herramienta de análisis dinámico de heap

DHAT - Herramienta de análisis dinámico de heap

DHAT (Dynamic Heap Analysis Tool) es una herramienta de Valgrind que responde una pregunta diferente que la mayoría de perfiladores de memoria. En lugar de solo “cuánta memoria asignaste,” reporta cómo esa memoria fue realmente usada: bloques asignados pero nunca leídos, bloques escritos una vez y nunca tocados después, asignaciones muy corta-vida, y asignaciones mucho más grandes que los bytes realmente accedidos. Esa vista de uso frecuentemente revela desperdicio que los perfiladores solo de tamaño no pueden ver.

Instalación

PlataformaComando
Debian/Ubuntusudo apt install valgrind
Fedora/RHELsudo dnf install valgrind
Arch Linuxsudo pacman -S valgrind
macOSsoporte limitado; prefiere Linux
Verificarvalgrind --tool=dhat --version

Compilar tu programa con -g para stack traces útiles. DHAT se ejecuta bajo Valgrind, así que espera una ralentización significativa — esta es una herramienta de análisis, no un perfilador de producción.

Ejecutando DHAT

valgrind --tool=dhat ./my-program
# → produce dhat.out.<pid>
OpciónPropósito
--dhat-out-file=FILERuta de salida
--mode=heapPerfilado de heap por defecto
--mode=copyPerfilar copying de memoria (memcpy etc.)
--mode=ad-hocPuntos de instrumentación personalizados
--num-callers=NProfundidad de stack en reportes

Viendo resultados

La salida de DHAT es JSON, vista en el viewer HTML bundled:

# Abrir el viewer y cargar dhat.out.<pid>
firefox /usr/libexec/valgrind/dh_view.html
Elemento de UIMuestra
Árbol de puntos de asignaciónAgrupados por call stack
Bytes total / máxVolumen por sitio
Lecturas / escriturasCuánto la memoria fue accedida
Duraciones de vidaCuánto tiempo vivieron los bloques
OrdenamientoPor cualquier métrica para encontrar los peores ofensores

Las métricas que importan

MétricaRevela
Bytes totalVolumen de asignación general desde este sitio
Bytes máxUso simultáneo pico
Lecturas / escriturasIntensidad de acceso
Lecturas = 0Asignado pero nunca leído — puro desperdicio
Escrituras = 0Nunca inicializado — probablemente un bug o desperdicio
Duraciones cortasChurn; candidatos para stack/pooling
Ratio de accesoBytes accedidos vs bytes asignados

El caso “reads = 0” es el hallazgo clásico de DHAT: memoria que un programa fielmente asigna, llena y libera sin que nada la haya leído.

Hallazgos comunes y fixes

HallazgoFix probable
Muchas asignaciones diminutas corta-vidaAsignación en stack, arena u object pool
Bloque grande, porción accedida diminutaAsignar solo lo que usas; lazy load
Asignaciones nunca-leídasEliminar el trabajo completamente
Alloc/free repetido del mismo tamañoReusar un buffer
Contenedores sobresizedReservar capacidad precisa

Modo copy

valgrind --tool=dhat --mode=copy ./my-program

El modo copy perfila volumen memcpy/memmove por sitio de llamada — útil cuando el perfilado muestra tiempo en copying y necesitas saber qué código es responsable.

Modo ad-hoc

El modo ad-hoc te permite contar eventos arbitrarios mediante anotar tu código con DHAT client requests, convirtiendo DHAT en un contador general “qué call stack hace esto más”.

DHAT vs herramientas relacionadas

AspectoDHATmassifheaptrackBytehound
EnfoqueCómo la memoria es usadaUso pico sobre tiempoPerfilado de asignaciónExploración interactiva
OverheadAlto (Valgrind)Alto (Valgrind)BajoBajo
Insight únicoBloques no-leídos/subutilizadosSnapshots de picoChurn + leaksFiltrado rico
Mejor paraEncontrar trabajo desperdiciadoReducción de picoEjecuciones realistas rápidasAnálisis interactivo profundo

Usa heaptrack o Bytehound para perfilado bajo-overhead de ejecuciones realistas; alcanza DHAT cuando quieres saber si la memoria asignada fue realmente usada.

Recursos