Was sind die Unterschiede zwischen (und Gründe für die Wahl) von tcmalloc/jemalloc und Speicherpools?

Lesezeit: 5 Minuten

Benutzeravatar von Mickey Shine
Micky Glanz

tcmalloc/jemalloc sind verbesserte Speicherzuordner, und zur besseren Speicherzuweisung wurde auch ein Speicherpool eingeführt. Was sind also die Unterschiede zwischen ihnen und wie wähle ich sie in meiner Anwendung aus?

  • Warum probieren Sie nicht beide aus und sehen, welches für Sie besser funktioniert? Es gibt keine richtige Antwort auf diese Frage, ohne dass wir viel mehr Informationen über Ihren Anwendungsfall haben.

    – Dan Bechard

    16. Mai 2017 um 15:41 Uhr


  • Zunächst muss Ihre Anwendung viele Zuweisungen/Zuweisungen vornehmen. Dann muss es wirklich leistungskritisch sein. Dann müssen Sie es profilieren und beweisen, dass die Heap-Zuweisung tatsächlich Ihr Engpass ist. Erst dann macht es Sinn, verschiedene Allokatoren auszuprobieren. Dein Vorrat ist vielleicht schon gut genug.

    – Dr. Phil

    28. Februar 2020 um 22:01 Uhr

  • Solange Sie nicht Tausende von Zuweisungen pro Sekunde verarbeiten, ist es sinnlos, eine davon zu verwenden. Sie werden für bestimmte Zwecke gebaut. Verwechseln Sie sie nicht mit einem Speicherpool, bei dem es sich um eine statische Speicherzuordnung handelt, bei der das Verhalten mit einer eindeutigen Logik behandelt werden muss, die Ihr Programm unterstützt.

    – Marko Bencik

    29. Februar 2020 um 22:18 Uhr

Es hängt von den Anforderungen Ihres Programms ab. Wenn Ihr Programm über dynamischere Speicherzuweisungen verfügt, müssen Sie aus den verfügbaren Zuweisungen eine Speicherzuweisung auswählen, die die optimale Leistung Ihres Programms generiert.

Für eine gute Speicherverwaltung müssen Sie mindestens die folgenden Anforderungen erfüllen:

  1. Überprüfen Sie, ob Ihr System über genügend Speicher verfügt, um Daten zu verarbeiten.
  2. Können Sie aus dem verfügbaren Speicher zuweisen?
  3. Rückgabe des verwendeten Speichers / freigegebenen Speichers an den Pool (Programm oder Betriebssystem)

Die Fähigkeit eines guten Speichermanagers kann auf der Grundlage (mindestens) seiner Effizienz beim Abrufen / Zuweisen und Zurückgeben / Löschen von Speicher getestet werden. (Es gibt viele weitere Bedingungen wie Cache-Lokalität, Verwaltungsaufwand, VM-Umgebungen, kleine oder große Umgebungen, Thread-Umgebung usw.)

In Bezug auf tcmalloc und jemalloc gibt es viele Leute, die Vergleiche angestellt haben. Zu einem der Vergleiche:

http://ithare.com/testing-memory-allocators-ptmalloc2-tcmalloc-hoard-jemalloc-while-trying-to-simulate-real-world-loads/

tcmalloc punktet vor allen anderen in Bezug auf CPU-Zyklen pro Zuweisung, wenn die Anzahl der Threads geringer ist. jemalloc ist tcmalloc sehr ähnlich, aber besser als ptmalloc (std glibc-Implementierung).

In Bezug auf den Speicher-Overhead ist jemalloc am besten, gefolgt von ptmalloc, gefolgt von tcmalloc.

Insgesamt kann man sagen, dass jemalloc gegenüber anderen punktet. Sie können auch hier mehr über Jemalloc lesen:

https://www.facebook.com/notes/facebook-engineering/scalable-memory-allocation-using-jemalloc/480222803919

Ich habe nur aus Tests zitiert, die von anderen Personen durchgeführt und veröffentlicht wurden, und habe es nicht selbst getestet. Ich hoffe, dies könnte ein guter Ausgangspunkt für Sie sein und es zum Testen und Auswählen des Optimalsten für Ihre Anwendung verwenden.

Benutzeravatar von zangw
zangw

Zusammenfassung daraus Dok

  • Tcmalloc

    tcmalloc ist eine Open-Source-Speicherverwaltungsbibliothek von Google als Alternative zu glibc malloc. Es wurde in bekannter Software wie Chrome und Safari verwendet. Laut dem offiziellen Testbericht benötigt ptmalloc etwa 300 Nanosekunden, um malloc and free auf einer 2,8-GHz-P4-Maschine (für kleine Objekte) auszuführen. Die TCMalloc-Version benötigt für denselben Vorgang etwa 50 Nanosekunden.

    • Kleine Objektzuweisung
      • tcmalloc weist jedem Thread einen Thread-lokalen ThreadCache zu. Von ThreadCache wird wenig Speicher zugewiesen. Zusätzlich gibt es einen zentralen Heap (CentralCache). Wenn ThreadCache nicht ausreicht, wird Speicherplatz von CentralCache abgerufen und in ThreadCache abgelegt.
      • Kleine Objekte (<=32 KB) werden von ThreadCache und große Objekte von CentralCache zugewiesen. Der von großen Objekten zugewiesene Speicherplatz ist auf 4k-Seiten ausgerichtet, und mehrere Seiten können auch in mehrere kleine Objekte geschnitten und in ThreadCache aufgeteilt werden
    • CentralCache-Zuweisungsverwaltung
      • Große Objekte (> 32 KB) werden zuerst mit 4 KB ausgerichtet und dann aus CentralCache zugewiesen.
      • Wenn in der seitenverknüpften Liste der besten Anpassung kein freier Platz vorhanden ist, ist der Seitenplatz immer größer. Wenn alle 256 verknüpften Listen durchlaufen sind, ist die Zuordnung immer noch nicht erfolgreich. Verwenden Sie sbrk, mmap, /dev/mem, um vom System zuzuweisen.
      • Die zusammenhängenden Seiten, die von tcmalloc PageHeap verwaltet werden, werden Span genannt. Wenn span nicht zugeordnet ist, ist span ein verkettetes Listenelement in PageHeap.
    • Recyceln
      • Wenn ein Objekt frei ist, wird die Seitennummer gemäß der Adressausrichtung berechnet und dann die entsprechende Spanne durch das zentrale Array gefunden.
      • Wenn es sich um ein kleines Objekt handelt, teilt uns span seine Größenklasse mit und fügt das Objekt dann in den ThreadCache des aktuellen Threads ein. Wenn ThreadCache zu diesem Zeitpunkt einen Budgetwert (standardmäßig 2 MB) überschreitet, wird der Garbage-Collection-Mechanismus verwendet, um nicht verwendete Objekte aus ThreadCache in die zentralen freien Listen von CentralCache zu verschieben.
      • Wenn es sich um ein großes Objekt handelt, teilt uns span den Seitennummernbereich mit, in dem das Objekt gesperrt ist. Angenommen, dieser Bereich ist [p,q], suchen Sie zuerst nach dem Bereich, in dem sich die Seiten p-1 und q+1 befinden. Wenn diese angrenzenden Spannen ebenfalls frei sind, führen Sie sie mit der Spanne wo zusammen [p,q] befindet, und recyceln Sie diese Spanne dann zu PageHeap.
      • Die zentralen freien Listen von CentralCache ähneln der FreeList von ThreadCache, fügen jedoch eine Struktur der ersten Ebene hinzu.
        Geben Sie hier die Bildbeschreibung ein
  • Jemalloc

    jemalloc wurde von facebook gestartet und zuerst von freebsds libc malloc implementiert. Derzeit wird es häufig in verschiedenen Komponenten von Firefox und Facebook-Servern verwendet.

    • Speicherverwaltung
      • Ähnlich wie bei tcmalloc verwendet jeder Thread auch Thread-lokalen Cache ohne Sperre, wenn er kleiner als 32 KB ist.
      • Jemalloc verwendet die folgenden Größenklassenklassifizierungen auf 64-Bit-Systemen: Klein: Klein: [8], [16, 32, 48, …, 128], [192, 256, 320, …, 512], [768, 1024, 1280, …, 3840]
        Groß: [4 KiB, 8 KiB, 12 KiB, …, 4072 KiB]
        Riesig: [4 MiB, 8 MiB, 12 MiB, …]
      • Kleine/große Objekte benötigen konstante Zeit, um Metadaten zu finden, und große Objekte werden in logarithmischer Zeit durch den globalen Rot-Schwarz-Baum gesucht.
      • Der virtuelle Speicher wird logisch in Chunks unterteilt (der Standardwert ist 4 MB, 1024 4-k-Seiten), und der Anwendungs-Thread weist Arenen beim ersten Malloc durch den Round-Robin-Algorithmus zu. Jede Arena ist unabhängig voneinander und verwaltet ihre eigenen Chunks. Chunk schneidet Seiten in kleine/große Objekte. Der Speicher von free() wird immer an die Arena zurückgegeben, zu der er gehört, unabhängig davon, welcher Thread free() aufruft.
        Geben Sie hier die Bildbeschreibung ein
  • Vergleichen

    • Der größte Vorteil von jemalloc ist seine leistungsstarke Multi-Core/Multi-Thread-Zuweisungsfähigkeit. Je mehr Kerne die CPU hat, desto mehr Programm-Threads und desto schneller weist jemalloc zu
    • Wenn Sie viel kleinen Speicher zuweisen, ist der Speicherplatz für die Aufzeichnung von Metadaten von jemalloc etwas größer als der von tcmalloc.
    • Bei der Zuweisung großer Speicherzuweisungen kommt es auch zu weniger Speicherfragmentierung als bei tcmalloc.
    • Jemalloc klassifiziert die Granularität der Speicherzuweisung feiner, es führt zu weniger Sperrkonflikten als ptmalloc.

1417510cookie-checkWas sind die Unterschiede zwischen (und Gründe für die Wahl) von tcmalloc/jemalloc und Speicherpools?

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

Privacy policy