Ich brauche einen plattenbasierten Schlüsselwertspeicher, der hohe Schreib- und Leseleistung für große Datenmengen aufrechterhalten kann. Großartige Bestellung, ich weiß.
Ich probiere die C BerkeleyDB (5.1.25) -Bibliothek von Java und sehe ernsthafte Leistungsprobleme.
Ich bekomme für kurze Zeit solide 14K Dokumente / s, aber sobald ich ein paar hunderttausend Dokumente erreiche, fällt die Leistung wie ein Stein, dann erholt sie sich für eine Weile, fällt dann wieder ab usw. Das passiert mehr und häufiger, bis zu dem Punkt, an dem ich nicht mehr als 60 Dokumente / s mit vereinzelten Spitzen von 12 KByte / s nach 10 Mio. Dokumenten erreichen kann. Mein DB-Typ der Wahl ist HASH, aber ich habe auch BTREE versucht und es ist das gleiche.
Ich habe versucht, einen Pool von 10 db's zu verwenden und die Dokumente unter ihnen zu hashen, um die Leistungseinbrüche auszugleichen; dies erhöhte den Schreibdurchsatz auf 50 KByte / s, half aber nicht bei den Leistungseinbrüchen: alle 10 Datenbänke verlangsamten sich gleichzeitig auf einen Crawl.
Ich nehme an, dass die Dateien reorganisiert werden, und ich habe versucht, einen config-Parameter zu finden, der beeinflusst, wann diese Reorganisation stattfindet, so dass jede der gepoolten dbs zu einem anderen Zeitpunkt reorganisiert, aber ich konnte nichts finden, was funktionierte . Ich probierte verschiedene Cachegrößen aus und reservierte Speicherplatz mit der Konfigurationsoption setHashNumElements, so dass es keine Zeit brauchte, die Datei zu vergrößern, aber jede Optimierung machte es viel schlimmer.
Ich gebe Berkeleydb auf und versuche viel komplexere Lösungen wie Cassandra, aber ich möchte sicherstellen, dass ich in Berkeleydb nichts falsch mache, bevor ich es absetze.
Jemand hier mit Erfahrung erreicht nachhaltige Schreibleistung mit berkeleydb?
Bearbeiten 1 :
Ich habe schon mehrere Dinge ausprobiert:
Mit anderen Worten, selbst wenn ich die eingehenden Daten drossle, um unter der Hardwarefähigkeit zu bleiben und ram zum Halten von Objekten zu verwenden, während BerkeleyDB einige Zeit benötigt, um sich an das Wachstum anzupassen, nähert sich die Leistung langsam an, da sich die Performance 0 nähert. p>
Das überrascht mich, weil ich behauptet habe, dass es Terabytes an Daten verarbeiten kann, aber meine Tests zeigen etwas anderes. Ich hoffe immer noch, dass ich etwas falsch mache ...
Bearbeiten 2 :
Nach einigem Nachdenken und mit Peters Input verstehe ich jetzt, dass, wenn die Datei größer wird, ein Stapel Schreibvorgänge weiter auseinander breitet und die Wahrscheinlichkeit, dass sie in den gleichen Plattenzylinder fallen, sinkt, bis sie schließlich erreicht die Suche / zweite Begrenzung der Festplatte.
Aber die periodischen Dateireorganisationen von BerkeleyDB bringen die Performance viel früher zum Erliegen, und auf eine noch viel schlimmere Art und Weise: Sie reagiert einfach nicht mehr für immer längere Zeit, während sie Dinge herumschiebt. Die Verwendung schnellerer Datenträger oder die Verteilung der Datenbankdateien auf verschiedene Datenträger hilft nicht. Ich muss einen Weg finden, diese Durchsatzlöcher zu umgehen.
Was ich bei den hohen Schreibraten von Festplatten gesehen habe, ist, dass der Systemcache voll wird (bis zu diesem Zeitpunkt eine Aufhellungsleistung), aber sobald die Anwendung voll ist, kann sich sogar das ganze System dramatisch verlangsamen, sogar stoppen.
Ihre zugrunde liegende physische Festplatte sollte mindestens 100 Schreibvorgänge pro Sekunde ausführen. Mehr als das ist eine Illusion, die durch klarere Zwischenspeicherung unterstützt wird. ;) Wenn jedoch das Caching-System erschöpft ist, werden Sie sehr schlechtes Verhalten sehen.
Ich schlage vor, dass Sie einen Festplattencontroller-Cache in Betracht ziehen. Der batteriegepufferte Speicher muss ungefähr der Größe Ihrer Daten entsprechen.
Eine andere Option ist die Verwendung von SSD-Laufwerken, wenn die Updates stoßartig sind (sie können 10K + Schreibvorgänge pro Sekunde ausführen, da sie keine beweglichen Teile haben) und Caching. Dies sollte Ihnen mehr geben, als Sie benötigen, aber SSDs haben eine begrenzte Anzahl von Schreibvorgängen .
BerkeleyDB führt keine Dateireorganisationen durch, es sei denn, Sie rufen das Komprimierungsprogramm manuell auf. Es gibt mehrere Ursachen für die Verlangsamung:
Wenn Sie "Dokumente" sagen, meinen Sie damit, dass Sie BDB zum Speichern von Datensätzen verwenden, die größer als ein paar KByte sind? BDB-Überlaufseiten haben einen höheren Overhead. Daher sollten Sie eine größere Seitengröße in Betracht ziehen.
Das ist eine alte Frage und das Problem ist wahrscheinlich weg, aber ich hatte in letzter Zeit ähnliche Probleme (die Geschwindigkeit der Einfügung fiel dramatisch nach ein paar hunderttausend Datensätzen) und sie wurden gelöst, indem der Datenbank mehr Cache gegeben wurde (DB- & gt; set_cachesize). Mit 2GB Cache war die Insert-Geschwindigkeit sehr gut und mehr oder weniger konstant bis zu 10 Millionen Datensätze (habe ich nicht weiter getestet).
Wir haben BerkeleyDB (BDB) bei der Arbeit verwendet und scheinen ähnliche Leistungstrends zu haben. BerkeleyDB verwendet einen Btree, um seine Schlüssel / Wert-Paare zu speichern. Wenn die Anzahl der Einträge zunimmt, nimmt die Tiefe des Baums zu. BerkeleyDB-Caching funktioniert beim Laden von Bäumen in den RAM, so dass eine Baumdurchquerung keine Datei-IO (Lesen von Datenträger) verursacht.
Ich brauche einen plattenbasierten Schlüsselwertspeicher, der hohe Schreib- und Leseleistung für große Datenmengen unterstützt.
Chronikkarte ist eine moderne Lösung für diese Aufgabe. Es ist viel schneller als BerkeleyDB sowohl beim Lesen als auch beim Schreiben und ist viel besser skalierbar in Bezug auf den gleichzeitigen Zugriff von mehreren Threads / Prozesse.
Tags und Links java performance key-value berkeley-db