Wie kann ich für LevelDB die Leistung von zufälligen Schreibvorgängen genauso wie den behaupteten „offiziellen“ Leistungsbericht ermitteln?

StackOverflow https://stackoverflow.com/questions/9397244

Frage

Auf der offiziellen Website von leveldb (http://code.google.com/p/leveldb/) gibt es einen Leistungsbericht. Ich habe wie unten eingefügt.

Unten ist vom offiziellen Leveldb-Benchmark

Hier ist ein Leistungsbericht (mit Erläuterungen) aus der Ausführung des enthaltenen Programms db_bench. Die Ergebnisse sind etwas verrauscht, sollten jedoch ausreichen, um eine Schätzung der Ballpark-Leistung zu erhalten.

Setup

Wir verwenden eine Datenbank mit einer Million Einträgen. Jeder Eintrag hat einen 16-Byte-Schlüssel und einen 100-Byte-Wert. Die vom Benchmark verwendeten Werte werden auf etwa die Hälfte ihrer ursprünglichen Größe komprimiert. LevelDB: Version 1.1

CPU: 4 x Intel (R) Core (TM) 2 Quad-CPU Q6600 bei 2,40 GHz

CPUCache: 4096 KB

Schlüssel: jeweils 16 Byte

Werte: jeweils 100 Byte (50 Byte nach der Komprimierung)

Einträge: 1000000

Rohgröße: 110,6 MB (geschätzt)

Dateigröße: 62,9 MB (geschätzt)

Schreibleistung

Die "Füll" -Benchmarks erstellen eine brandneue Datenbank, entweder in sequentieller oder zufälliger Reihenfolge.

Der Benchmark "fillsync" löscht nach jedem Vorgang Daten vom Betriebssystem auf die Festplatte. Bei den anderen Schreibvorgängen bleiben die Daten eine Weile im Puffercache des Betriebssystems. Der Benchmark "Überschreiben" führt zufällige Schreibvorgänge durch, mit denen vorhandene Schlüssel in der Datenbank aktualisiert werden.

fillseq: 1,765 Mikros / op; 62,7 MB / s

Fillsync: 268,409 Mikros / Op; 0,4 MB / s (10000 ops)

Fillrandom: 2,460 Mikros / Op; 45,0 MB / s

überschreiben: 2,380 Mikros / op; 46,5 MB / s

Jedes "op" oben entspricht einem Schreibvorgang eines einzelnen Schlüssel / Wert-Paares. Das heißt, ein Benchmark für zufälliges Schreiben liegt bei ungefähr 400.000 Schreibvorgängen pro Sekunde .

Unten ist aus meinem Leveldb-Benchmark

Ich habe einen Benchmark für Leveldb durchgeführt, aber die Schreibgeschwindigkeit war 100-mal geringer als im Bericht.

Hier sind meine Experimenteinstellungen:

  1. CPU: Intel Core2 Duo T6670 2,20 GHz
  2. 3,0 GB Speicher
  3. 32-Bit-Windows 7
  4. ohne Komprimierung
  5. options.write_buffer_size= 100MB
  6. options.block_cache= 640MB

    Was ich getan habe, ist sehr einfach: Ich habe nur 2 Millionen {Schlüssel, Wert} und überhaupt keine Lesevorgänge eingegeben. Der Schlüssel ist ein Byte-Array mit 20 zufälligen Bytes, und der Wert ist auch ein Byte-Array mit 100 zufälligen Bytes. Ich habe ständig 2 Millionen Mal einen neuen zufälligen {Schlüssel, Wert} eingegeben, ohne dass eine andere Operation durchgeführt wurde.

    In meinem Experiment kann ich sehen, dass die Schreibgeschwindigkeit von Anfang an abnimmt. Die augenblickliche Geschwindigkeit (Messung der Geschwindigkeit aller 1024 Schreibvorgänge) schwankt zwischen 50 / s und 10.000 / s. Und meine durchschnittliche Schreibgeschwindigkeit für 2 Millionen Paare liegt bei 3.000 / s. Die Spitzengeschwindigkeit beim Schreiben beträgt 10.000 / s.

    Da in dem Bericht behauptet wurde, dass die Schreibgeschwindigkeit 400.000 / s betragen kann, ist die Schreibgeschwindigkeit meines Benchmarks 40- bis 130-mal langsamer und ich frage mich nur, was mit meinem Benchmark nicht stimmt.

    Ich muss meine Testcodes hier nicht einfügen, da dies sehr einfach ist. Ich habe nur 2 Millionen Mal eine while-Schleife und innerhalb der Schleife generiere ich für jede Iteration 20 Byte Schlüssel und 100 Wertbytes, und legen Sie sie dann in der leveldb-Datenbank ab. Ich habe auch die Zeit gemessen, die für die Generierung von {Schlüssel, Wert} aufgewendet wurde. Sie kostet 0 ms.

    Kann mir jemand dabei helfen? Wie kann ich mit leveldb eine Schreibgeschwindigkeit von 400.000 / s erreichen? Welche Einstellungen sollte ich verbessern?

    Danke

    Außerdem

    Ich habe gerade die offizielle Datei db_bench.cc auf meinem Machie ausgeführt. Es ist 28 Mal langsamer als der Bericht.

    Ich denke, da ich ihr eigenes Benchmark-Programm verwendet habe, ist der einzige Unterschied zwischen meinem und ihrem Benchmark die Maschine.

War es hilfreich?

Lösung

Sie haben 2 Millionen Schlüssel-Wert-Paare und jedes Schlüssel-Wert-Paar besteht aus insgesamt 120 Bytes, also 2 Millionen * 120 Bytes= 228 MB Daten! Ihr Cache ist 640 MB groß, daher ist es durchaus möglich, dass sich alle Ihre Daten noch im RAM befinden und nie wirklich auf die Festplatte gelangen. Wie Kitsune betonte: Ihre Hardware ist bei weitem nicht so schnell wie die, mit der Google getestet hat, und wenn Google dieselbe Cache-Größe hätte, könnte leicht einen 30-fachen Unterschied erzeugen.

Andere potenzielle Probleme:

  • Es ist schwierig, genau zu wissen, wie "zufällig" die Schlüssel waren: LevelDB funktioniert je nach Verteilung der Schlüssel unterschiedlich (auch wenn es "zufällig" ist).
  • 20-Byte-Schlüssel wären weniger effizient als 16-Byte-Schlüssel, da sie nicht so gut ausgerichtet sind.
  • Abhängig von Ihrer Festplatte ist die Schreibgeschwindigkeit Ihrer Festplatte möglicherweise langsamer ( Sie überprüfen Ihre ).

    Wir können weiter und weiter und weiter machen, aber es gibt einfach zu viele Variablen, um sie zu berücksichtigen. Wenn Sie Code veröffentlichen, der zeigt, wie Ihr Test ausgeführt wird, können wir einige Optimierungen empfehlen, damit Sie eine bessere Leistung erzielen.

Andere Tipps

Wenn Sie denselben Benchmark auf völlig anderer Hardware ausführen, werden Sie zwangsläufig einige Unterschiede feststellen.

  • Ihre CPU ist ~ 9x schwächer 2xCores@2.2GHz vs 16xCores@2.4GHz
  • Ihre Festplatte und das Laufwerk des offiziellen Benchmarks wurden nicht erwähnt (Glasfaser-NAS gegenüber einer Solid-State-Laufwerk-SSD gegenüber einer Festplatten-Festplatte)

    Äpfel können nicht mit Orangen oder Äpfel mit [unbekannten Früchten] verglichen werden.

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