2014-12-09 17 views
36

Sto eseguendo il benchmarking di ElasticSearch per scopi di throughput di indicizzazione molto elevati.ElasticSearch - throughput di indicizzazione elevata

Il mio obiettivo attuale è riuscire a indicizzare 3 miliardi (3.000.000.000) di documenti in poche ore. A tale scopo, attualmente dispongo di 3 macchine server Windows, con 16 GB di RAM e 8 processori ciascuno. I documenti inseriti hanno una mappatura molto semplice, contenente solo una manciata di campi numerici non analizzati (_all disabilitato).

Sono in grado di raggiungere circa 120.000 richieste di indice al secondo (monitoraggio utilizzando una grande scrivania), utilizzando questo rig relativamente modesto, e sono fiducioso che il rendimento possa essere ulteriormente aumentato. Sto usando un numero di client NEST .net per inviare le richieste di massa dell'indice, con 1500 operazioni di indice in blocco.

Sfortunatamente, il throughput di 120k richieste al secondo non dura molto a lungo, e il tasso diminuisce gradualmente, scendendo a ~ 15k dopo un paio d'ore.

Il monitoraggio delle macchine rivela che le CPU non sono il collo di bottiglia. Tuttavia, il tempo di inattività del disco fisico (non SSD) sembra essere in calo su tutte le macchine, raggiungendo meno del 15% del tempo di inattività.

L'impostazione da refresh_interval a 60 s, che a 300 s, e infine a 15 m, non sembra essere di grande aiuto. Spiando su una singola finestra di dialogo in un singolo frammento, ha mostrato che il translog viene svuotato ogni 30 minuti, prima di raggiungere 200 MB.

Ho provato con due strategie: sharding

  1. 1 indice, con 60 frammenti (senza repliche).
  2. 3 indici, con 20 frammenti ciascuno (nessuna replica).

Entrambi i tentativi si traducono in un'esperienza piuttosto simile, che a mio avviso ha senso poiché è lo stesso numero di frammenti.

Guardando i segmenti, vedo che la maggior parte dei frammenti ha ~ 30 segmenti impegnati e un numero simile di segmenti ricercabili. La dimensione del segmento varia. Un tempo, un tentativo di ottimizzare l'indice con max_num_segments = 1, sembrava avere un po 'di aiuto dopo che era finito (ha impiegato molto tempo).

In qualsiasi momento, l'avvio dell'intero processo di importazione dall'inizio, dopo l'eliminazione degli indici utilizzati e la creazione di nuovi, comporta lo stesso comportamento. Inizialmente alto indice di rendimento, ma gradualmente diminuendo, molto prima di raggiungere l'obiettivo di 3 miliardi di documenti. La dimensione dell'indice in quel momento è di circa 120 GB.

Sto usando la versione 1.4 di ElasticSearch. Xms e Xmx sono configurati per 8192 MB, il 50% della memoria disponibile. Il buffer di indicizzazione è impostato su 30%.

Le mie domande sono le seguenti:

  1. Supponendo che il disco è attualmente il collo di bottiglia di questo impianto di perforazione, è questo fenomeno di via via crescente utilizzo del disco è uno normale? In caso contrario, cosa si può fare per annullare questi effetti?
  2. È possibile eseguire regolazioni di precisione per aumentare il throughput dell'indicizzazione? Dovrei? o dovrei semplicemente scalare.
+0

Qual è l'ingombro della memoria di processo nel tempo? il throughput si stabilizza a 15k/s o continua a scendere? cosa sta per/da disco? (su Linux, alcuni di questi disponibili con ps o top, alcuni con strace) – Andras

+1

Non ricordo l'esatta impronta di memoria, aggiornerò domani. Tuttavia, ricordo un grafico piuttosto sano di un puzzle. Il tasso di indicizzazione sembra stabilizzarsi a 15k/s, tuttavia occorrerebbero ore per verificarlo. Su ogni macchina, il servizio elasticsearch esegue circa 2MG/s in scrittura (inizialmente - è molto meno quando la frequenza si attenua), e quando il disco è occupato, 50 - 80 MG/s legge. – Roman

+1

Stai specificando le chiavi per i documenti o stai permettendo a Elasticsearch di generare automaticamente gli ID? Hai provato a usare meno frammenti? –

risposta

36

Per farla breve, ho finito con 5 macchine virtuali Linux, 8 cpu, 16 GB, utilizzando puppet per distribuire elasticsearch. I miei documenti sono diventati un po 'più grandi, ma anche il tasso di throuhgput (leggermente). Sono riuscito a raggiungere in media 150.000 richieste di indici/secondo, indicizzando 1 miliardo di documenti in 2 ore. Il throughput non è costante, e ho osservato un comportamento di riduzione del throughput simile a quello precedente, ma in misura minore. Dal momento che userò indici giornalieri per la stessa quantità di dati, mi aspetto che questi parametri di rendimento siano all'incirca simili ogni giorno.

La transizione dalle macchine Windows a Linux è principalmente dovuta alla convenienza e alla conformità con le convenzioni IT. Anche se non lo so per certo, sospetto che gli stessi risultati potrebbero essere raggiunti anche su Windows.

In molte delle mie prove ho tentato l'indicizzazione senza specificare ID documento come suggerito da Christian Dahlqvist. I risultati sono stati sorprendenti. Ho osservato un aumento di throughput di in alcuni casi, raggiungendo 300k o superiore. La conclusione di questo è ovvia: non specificare ID documento, a meno che non sia assolutamente necessario.

Inoltre, sto usando meno frammenti per macchina, che ha anche contribuito all'aumento del throughput.

+4

Grazie per aver condiviso la tua ricerca, @Roman. Penso che valga la pena ricontrollare con le versioni 2.0, poiché secondo l'aggiornamento "Considerazioni sulle prestazioni per l'indicizzazione di Elasticsearch 2.0", l'ottimizzazione dell'identificazione automatica è stata rimossa in 2.0. https: //www.elastic.co/blog/performance-indexing-2-0 – mork

+0

Anche se la tua scelta di id doc può ancora influenzare le prestazioni: http://blog.mikemccandless.com/2014/05/choosing-fast-unique-identifier-uuid.html (questo è citato nel tuo articolo precedente) – JCoster22