Speicherfragmentierungs-Profiler

Lesezeit: 3 Minuten

Benutzer-Avatar
Andreas

Gibt es gute Speicherfragmentierungs-Profiler? (Linux gcc-Version wäre schön). Valgrind kann dies nicht analysieren, da es benutzerdefinierte malloc/free-Funktionen verwendet.

Danke, Andreas

  • Du könntest einfach verwenden gdb oder ein anderer Debugger.

    – Chris Lutz

    6. September 2009 um 21:41 Uhr

  • Die Verwendung von gdb zum Durchlaufen und Erstellen eines Profils der gesamten verwalteten Malloc-Speicherpuffer ist NICHT machbar.

    – Nr

    6. September 2009 um 22:06 Uhr

Ich würde mit beginnen mtrace. Wenn Sie einen Trace haben, enthält glibc ein Perl-Skript mtrace(1), das Lecks findet. Das Ablaufverfolgungsformat ist jedoch leicht zu verstehen, daher sollte es einfach sein, dies in die Fragmentierungsanalyse zu verarbeiten.

Benutzer-Avatar
Hubert Kario

Ich fürchte, die Antwort ist Valgrind.

Sie können Valgrind mitteilen, welche Funktionen verwendet werden, um Zuordnungen vorzunehmen, und wie es dies tut, indem Sie Valgrind-Erweiterungen zum Code verwenden (Sie müssen also Ihre Anwendung ändern und neu kompilieren, aber die Änderungen werden zu Noops kompiliert, wenn Sie nicht debuggen), die Details sind in Valgrind-Handbuch Speicherpools: Arbeiten mit benutzerdefinierten Allokatoren.

Sobald Sie dies getan haben, haben Sie zwei Tools, mit denen Sie Ihre Heap-Nutzung diagnostizieren können: Massif und DHAT (kurze Erinnerung, Valgrind ist eine einstellen von Tools, es läuft einfach das, das wir alle kennen und lieben, Memcheck, als Standard).

Massiv “ist ein Heap-Profiler. Er misst, wie viel Heap-Speicher Ihr Programm verwendet. Dies umfasst sowohl den nutzbaren Speicherplatz als auch die zusätzlichen Bytes, die für Buchhaltungs- und Ausrichtungszwecke zugewiesen werden. Er kann auch die Größe des Stapels Ihres Programms messen. obwohl dies standardmäßig nicht der Fall ist.”

Es kann “Graphen” erstellen, also ist es eine Art Grafik:

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

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

Außerdem gibt es eine Massif Visualizer das erzeugt wirklich hübsche Graphen.

DHAT ermöglicht es Ihnen zu diagnostizieren, wie genau die Anwendung ihren Heap verwendet, welche Teile kurzlebig sind, welche während der gesamten Lebensdauer des Programms beibehalten, aber nur am Anfang verwendet werden usw. Leider hat es keine schönen Diagramme oder grafischen Tools, die dazu passen it, die Ausgabe ist reiner Text. Zum Glück können Sie ihm sagen, wie viele Daten Sie erhalten möchten und wie Sie sie sortieren, damit es nicht so schlimm ist, wie es sich anhört.

Ich habe Probleme zu verstehen, wie ein Tool, das Sie finden könnten, die Segmentdatenstrukturen Ihrer benutzerdefinierten Speicherverwaltung verstehen würde. Sie können vielleicht die busy-Distribution bekommen (einhaken in malloc/free), aber die free-Distribution (die im Wesentlichen die Fragmentierung ist) scheint in der Luft zu sein.

Warum also nicht Belegt/Frei-Statistiken/Histogramme zu Ihrem benutzerdefinierten Speichermanager hinzufügen? Wenn Behälter durch etwas proportional zu log2 (Größe) indiziert werden, ist es O (1), um diese Statistiken beizubehalten, da Sie beim Aufteilen und Zusammenführen die Größen kennen und den Behälter durch direktes Nachschlagen mithilfe eines Index finden können, der proportional zu log2 (Größe) ist.

zB Histogramm-Bin-Intervalle

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

(eg if you want finer bins use log base square root 2(size)
which can be calculated with 4 integer instructions on x86 [bit scan, compare, set, add])

Ein weiterer Satz sinnvoller Behältergrößen sind die folgenden Öffnungsintervalle

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

again easily calculable [bit scan, shift, and, add])

  • Er erwähnt keinen benutzerdefinierten Allokator. Es ist nicht so weit hergeholt, dass zB jemand ein Tool geschrieben hat, das die internen Strukturen des glibc-Allocators unter Linux durchlaufen kann.

    – Nr

    10. September 2009 um 21:19 Uhr

  • was bedeutet dann “custom” in “custom malloc/free functions”?

    – pgast

    11. September 2009 um 0:09 Uhr

  • Der ‘Custom’ bezieht sich auf Valgrind – es wäre albern für Valgrind, die Malloc-Fragmentierung zu messen, da Valgrind den Standardzuordner ersetzt (Sie möchten den echten Zuordner messen, nicht den eingehängten Valgrind).

    – Nr

    9. November 2009 um 18:46 Uhr

nedmalloc ist ein sehr guter benutzerdefinierter Allokator, kommt mit Quelle, optimiert, um Fragmentierung zu vermeiden.

Ich würde das anschließen und anfangen, in der internen Protokollierung nach Fragmentierungsstatistiken zu suchen.

1229240cookie-checkSpeicherfragmentierungs-Profiler

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy