2012-10-23 14 views
8

Ich hatte vor kurzem über jemalloc gelernt, es ist der Speicherzuordner von Firefox verwendet. Ich habe versucht, jemalloc in mein System zu integrieren, indem ich neue und lösche Operator überschreibe und die jemalloc Entsprechungen von malloc und frei anrieche, dh je_malloc und je_free.Ich habe eine Testanwendung geschrieben, die 100 Millionen Zuordnungen tut. Ich habe die Anwendung sowohl mit glibc malloc als auch ausgeführt jemalloc, während der Lauf mit jemalloc weniger Zeit für solche Zuordnungen benötigt, ist die CPU-Auslastung ziemlich hoch, außerdem ist der Speicherfußdruck im Vergleich zu malloc ebenfalls größer. Nach dem Lesen dieses Dokuments auf jemalloc analysis schien es, dass jemalloc Fußabdrücke größer als malloc haben könnte, da es Techniken zur Optimierung der Geschwindigkeit als Speicher verwendet. Ich habe jedoch keine Hinweise auf die CPU-Nutzung mit Jemalloc. Ich würde gerne sagen, dass ich an einer Multiprozessor-Maschine arbeite, deren Einzelheiten unten aufgeführt sind.CPU und Speicherverbrauch von jemalloc im Vergleich zu glibc malloc

Prozessor: 11 vendor_id: Genuine CPU-Familie: 6 Modell: 44 Modellname: Intel (R) Xeon (R) CPU X5680 @ 3,33 GHz Schritt: 2 CPU MHz: 3325,117 Cache-Größe: 12288 KB physikalische ID: 1 Geschwister: 12 Kern-ID: 10 CPU-Kern: 6 apicid: 53 FPU: ja fpu_exception: ja CPUID Stufe: 11 wp: ja Fahnen: FPU vme de pse tsc msr PAE mce CX8 APIC sep mtrr PGE mca cmov pat PSE36 CLFLUSH dts acpi MMX fxsr sse sse2 ss ht tm syscall nx pdpe1gb rdtscp lm CONSTANT_TSC ida NONSTOP_TSC ARAT pni überwachen ds_cpl VMX SMX est tm2 SSSE3 CX16 xtpr sse4_1 sse4_2 popcnt lahf_lm bogomips: 6.649,91 CLFLUSH Größe: 64 cache_alignment: 64 Adresse Größen: 40 Bit physikalische, 48 Bit virtuelles Power-Management: [8]

ich verwende oben -c -b -d 1.10 -p 24670 | awk -v Zeit = $ TIME '{Druckzeit, ",", $ 9}', um die CPU-Auslastung zu verfolgen.

Hat jemand ähnliche Erfahrungen bei der Integration von Jemlloc gemacht?

Danke!

Antwort

1

Diese Frage mag hier nicht gehören, da es für reale Lösungen irrelevant sein sollte, was andere Leute in ihren verschiedenen Hardware/Umgebungen/Anwendungsszenarien gefunden haben. Sie sollten auf dem Zielsystem testen und sehen, was Ihnen passt.

Für den höheren Speicherbedarf ist eine der klassischsten Leistungsoptimierungen in der Informatik der Zeit-Speicher-Kompromiss. Das bedeutet, dass bestimmte Ergebnisse für die sofortige Suche zu einem späteren Zeitpunkt zwischengespeichert werden und eine häufige Neuberechnung verhindert wird. Da es vermutlich auch viel komplexer ist, würde es wahrscheinlich viel mehr interne Buchhaltung geben. Diese Art des Kompromisses sollte mehr oder weniger erwartet werden, insbesondere bei der Auswahl zwischen Varianten solcher Low-Level- und weit verbreiteten Core-Module. Sie müssen die Leistungsmerkmale Ihren Nutzungseigenschaften anpassen, da es in der Regel keine Wunderwaffe gibt.

Sie könnten auch googles TCMalloc suchen, die ziemlich nah ist, obwohl ich glaube, dass Jemalloc im Allgemeinen etwas performanter ist, sowie das Erschaffen weniger Heapfragmentierung im Laufe der Zeit.

+0

danke für Ihre Kommentare Preet. Ich habe versucht, herauszufinden, ob jemand ähnliche Beobachtungen auf einem anderen Multiprozessor-Rechner hatte. Ich stimme Ihnen völlig zu, dass die genaue Leistung vollständig Hardware-abhängig sein würde, aber ich fragte mich, ob das Muster der CPU-Auslastung gleich oder höher für jemalloc sein sollte in Multiprozessorumgebung. – deb

1

Aerospike hat jemalloc in unserer NoSQL-Datenbank implementiert und die Implementierung vor etwa einem Jahr mit v3.3.x veröffentlicht.Gerade heute hat Psi Mankoski veröffentlicht an article on High Scalability über warum und wie wir es gemacht haben, und die Leistungsverbesserung gab es im Vergleich zu GlibC malloc.

Wir sahen tatsächlich einen Rückgang der RAM Auslastung wegen der Art und Weise konnten wir jemalloc Debugging-Fähigkeit verwenden RAM Fragmentierung zu minimieren. In der Produktionsumgebung war Server% Free Memory häufig ein "stacheliger Graph" und hatte vor der Implementierung von JEMalloc oft 54% erreicht. Nach der Implementierung können Sie die Verringerung der RAM-Auslastung während des 4-monatigen Analysezeitraums sehen. RAM% freier Speicher begann zu "flatline" und ist viel vorhersehbarer, schwebend zwischen ~ 22-40% abhängig vom Serverknoten.

Wie Preet sagt, gab es viel weniger Fragmentierung im Laufe der Zeit, die weniger RAM Auslastung bedeutet. Psis Artikel gibt "Beweise im Pudding" hinter einer solchen Aussage.

19

Ein weiser Mann sagte auf CppCon, die Sie nie über die Leistung zu erraten. Sie müssen es stattdessen messen. Ich habe versucht, jemalloc mit Multithread-Linux-Anwendung zu verwenden. Es war ein benutzerdefinierter Protokollserver auf Anwendungsebene (über TCP/IP). Diese C++ - Anwendung verwendete einige Java-Code über JNI (fast 5% der Zeit, die Java verwendet wurde, und 95% der Zeit verwendete es C++ - Code) Ich führe 2 Anwendungsinstanzen im Produktionsmodus aus. Jeder hatte 150 Fäden. Nach 72 Stunden Laufzeit glibc verwendet man 900 M Speicher, und jemalloc verwendet 2,2 G Speicher. Ich habe keinen signifikanten Unterschied bei der CPU-Auslastung gesehen. Die tatsächliche Leistung (durchschnittliche Bearbeitungszeit für die Clientanforderung) war in beiden Fällen nahezu gleich. Also, in meinem Test glibc war viel besser, dass jemalloc. Natürlich ist es meine spezifische Anwendung. Fazit: Wenn Sie Gründe haben zu glauben, dass Ihre Anwendung Speicherverwaltung wegen der Fragmentierung nicht wirksam ist, müssen Sie Test ähnlich einer mache ich beschrieben. Es ist die einzige zuverlässige Informationsquelle für Ihre spezifischen Bedürfnisse. Wenn jemalloc ist immer besser, dass glibc, glibc macht jemalloc seine offizielle Zuweiser. Wenn glibc immer besser ist, wird jemalloc aufhören zu existieren. Wenn Wettbewerber lange parallel existieren, bedeutet dies, dass jeder seine eigene Nutzungsnische hat.

0

Ich entwickle einfache NoSQL-Datenbank.
(https://github.com/nmmmnu/HM4)

jemalloc vs standard malloc

Wenn I jemalloc verwenden, Leistungsabnahme, aber memory "Fragmentierung" verringert sich auch. Jemalloc scheint auch weniger Speicher auf dem Peak zu verwenden, aber der Unterschied ist 5-6%.

Was ich mit Speicherfragmentierung meine, ist wie folgt.

  • Zuerst I zuzuteilen viele Schlüsselwertpaare (5-7 GB Speicher)
  • Dann sehe ich in der Speichernutzung.
  • Dann habe ich alle Paare und alle anderen Speicher freigeben, die meine ausführbare Datei verwendet. Die Reihenfolge der Zuordnung ist die gleiche wie die Reihenfolge der Freigabe.
  • Schließlich überprüfe ich noch einmal die Speichernutzung.

Im Standard Malloc ist die Sprache fast wie auf dem Gipfel. (Ich habe speziell nach dem MMAP-Speicher gesucht und es gibt keinen).

Mit jemalloc Nutzung ist minimal.


Bonus Informationen - tcmalloc

ich das letzte Mal mit tcmalloc geprüft, es war wirklich sehr schnell - vermutlich 10% Verbesserung gegenüber Standard malloc.

Auf dem Höhepunkt verbraucht es weniger Speicher als Standard malloc, aber mehr als jemalloc.

Ich erinnere mich nicht an die Speicherfragmentierung, aber es war weit von jemalloc Ergebnis.

Verwandte Themen