Frage

Ich habe derzeit stark Multi-Threaded-Server-Anwendung, und ich bin Shopping rund um für einen guten Multi-Threaded Speicherzuordner.

Bisher bin ich hin- und hergerissen zwischen:

  • Sun UMEM
  • Google tcmalloc
  • Intel Threading Building Blocks allocator
  • Emery Berger horten

Von dem, was ich gefunden habe, horten könnte die schnellste sein, aber ich hatte es vor dem heutigen Tag nicht gehört haben, so bin ich skeptisch, ob es ist wirklich so gut, wie es scheint. Wer persönliche Erfahrung haben diese Verteilern ausprobieren?

War es hilfreich?

Lösung

Ich habe verwendet tcmalloc und lesen Sie über Hoard. Beide haben ähnliche Implementierungen und beide erreichen ungefähr lineare Leistungsskalierung in Bezug auf die Anzahl der Threads / CPUs (nach den Grafiken auf ihren jeweiligen Seiten).

Also: Wenn Leistung wirklich so unglaublich entscheidend ist, dann tut Leistung / Lasttests. Ansonsten nur einen Würfel rollen und eine der aufgeführten (durch einfache Bedienung auf der Zielplattform gewichtet) wählen.

Und von trshiv den Link , es sieht aus wie Hoard, tcmalloc, und ptmalloc sind alle in etwa vergleichbar für die Geschwindigkeit. Insgesamt sieht tt wie ptmalloc für die Aufnahme so wenig Raum wie möglich optimiert, Hoard für einen Trade-off der Geschwindigkeit optimiert + Speichernutzung und tcmalloc ist für die reine Geschwindigkeit optimiert.

Andere Tipps

Der einzige Weg, zu sagen, um wirklich den Speicherzuordner ist das Richtige für Ihre Anwendung ein paar heraus zu versuchen. Alle genannten Verteilern wurden durch intelligent Leute geschrieben und wird die andere auf einem bestimmten oder einem anderen-Micro schlagen. Wenn alle Ihre Anwendung tut den ganzen Tag lang ist malloc ein 8-Byte-Chunks in Thread A und frei, um es in Thread B, und braucht nicht etwas anderes überhaupt zu behandeln, könnten Sie wahrscheinlich einen Speicherzuordner schreiben, die die Hose schlägt alle die bisher aufgeführt. Es wird nicht nur sehr nützlich sein für viel mehr. :)

Ich habe einige Erfahrung mit Hoard, wo ich (genug, so dass eine des Unbekannten Fehlers in der jüngsten 3.8 Version behoben wurde als Ergebnis dieser Erfahrung gefunden) arbeite. Es ist ein sehr gutes allocator - aber wie gut, für Sie ist, hängt von Ihrer Arbeitsbelastung. Und Sie müssen für Hoard zahlen (obwohl es nicht zu teuer ist), um es in einem kommerziellen Projekt zu verwenden, ohne den Code GPL'ing.

Ein sehr leicht angepasst ptmalloc2 der Zuordner hinter glibc malloc für eine ganze Weile jetzt gewesen, und so ist es unglaublich weit verbreitet und getestet. Wenn Stabilität vor allen Dingen wichtig ist, könnte es eine gute Wahl sein, aber du hast es nicht erwähnt in der Liste, also werde ich annehmen, dass es aus ist. Für bestimmte Workloads, es ist schrecklich - aber das gleiche gilt für jeden Mehrzweck malloc

.

Wenn Sie bereit sind, dafür zu zahlen (und der Preis ist angemessen, in meiner Erfahrung), SmartHeap SMP auch eine gute Wahl. Die meisten anderen Verteilern erwähnt werden als Drop-in malloc / free neue / löschen Ersatz entwickelt, die LD_PRELOAD'd werden kann. SmartHeap kann auch auf diese Weise verwendet werden, aber es enthält auch eine ganze Zuteilung bezogene API, die Sie Feinabstimmung Verteilern zu Inhalt Ihres Herzens lässt. In Tests, die wir (wieder, sehr spezifisch für eine bestimmte Anwendung) getan haben, war SmartHeap etwa die gleiche wie Hoard für die Leistung, wenn sie als ein Drop-in-Ersatz malloc handeln; der wirkliche Unterschied zwischen den beiden ist der Grad der Anpassung. Sie können eine bessere Leistung der weniger Allzweck- Sie Ihre allocator sein müssen.

Und je nach Anwendungsfall, ein Mehrzweck multithreaded allocator vielleicht nicht, was Sie überhaupt verwenden möchten; wenn Sie ständig malloc & free'ing Objekte sind, die alle die gleiche Größe haben, möchten Sie vielleicht nur eine einfache Platte allocator schreiben. Slab Zuweisung an mehreren Stellen im Linux-Kernel verwendet, die diese Beschreibung passen. (Ich würde Ihnen ein paar nützliche Links, aber ich bin ein „neuer Benutzer“ und Stack-Überlauf hat entschieden, dass neue Benutzer nicht sein darf zu hilfreich alle in einer Antwort. Google kann helfen aus gut genug, though.)

Ich persönlich bevorzugen und ptmalloc als multithreaded allocator empfehlen. Hoard ist gut, aber in der Auswertung mein Team hat zwischen Hoard und ptmalloc vor ein paar Jahren, ptmalloc war besser. Von dem, was ich weiß, ptmalloc ist seit einer Reihe von Jahren und ziemlich weithin als multithreaded allocator verwendet.

Sie können feststellen, diesem Vergleich nützlich.

Vielleicht ist dies der falsche Weg zu nähern, was Sie fordern, aber vielleicht eine andere Taktik überhaupt verwendet werden könnte. Wenn Sie vielleicht für eine wirklich schnelle Speicherzuordner suchen, sollten Sie sich fragen, warum müssen Sie die ganze Zeit zu verbringen, das Zuweisen von Speicher, wenn Sie könnte vielleicht nur mit Stack Zuweisung von Variablen wegzukommen. Stack Zuteilung, während Art und Weise ärgerlicher, richtig gemacht kann man viel mehr im Weg Mutex Streit speichern, sowie seltsame Erinnerung Korruption Fragen aus Ihrem Code zu halten. Auch Sie möglicherweise weniger Fragmentierung haben, die helfen könnten.

Wir haben horten an einem Projekt, wo ich vor ein paar Jahren gearbeitet. Es schien sehr gut zu funktionieren. Ich habe keine Erfahrung iwth den anderen Verteilern. Es sollte ziemlich einfach sein, verschiedene, zu versuchen und Lasttests zu tun, nicht wahr?

Die locklessinc Allocator ist sehr gut und der Entwickler reagiert, wenn Sie Fragen haben. Es hat einen Artikel, den er über einige der Optimierungstricks schrieb verwendet, es ist eine interessante Lektüre: http://locklessinc.com / articles / allocator_tricks / . Ich habe es in der Vergangenheit mit hervorragenden Ergebnissen verwendet.

eingeben Bild Beschreibung hier

Wahrscheinlich eine späte Antwort auf Ihre Frage, aber

warum mallocs tun, wenn Sie die Leistung hick ups haben?

Besserer Weg wäre eine malloc eines großen Speicherfensters bei der Initialisierung zu tun und dann mit einem light weight Memory manager kommen, die lease out the memory chunks at run time würden.

Dies vermeidet jede Möglichkeit der Systemaufrufe, wenn Ihre Heap Expansion.

Sie können versuchen, ltalloc (general purpose globale Speicherzuordner Geschwindigkeit von schnellen Pool Allocator).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top