2009-09-06 14 views
19

¿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.Analizador de fragmentación de memoria

Gracias, Andrew

+0

Podrías usar 'gdb' u otro depurador. –

+0

usando gdb para recorrer y generar un perfil de todos los búferes de memoria gestionados malloc NO es factible. – nos

Respuesta

1

que tienen problemas para entender cómo cualquier herramienta que puede encontrar comprendería las estructuras de datos segmento de la gestión de memoria personalizado. 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.

¿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 histograma intervalos bin

[2^n, 2^(n + 1)) ...

(por ejemplo, si desea utilizar recipientes más finos logaritmo en base 2 de la raíz cuadrada (tamaño) que puede calcularse con 4 instrucciones enteras en x86 [escanear bit, comparar, establecer, agregar])

otro conjunto de tamaños de contenedores razonables para usar son los siguientes ala intervalos abiertos

[2^n, 2^n + 2^(n-1)), [2^n + 2^(n-1), 2^(n + 1)) ...

más fácilmente calculable [escaneo poco, turno y, añadir])

+0

Él no menciona un asignador personalizado. No es tan descabellado que alguien, p. escribió una herramienta que podría recorrer las estructuras internas del asignador glibc en Linux. – nos

+0

entonces, ¿qué significa "personalizado" en "funciones personalizadas malloc/gratuitas"? – pgast

+3

La 'costumbre' se refiere a valgrind - sería una tontería para valgrind medir la fragmentación malloc ya que valgrind reemplaza el asignador predeterminado (Desea medir el asignador real, no el valgrind enganchado) – nos

0

nedmalloc es un muy buen asignador de costumbre, viene con la fuente, optimizado para evitar la fragmentación.

Lo conectaría y comenzaría a buscar en su registro interno para estadísticas de fragmentación.

+0

nedmalloc parece una excelente manera de acelerar el programa, pero no se acerca a resolver el problema de la fragmentación de perfiles sin mucho trabajo. Gracias por la información, estoy considerando seriamente cambiar a ella. – Andrew

+0

La idea era que a) nedmalloc maneja bien la fragmentación, por lo que no es un problema, b) tiene una sintonización incorporada y un código fuente, por lo que puedes hacer tu propio análisis con una introspección mucho más detallada que algo como mtrace. – Justicle

5

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.

+1

¿Hay visualizadores o analizadores de registros mtrace? – osgx

3

Me temo que la respuesta es Valgrind.

Puede decirle a Valgrind qué funciones se usan para hacer asignaciones y cómo lo hace usando valgrind extensiones para codificar (por lo que debe modificar y recompilar su aplicación, pero los cambios se compilan a noops si no está depurando), los detalles están en Valgrind manual Memory pools: working with custom allocators.

Una vez hecho esto, usted tiene dos herramientas que le permiten diagnosticar el uso del montón: macizo y DHAT (recordatorio rápido, Valgrind es un conjunto de herramientas, sólo se corre el que todos conocemos y el amor , Memcheck, por defecto).

Massif "Mide la memoria de almacenamiento dinámico que utiliza su programa. Esto incluye el espacio útil y los bytes adicionales asignados para fines de contabilidad y alineación. También puede medir el tamaño del programa. pila (s), aunque no lo hace de forma predeterminada."

Se pueden crear 'gráficos', por lo que es una especie de gráfica:.

 
19.63^            ###      
    |            #       
    |            # ::      
    |            # : :::     
    |          :::::::::# : : ::    
    |          :  # : : : ::    
    |          :  # : : : : :::   
    |          :  # : : : : : ::   
    |       :::::::::::  # : : : : : : :::  
    |       :   :  # : : : : : : : :: 
    |      :::::   :  # : : : : : : : : :: 
    |      @@@: :   :  # : : : : : : : : : @ 
    |     ::@ : :   :  # : : : : : : : : : @ 
    |    :::: @ : :   :  # : : : : : : : : : @ 
    |    ::: : @ : :   :  # : : : : : : : : : @ 
    |   ::: : : @ : :   :  # : : : : : : : : : @ 
    |   :::: : : : @ : :   :  # : : : : : : : : : @ 
    |  ::: : : : : @ : :   :  # : : : : : : : : : @ 
    | :::: : : : : : @ : :   :  # : : : : : : : : : @ 
    | ::: : : : : : : @ : :   :  # : : : : : : : : : @ 
    0 +----------------------------------------------------------------------->KB  0                 29.48 

Number of snapshots: 25 
Detailed snapshots: [9, 14 (peak), 24] 

Lo que es más, hay una Massif Visualizer que se produce gráficos muy bonitos

DHAT le permite diagnosticar exactamente cómo la aplicación usa su montón, cuyas partes son de corta duración, que se conservan 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 lo acompañen, la salida es pura texto. Afortunadamente, puede indicarle la cantidad de datos que desea obtener y cómo ordenarlos de manera no es tan malo como parece.

Cuestiones relacionadas