Ich hatte kürzlich von jemalloc erfahren, es ist der von Firefox verwendete Speicherzuordner. 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 Zuweisungen 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 Analyse es schien, 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 Details im Folgenden aufgeführt sind.
Prozessor: 11 Hersteller-ID: EchtesIntel CPU-Familie: 6 Modell: 44 Modellname: Intel (R) Xeon (R) CPU X5680 @ 3,33 GHz Schritt: 2 CPU-MHz: 3325,117 Cachegröße: 12288 KB Physische ID: 1 Geschwister: 12 Kern-ID: 10 CPU-Kerne: 6 apicid: 53 fpu: ja fpu_exception: ja CPU-Level: 11 wp: ja flags: fpu vme de pse tsc msr pae mccx8 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 monitor ds_cpl vmx smx est tm2 sss3 cx16 xtpr sse4_1 sse4_2 popcnt lahf_lm bogomips: 6649.91 Zusatzgröße: 64 cache_ausrichtung: 64 Adressgrößen: 40 Bit physikalisch, 48 Bit virtuell Energieverwaltung: [8]
Ich verwende top -c -b -d 1.10 -p 24670 | awk -v time = $ TIME '{Druckzeit, ",", $ 9}' um die CPU-Auslastung zu verfolgen.
Hat jemand ähnliche Erfahrungen bei der Integration von Jemlloc gemacht?
Danke!
Ein weiser Typ hat auf der CppCon gesagt, dass man nie über die Leistung raten muss. 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
verwendete man 900 M Speicher, und jemalloc
verwendete 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 war glibc
viel besser als jemalloc
. Natürlich ist es meine spezifische Anwendung.
Schlussfolgerung : Wenn Sie der Meinung sind, dass die Verwaltung des Anwendungsspeichers aufgrund der Fragmentierung nicht effektiv ist, müssen Sie einen Test durchführen, der dem von mir beschriebenen ähnlich ist. Es ist die einzige zuverlässige Informationsquelle für Ihre spezifischen Bedürfnisse. Wenn jemalloc
immer besser ist als glibc
, wird glibc
jemalloc
zu seinem offiziellen Allokator machen. Wenn glibc
immer besser ist, wird jemalloc
nicht mehr existieren. Wenn Wettbewerber lange parallel existieren, bedeutet das, dass jeder seine eigene Nutzungsnische hat.
Diese Frage mag hier nicht enthalten sein, 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.
Was den höheren Speicherbedarf betrifft, ist eine der klassischsten Leistungsoptimierungen in der Computerwissenschaft 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.
Vielleicht möchten Sie auch auf googles TCMalloc schauen, was ziemlich nah ist, obwohl ich glaube, dass Jemalloc leicht ist im Allgemeinen leistungsfähiger und weniger Heap-Fragmentierung im Laufe der Zeit.
Aerospike hat jemalloc in unsere NoSQL-Datenbank implementiert und die Implementierung vor etwa einem Jahr mit v3.3.x veröffentlicht. Gerade heute veröffentlichte Psi Mankoski einen Artikel über hohe Skalierbarkeit über warum und wie wir es gemacht haben, und die Leistungsverbesserung, die es im Vergleich zu GlibC malloc gegeben hat.
Wir haben tatsächlich eine Verringerung der RAM-Auslastung gesehen, weil wir die Debug-Fähigkeit von jemalloc nutzen konnten, um die 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 vorhersagbarer, schwebend zwischen ~ 22-40% abhängig vom Serverknoten.
Wie Preet sagt, gab es im Laufe der Zeit viel weniger Fragmentierung, was weniger RAM-Auslastung bedeutet. Psis Artikel gibt "Beweise im Pudding" hinter einer solchen Aussage.
Ich entwickle eine einfache NoSQL-Datenbank.
( Ссылка )
Wenn ich jemalloc verwende, sinkt die Leistung, aber die "Fragmentierung" des Speichers nimmt ebenfalls ab. Jemalloc scheint auch weniger Speicher auf dem Peak zu verwenden, aber die Differenz beträgt 5-6%.
Was ich mit Speicherfragmentierung meine, ist wie folgt.
In Standard-Malloc ist die Sprache fast wie auf dem Gipfel. (Ich habe speziell auf mmap Speicher überprüft und es gibt keine).
Mit jemalloc ist die Verwendung minimal.
Als ich das letzte Mal mit tcmalloc nachgesehen habe, war es wirklich sehr schnell - wahrscheinlich 10% Verbesserungen gegenüber Standard-malloc.
Auf der Spitze 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.