Elasticsearch Heapsize

Elasticsearch kommt out-of-the-box mit einer Heapsize von 1GB. Dies ist für ein Produktivsystem zu wenig. Um die Heapsize umzustellen gibt es zwei Möglichkeiten:
1. die Umgebungsvariable ES_HEAP_SIZE setzen, die beim Start ausgelesen wird
2. die JVM Flags anpassen

Um eine Heapsize von z.B. 8GB einzustellen würden die beiden Parameter dann wie folgt aussehen:
bei Variante 1: ES_HEAP_SIZE=8g
bei Variante 2: ES_JAVA_OPTS="-Xms8g -Xmx8g" ./bin/elasticsearch

Einzustellen ist Option 2 in der Datei /etc/elasticsearch/jvm.options, die Option 1 bei Ubuntu Systeme in der Datei /etc/defaults/elasticsearch

Die Werte für Xms und Xmx (min und max) sollten unbedingt identisch sein, damit eine Änderung der Heapgröße zur Laufzeit unbedngt vermieden wird, da dies ein sehr leistungshungriger Vorgang ist.

Man könnte nun denken "je mehr desto besser"- aber das trifft hier nicht zu. Elasticsearch ist nur eine der beiden "Datenbankkomponenten". Die andere, die mindestens genauso wichtig ist, ist Lucene. Da auch Lucene Speicher benötigt, sollte man sich auf max. 50% des verfügbaren RAMs für Elasticsearch beschränken. Lucene nutzt den Speicher- und Cachingmechanismus des Betriebssystems und bedient sich dann an den verbleibenden 50%.

Ein zweites Limit, das man bei der Verteilung von RAM für Elasticsearch keinesfalls überschreiten sollte, ist eine Heapsize von mehr als 31GB. Eine sehr gute Erklärung dafür findet man hier: www.elastic.co/guide/en/elasticsearch/guide/current/heap-sizing.html

Ob dieses Limit eingehalten wird, findet sich bei jedem Start von Elasticsearch im Logfiie in Form einer Zeile, die "compressed ordinary object pointers [true]" enthält. Findet sich diese, so ist alles im grünen Bereich.