2009-09-06 15 views
19

Esistono buoni profilatori di frammentazione della memoria? (la versione gcc di linux sarebbe carina). Valgrind non può analizzare questo perché utilizza le funzioni personalizzate malloc/free.Profiler frammentazione memoria

Grazie, Andrew

+0

Si potrebbe semplicemente usare 'gdb' o un altro debugger. –

+0

utilizzando gdb per camminare e produrre un profilo di tutti i buffer di memoria gestiti malloc NON è fattibile. – nos

risposta

1

ho difficoltà a capire come un qualsiasi strumento si potrebbe trovare capirebbe le strutture di dati segmento del vostro gestione della memoria personalizzata. Potresti essere in grado di ottenere la distribuzione occupata (agganciando malloc/free) ma la distribuzione gratuita (che essenzialmente è la frammentazione) sembra nell'aria.

Quindi, perché non aggiungere statistiche/istogrammi occupati/gratuiti al gestore di memoria personalizzato. Se i bin sono indicizzati da qualcosa proporzionale a log2 (dimensione) O (1) per mantenere queste statistiche come quando dividi e coalizzi, conosci le dimensioni e puoi trovare il raccoglitore tramite ricerca diretta usando un indice proporzionale a log2 (dimensione)

esempio istogramma intervalli bin

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

(ad esempio, se si desidera bidoni più fini usano logaritmo in base radice quadrata di 2 (dimensione) che può essere calcolato con 4 istruzioni integer su x86 [bit scansionare, confrontare, impostare, aggiungere])

un altro insieme di dimensioni del cestino ragionevoli da utilizzare sono il follo intervalli di apertura alare

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

nuovo facilmente calcolabile [po 'di scansione, spostamento, e, aggiungi])

+0

Non menziona un allocatore personalizzato. Non è così esagerato che qualcuno, ad es. ha scritto uno strumento in grado di camminare sulle strutture interne di glibc allocator su linux. – nos

+0

cosa significa "personalizzato" in "malloc/funzioni libere personalizzate"? – pgast

+3

La "custom" si riferisce a valgrind - sarebbe stupido che valgrind misurasse la frammentazione di malloc mentre valgrind sostituisce l'allocatore di default (vuoi misurare l'allocatore reale, non quello valgrind collegato) – nos

0

nedmalloc è un ottimo allocatore personalizzato, viene fornito con fonte, ottimizzato per evitare la frammentazione.

Vorrei collegarlo e iniziare a controllare la sua registrazione interna per le statistiche sulla frammentazione.

+0

nedmalloc sembra un ottimo modo per accelerare il programma, ma non si avvicina alla soluzione del problema della frammentazione senza molto lavoro. Grazie per le informazioni, sto seriamente pensando di passare ad esso. – Andrew

+0

L'idea era che a) nedmalloc gestisce bene la frammentazione, quindi è meno problematica, b) ha costruito tuning e codice sorgente, quindi puoi eseguire la tua analisi con un'introspezione molto più dettagliata di qualcosa come mtrace. – Justicle

5

Vorrei iniziare con mtrace. Quando si ha una traccia, glibc viene fornito con uno script perl mtrace (1) che trova delle perdite. Tuttavia, il formato di traccia è di facile comprensione, quindi dovrebbe essere diretto in analisi di frammentazione.

+1

Esistono visualizzatori o analizzatori di registri mtrace? – osgx

3

Ho paura che la risposta sia Valgrind.

Si può dire a Valgrind quali funzioni sono utilizzate per effettuare allocazioni e come usa le estensioni di valgrind al codice (quindi è necessario modificare e ricompilare l'applicazione, ma le modifiche si compileranno a noop se non si esegue il debug), i dettagli si trovano nel manuale Valgrind Memory pools: working with custom allocators.

Una volta fatto questo, si dispone di due strumenti che consentono di diagnosticare il vostro utilizzo di heap: massiccio e DHAT (promemoria veloce, Valgrind è un set di strumenti, esso viene eseguito solo quello che tutti noi conosciamo e amiamo , Memcheck, come predefinito).

Massif "è un profiler dell'heap che misura la quantità di memoria heap utilizzata dal programma, inclusi sia lo spazio utile, sia i byte aggiuntivi allocati per la contabilità e l'allineamento. Può anche misurare la dimensione del programma stack (s), anche se non lo fa per impostazione predefinita."

può creare 'grafici', quindi è una specie di grafica:.

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

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

Cosa c'è di più, c'è un Massif Visualizer che produce realmente piuttosto grafici

DHAT consente di diagnosticare come esattamente l'applicazione usa il suo heap, le cui parti sono di breve durata, che vengono mantenute per tutta la durata del programma, ma usate solo all'inizio, ecc. Sfortunatamente non ha alcun grafico o strumento grafico adatto, l'output è puro Per fortuna puoi dire quanti dati vuoi ottenere e come ordinarli non è così male come sembra.

Problemi correlati