Dynamic memory management is a fundamental technique for all programmers. The endless amount of different programs and the simple interface are the cause of huge internal complexity. That is why there are numerous competing implementations and extensive ongoing scientific interest. Choosing the right memory allocator for the used hard- and software environment is a difficult task.
This work gives a short summary of some common techniques. In its course a benchmark framework was implemented, which is suitable to benchmark any allocator with any given workload. This framework is used to obtain and present a comparison of the four memory allocators: glibc, jemalloc, tcmalloc and Hoard on a multi-core system.
This comparison shows, that thread local caches which are the new standard to avoid synchronization all together, clearly improve the throughput and scalability of the allocator. Differences in how external fragmentation is handled can be spotted but which technique is the best must be decided for each actual program behavior. The arrangement shows that benchmarks can never cover the whole program behavior and often really test only one aspect. That’s why the actual application has to be benchmarked with the feasible allocators. Additionally it stands out that memory allocators ignore hardware topologies like NUMA which are an essential part of future many-core systems.
Dynamische Speicherverwaltung ist ein nicht wegzudenkendes Werkzeug für jeden Programmierer. Das unbegrenzte Spektrum an auf sie angewiesenen Anwendungen, sowie ihre einfache Schnittstelle führen zu enormer inneren Komplexität. Diese Komplexität drückt sich im großen Umfang der über die Jahre entstandene Forschung und die vielen konkurrierenden Implementierungen aus. Die Wahl der geeignetsten Implementierung für verwendete Soft- und Hardware ist deshalb nicht einfach.
In der vorliegenden Bachelorarbeit soll ein kurzer Überblick über die verwendeten Techniken gegeben sowie eine Umgebung vorgestellt werden, die es ermöglicht Speicherverwaltungen für unterschiedliche Anwendungen und nach einzelnen Kriterien zu untersuchen. Außerdem wird mit Hilfe der entstandenen Umgebung ein Vergleich der vier Implementierungen: glibc, jemalloc, tcmalloc und Hoard auf einem Mehrkernsystem präsentiert.
Der durchgeführte Vergleich zeigt, dass der aktuelle Stand der Technik, die weitgehende Vermeidung von Synchronisation durch fadenlokale Zwischenspeicher, zu einer deutlichen Steigerung des Durchsatzes und der Skalierbarkeit der dynamischen Speicherverwaltung führt. Unterschiede sind darüber hinaus im Umgang mit externer Fragmentierung zu erkennen, welche Herangehensweise allerdings für den wenigsten zusätzlichen Speicherbedarf sorgt muss im Einzelfall bestimmt werden. Die aus dem Vergleich gewonnene Erkenntnis ist, dass generische Tests niemals die Realität sondern nur einen Teilaspekt abbilden können und somit für eine optimale Entscheidung immer die betrachtete Anwendung selbst Untersuchungsgegenstand sein muss. Zusätzlich ist aufgefallen, dass Hardwaretopologien wie NUMA Architekturen, die in der Zukunft für Vielkernprozessoren eine entscheidende Rolle spielen werden noch nicht im Fokus der dynamischen Speicherverwaltungen angelangt sind.
PDF in german language.
Copyright 2018 Florian Fischer.
allocbench - Benchmark framework for POSIX memory allocators