c++ - que - malloc c
Perfilador de fragmentación de memoria (4)
Tengo problemas para entender cómo cualquier herramienta que pueda encontrar comprenderá las estructuras de datos de segmento de su gestión de memoria personalizada. Es posible que puedas obtener la distribución ocupada (enganchándote en malloc / free) pero la distribución gratuita (que esencialmente es la fragmentación) parece estar en el aire.
Entonces, ¿por qué no agregar estadísticas / histogramas ocupados / libres a su administrador de memoria personalizado? Si los contenedores están indexados por algo proporcional a log2 (tamaño) es O (1) para mantener estas estadísticas como cuando se divide y fusiona conoce los tamaños y puede encontrar el contenedor por búsqueda directa usando un índice proporcional a log2 (tamaño)
por ejemplo, intervalos de intervalos de histograma
[2 ^ n, 2 ^ (n + 1)) ...
(por ej., si desea recipientes más finos, use la base de registro raíz cuadrada 2 (tamaño) que puede calcularse con 4 instrucciones enteras en x86 [escaneo de bits, comparar, establecer, agregar])
Otro conjunto de tamaños de contenedores razonables para usar son los siguientes intervalos abiertos
[2 ^ n, 2 ^ n + 2 ^ (n-1)), [2 ^ n + 2 ^ (n-1), 2 ^ (n + 1)) ...
nuevamente fácilmente calculable [bit scan, shift, y, add])
¿Hay buenos perfiladores de fragmentación de memoria? (la versión de linux gcc sería agradable). Valgrind no puede analizar esto porque usa funciones personalizadas malloc / free.
Gracias, Andrew
nedmalloc es un muy buen asignador personalizado, viene con fuente, optimizado para evitar la fragmentación.
Me gustaría conectarlo y comenzar a buscar en su registro interno para las estadísticas de fragmentación.
Comenzaría con mtrace . Cuando tiene un rastro, glibc viene con un script de perl mtrace (1) que encuentra fugas. Sin embargo, el formato de rastreo es fácil de entender, por lo que debe ser un proceso sencillo para el análisis de fragmentación.
Me temo que la respuesta es Valgrind.
Puede decirle a Valgrind qué funciones se usan para hacer asignaciones y cómo se hace usando las extensiones valgrind para codificar (por lo que debe modificar y recompilar su aplicación, pero los cambios se compilan en noops si no está depurando), los detalles están en Grupos de memoria manuales Valgrind : trabajando con asignadores personalizados .
Una vez que hayas hecho esto, tienes dos herramientas que te permiten diagnosticar tu uso de montón: macizo y DHAT (recordatorio rápido, Valgrind es un conjunto de herramientas, simplemente ejecuta el que todos conocemos y amamos, Memcheck, por defecto) .
Massif "es un generador de perfiles dinámico que mide la cantidad de memoria que utiliza el programa. Esto incluye tanto el espacio útil como los bytes adicionales asignados para la conservación y la alineación. También puede medir el tamaño de la (s) pila (s) de su programa. , aunque no lo hace por defecto ".
Puede crear "gráficos", por lo que es una especie de gráfico:
19.63^ ### | # | # :: | # : ::: | :::::::::# : : :: | : # : : : :: | : # : : : : ::: | : # : : : : : :: | ::::::::::: # : : : : : : ::: | : : # : : : : : : : :: | ::::: : # : : : : : : : : :: | @@@: : : # : : : : : : : : : @ | ::@ : : : # : : : : : : : : : @ | :::: @ : : : # : : : : : : : : : @ | ::: : @ : : : # : : : : : : : : : @ | ::: : : @ : : : # : : : : : : : : : @ | :::: : : : @ : : : # : : : : : : : : : @ | ::: : : : : @ : : : # : : : : : : : : : @ | :::: : : : : : @ : : : # : : : : : : : : : @ | ::: : : : : : : @ : : : # : : : : : : : : : @ 0 +----------------------------------------------------------------------->KB 0 29.48 Number of snapshots: 25 Detailed snapshots: [9, 14 (peak), 24]
Además, hay un visualizador Massif que produce gráficos realmente bonitos.
DHAT le permite diagnosticar cómo exactamente la aplicación usa su montón, qué partes son de corta vida, que se mantienen durante toda la vida del programa, pero que se usaron solo al principio, etc. Desafortunadamente no tiene buenos gráficos o herramientas gráficas que vayan con eso, la salida es texto puro. Afortunadamente puede decir cuántos datos quiere obtener y cómo ordenarlos para que no sea tan malo como suena.