Elasticsearch Best JVM GC Configuration

Elasticsearch Best JVM GC Configuration

Merhaba arkadaşlar;

Bu anlatımımda sizlere Elasticsearch’te bir çok kişinin merak ettiği ve sorun yaşadığı yapılandırmalardan olan JVM GC yapılandırmasında kullandığım parametreleri paylaşacağım.

Öncelikle belirtmem gerekirse Ubuntu 18 LTS sürümü üzerinde kurulu Elasticsearch 7.8.0 sürümünü kullanmaktayım. 18 Data node ve 2 Client node olmak üzere 20 adet node ile kurulumuş clusterıma günde 100.000.000’larca bulk data gelmektedir.

7.8.0 versiyonuna geçtiğimizde bazı heap size sıkıntıları yaşadık. Nodelarımız clusterdan düşüyor ve tekrar bağlanıyordu. Hatta bazen crash olan nodelarımız bile oluyordu. Clusterımız bir gün bile dayanamadan cevap vermez hale geliyordu. Bizde bunun JVM GC sorunu olduğunu keşfettik. Java memory sorunu yaşatıyordu. Bizde uzun arayışlarda bulunduktan sonra ve bir çok döküman okuduktan sonra alttaki yapılandırmanın en iyi yapılandırma olduğunu kabul ettik.

Bu oluşturduğumuz yapılandırmayı clusterımıza uyguladıktan sonra 1 aydan fazla süre gözlem yaptık ve clusterımıza sihirli çubuk değmiş gibi tüm heap size sorunlarımız çözüldü ve performans artışı yaşadık.

Bu şekilde tüm sorunlarımızın çözülmesinin ardından bu yapılandırmamızı benzer diğer dev clusterlarımıza uyguladık ve sonuç: MÜKEMMEL

JVM yapılandırma dosyasına erişebilmek için aşağıdaki dosyayı açmanız gerekmektedir

sudo nano /etc/elasticsearch/jvm.options

JVM yapılandırma dosyam aşağıdaki gibidir:

## JVM configuration
#-XX:GPGCTargetPeakHeapOccupancyPercent=95

################################################################
## IMPORTANT: JVM heap size
################################################################
##
## You should always set the min and max JVM heap
## size to the same value. For example, to set
## the heap to 4 GB, set:
##
## -Xms4g
## -Xmx4g
##
## See https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html
## for more information
##
################################################################

# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space

#-Xms32700m
#-Xmx32700m
#-Xmx32700m


-XX:NewSize=11095310336
-XX:OldSize=22190686208
-Xms31G
-Xmx31G
-XX:ParallelGCThreads=32
-XX:NewRatio=2
-XX:+UseConcMarkSweepGC
-XX:+UnlockDiagnosticVMOptions
-XX:+PrintFlagsFinal



################################################################
## Expert settings
################################################################
##
## All settings below this section are considered
## expert settings. Don't tamper with them unless
## you understand what you are doing
##
################################################################

## GC configuration
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=75
-XX:+UseCMSInitiatingOccupancyOnly

#-XX:+UseG1GC
#-XX:MaxGCPauseMillis=400

## G1GC Configuration
# NOTE: G1GC is only supported on JDK version 10 or later.
# To use G1GC uncomment the lines below.
# 10-:-XX:-UseConcMarkSweepGC
# 10-:-XX:-UseCMSInitiatingOccupancyOnly
# 10-:-XX:+UseG1GC
# 10-:-XX:G1ReservePercent=25
# 10-:-XX:InitiatingHeapOccupancyPercent=30

## JVM temporary directory
-Djava.io.tmpdir=${ES_TMPDIR}

## heap dumps

# generate a heap dump when an allocation from the Java heap fails
# heap dumps are created in the working directory of the JVM
-XX:+HeapDumpOnOutOfMemoryError

# specify an alternative path for heap dumps; ensure the directory exists and
# has sufficient space
-XX:HeapDumpPath=/var/lib/elasticsearch

# specify an alternative path for JVM fatal error logs
-XX:ErrorFile=/var/log/elasticsearch/hs_err_pid%p.log

## JDK 8 GC logging
8:-XX:+PrintGCDetails
8:-XX:+PrintGCDateStamps
8:-XX:+PrintTenuringDistribution
8:-XX:+PrintGCApplicationStoppedTime
8:-Xloggc:/var/log/elasticsearch/gc.log
8:-XX:+UseGCLogFileRotation
8:-XX:NumberOfGCLogFiles=32
8:-XX:GCLogFileSize=64m

# JDK 9+ GC logging
9-:-Xlog:gc*,gc+age=trace,safepoint:file=/var/log/elasticsearch/gc.log:utctime,pid,tags:filecount=32,filesize=64m

Unutmadan son olarak söylemem gerekirse her node 64 GB Ram, 32 Adet CPU’ya sahiptir.

Heap Size ile ilgili aşağıdaki parametlereleri kendi memory miktarınıza göre değiştirmeyi unutmayınız.

-XX:NewSize=11095310336
-XX:OldSize=22190686208
-Xms31G
-Xmx31G

Alttaki parametreyi CPU sayınıza göre değiştirmeyi unutmayınız.

-XX:ParallelGCThreads=32

Elasticsearch Best JVM GC Configuration anlatımımızın da sonuna gelmiş bulunmaktayız. Bir dahaki anlatımda görüşmek üzere…