検索ブログ

主に検索のことについて書いています。

Elasticsearchのヒープサイズチェック

Elasticsearchのヒープサイズチェックについて記す。

公式ドキュメント Heap size check と Set JVM heap size via jvm.options を参考にした。 www.elastic.co

www.elastic.co

検証環境: Elasticsearch 6.0.0-rc1

初期時と最大のヒープサイズが等しくないJVMを起動すると、システム使用中にヒープサイズが変更され一時停止する可能性がある。これを避けるには、初期時と最大のヒープサイズを等しくすることだ。加えて、bootstrap.memory_lock を有効にしていると、JVMは起動時に初期時のヒープサイズの値をロックする。

Elasticsearchのデフォルトでは、JVMが最小と最大で1GBのヒープを使用するよう設定されている。
Elasticsearchは、Xms(Setting initial and minimum heap size, 初期+最小ヒープサイズ)およびXmx(Setting maximum heap size,最大ヒープサイズ)の設定を介してjvm.optionsで指定されたヒープ全体を割り当てる。

これらの設定の値は、サーバーの使用可能なRAMの量によって異なる。公式サイトに掲載されている良い経験則は以下の通りである。

  • XmsとXmxを等しく設定する
  • Elasticsearchで利用可能なヒープサイズが大きいほど、キャッシュに使用できるメモリが増える。しかし、あまりにも大きなヒープサイズを設定する場合、ガベージコレクションのために長時間休止にする可能性があることに注意する。
  • Xmxを物理RAMの50%以下に設定して、カーネルファイルシステムのキャッシュ用に十分な物理RAMが残っていることを確認する。
  • JVMが圧縮オブジェクトポインタ(圧縮されたoops)に使用するカットオフよりも上にXmxを設定しない。正確なカットオフは異なるが32GBに近くなる。(これ正直、理解できていない。)次のように、/Users/sakura818uuu/elasticsearch-6.0.0-rc1/config/jvm.optionsを参照してみたがどこのログを見ればよいのかわからなかった。
bash-3.2$ ls
LICENSE.txt README.textile  bin     data        logs        plugins
NOTICE.txt  accounts.json   config      lib     modules
bash-3.2$ cd config/
bash-3.2$ pwd
/Users/sakura818uuu/elasticsearch-6.0.0-rc1/config
bash-3.2$ ls
elasticsearch.yml   jvm.options     log4j2.properties
bash-3.2$ cat jvm.options
## JVM configuration

################################################################
## 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

-Xms1g
-Xmx1g

################################################################
## 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

## optimizations

# pre-touch memory pages used by the JVM during initialization
-XX:+AlwaysPreTouch

## basic

# force the server VM
-server

# explicitly set the stack size
-Xss1m

# set to headless, just in case
-Djava.awt.headless=true

# ensure UTF-8 encoding by default (e.g. filenames)
-Dfile.encoding=UTF-8

# use our provided JNA always versus the system one
-Djna.nosys=true

# turn off a JDK optimization that throws away stack traces for common
# exceptions because stack traces are important for debugging
-XX:-OmitStackTraceInFastThrow

# flags to configure Netty
-Dio.netty.noUnsafe=true
-Dio.netty.noKeySetOptimization=true
-Dio.netty.recycler.maxCapacityPerThread=0

# log4j 2
-Dlog4j.shutdownHookEnabled=false
-Dlog4j2.disable.jmx=true

## 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=/heap/dump/path

## GC logging

#-XX:+PrintGCDetails
#-XX:+PrintGCTimeStamps
#-XX:+PrintGCDateStamps
#-XX:+PrintClassHistogram
#-XX:+PrintTenuringDistribution
#-XX:+PrintGCApplicationStoppedTime

# log GC status to a file with time stamps
# ensure the directory exists
#-Xloggc:${loggc}

# By default, the GC log file will not rotate.
# By uncommenting the lines below, the GC log file
# will be rotated every 128MB at most 32 times.
#-XX:+UseGCLogFileRotation
#-XX:NumberOfGCLogFiles=32
#-XX:GCLogFileSize=128M
  • さらに、ゼロベースの圧縮されたoopsのしきい値を下回るようにする。正確なカットオフは異なるが、ほとんどのシステムで26GBは安全だが、一部のシステムでは30GBまでの大きさになることがある。JVMのオプション -XX:+UnlockDiagnosticVMOptions -XX:+PrintCompressedOopsMode を使用してElasticsearchを起動しログをみることで制限を超えていることを確認できる。(これも正直理解できていない。)
bash-3.2$ java -XX:+UnlockDiagnosticVMOptions -XX:+PrintCompressedOopsMode -version

heap address: 0x00000006c0000000, size: 4096 MB, Compressed Oops mode: Zero based, Oop shift amount: 3

Narrow klass base: 0x0000000000000000, Narrow klass shift: 3
Compressed class space size: 1073741824 Address: 0x00000007c0000000 Req Addr: 0x00000007c0000000
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)

jvm.optionsファイルやES_JAVA_OPTSからヒープサイズを変更することができる。