Per LevelDB, come posso ottenere prestazioni di scritture casuali identiche a quelle del rapporto sulle prestazioni "ufficiali" dichiarato?

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

Domanda

Nel sito ufficiale di leveldb (http://code.google.com/p/leveldb/), è presente un rapporto sulle prestazioni.Ho incollato come di seguito.

Di seguito è riportato il benchmark ufficiale di leveldb

Ecco un rapporto sulle prestazioni (con spiegazioni) dall'esecuzione del programma db_bench incluso.I risultati sono un po' rumorosi, ma dovrebbero essere sufficienti per ottenere una stima approssimativa delle prestazioni.

Impostare

Usiamo un database con un milione di voci.Ogni voce ha una chiave di 16 byte e un valore di 100 byte.I valori utilizzati dal benchmark si comprimono a circa la metà della loro dimensione originale.DB di livello:versione 1.1

PROCESSORE:4 CPU Intel(R) Core(TM)2 Quad Q6600 a 2,40 GHz

Cache CPU:4096KB

Chiavi:16 byte ciascuno

Valori:100 byte ciascuno (50 byte dopo la compressione)

Inserimenti:1000000

Dimensione grezza:110,6 MB (stimato)

Dimensione del file:62,9 MB (stimato)

Scrivi prestazioni

I benchmark di "riempimento" creano un database completamente nuovo, in ordine sequenziale o casuale.

Il benchmark "fillsync" scarica i dati dal sistema operativo al disco dopo ogni operazione;le altre operazioni di scrittura lasciano i dati nella cache del buffer del sistema operativo per un po'.Il benchmark "sovrascrittura" esegue scritture casuali che aggiornano le chiavi esistenti nel database.

fillseq:1.765 micro/operativa;62,7 MB/sec

fillsync:268.409 micro/operativa;0,4 MB/s (10.000 operazioni)

riempimentocasuale:2.460 micro/operazione;45,0 MB/sec

sovrascrivi:2.380 micro/operativa;46,5 MB/sec

Ciascuna "operazione" sopra corrisponde alla scrittura di una singola coppia chiave/valore.Cioè, va a un benchmark di scrittura casuale circa 400.000 scritture al secondo.

Di seguito è riportato il benchmark My leveldb

Ho eseguito alcuni benchmark per leveldb ma ho ottenuto una velocità di scrittura 100 volte inferiore rispetto al rapporto.

Ecco le impostazioni del mio esperimento:

  1. PROCESSORE:Intel Core2 Duo T6670 2,20 GHz
  2. Memoria da 3,0 GB
  3. Windows 7 a 32 bit
  4. senza compressione
  5. opzioni.write_buffer_size = 100 MB
  6. opzioni.block_cache = 640 MB

Quello che ho fatto è molto semplice:Ho appena inserito 2 milioni di {chiave, valore} e nessuna lettura.La chiave è un array di byte con 20 byte casuali e anche il valore è un array di byte con 100 byte casuali.Inserisco costantemente una nuova {chiave, valore} casuale per 2 milioni di volte, senza alcuna altra operazione.

Nel mio esperimento, posso vedere che la velocità di scrittura diminuisce fin dall'inizio.La velocità istantanea (che misura la velocità di ogni 1024 scritture) oscilla tra 50/s e 10.000/s.E la mia velocità media complessiva di scrittura per 2 milioni di coppie è di circa 3.000/s.La velocità di picco delle scritture è 10.000/s.

Poiché il rapporto affermava che la velocità di scrittura può essere 400.000/s, la velocità di scrittura del mio benchmark è da 40 a 130 volte più lenta e mi sto solo chiedendo cosa c'è che non va nel mio benchmark.

Non ho bisogno di incollare qui i miei codici di test perché è semplicissimo, ho solo un ciclo while per 2 milioni di volte e all'interno del ciclo, per ogni iterazione, genero 20 byte di chiave e 100 byte di valore e quindi inserirli nel database leveldb.Ho anche misurato il tempo impiegato nella generazione di {key, value}, costa 0 ms.

Qualcuno mi può aiutare con questo?Come posso raggiungere una velocità di scrittura di 400.000/s con leveldb?Quali impostazioni dovrei migliorare?

Grazie

Inoltre

Ho appena eseguito il db_bench.cc ufficiale sulla mia macchina.È 28 volte più lento del rapporto.

Penso che poiché ho utilizzato il loro programma di benchmark, l'unica differenza tra il mio benchmark e il loro è la macchina.

È stato utile?

Soluzione

Hai 2 milioni di coppie chiave-valore e ciascuna coppia chiave-valore è un totale di 120 byte, quindi 2 milioni * 120 byte = 228 MB di dati!La tua cache è di 640 MB, quindi è del tutto possibile che tutti i tuoi dati siano ancora nella RAM e non siano mai arrivati ​​​​sul disco.Come ha sottolineato Kitsune:il tuo hardware non è neanche lontanamente veloce come quello con cui Google ha testato e se Google avesse la stessa dimensione della cache, allora quello potrebbe facilmente produrre una differenza di 30 volte.

Altri potenziali problemi:

  • È difficile sapere esattamente quanto "casuali" fossero le chiavi:LevelDB funziona in modo diverso a seconda della distribuzione delle chiavi (anche se è "casuale").
  • Le chiavi da 20 byte sarebbero meno efficienti delle chiavi da 16 byte, perché non si allineano altrettanto bene.
  • A seconda del disco rigido, la velocità di scrittura del disco potrebbe essere più lenta (controlla il tuo).

Possiamo andare avanti all’infinito, ma ci sono troppe variabili da considerare.Se pubblichi del codice che dimostra come viene eseguito il test, possiamo consigliare alcune ottimizzazioni in modo da poter ottenere prestazioni migliori.

Altri suggerimenti

Quando esegui lo stesso benchmark su hardware completamente diverso, noterai sicuramente alcune differenze.

  • La tua CPU è ~ 9 volte più debole 2xCores@2.2GHz vs 16xCores@2.4GHz
  • Il tuo disco rigido e il disco del benchmark ufficiale non sono stati menzionati (NAS in fibra vs SSD per unità a stato solido vs HDD per unità disco rigido)

Impossibile confrontare le mele con le arance o le mele con [frutto sconosciuto].

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top