預設情況下,Elasticsearch告訴JVM使用最小值和最大值為1 GB的堆。 在遷移到生産環境時,配置堆大小以確定Elasticsearch有足夠的可用堆是至關重要的。
Elasticsearch通過在jvm.options檔案中設定Xms(最小堆大小)和Xmx(最大堆大小)來指定的整個堆的大小。最小堆的大小和最大堆的大小應該相等。
這些設定的值取決于伺服器上可用的記憶體(RAM)數量:
- 将Xmx和Xms設定為不超過實體記憶體(RAM)的50%。 Elasticsearch需要的記憶體不僅僅用于JVM heap,為此預留出空間非常重要。 例如,Elasticsearch使用堆外緩沖區來進行有效的網絡通信,利用作業系統的檔案系統緩存來有效地通路檔案,并且JVM本身也需要一些記憶體。
- 不要将最大堆設定高于JVM用于壓縮對象指針的門檻值。确切的門檻值是有變化,但接近32gb。您可以通過在日志中查找以下内容來驗證您是否處于門檻值以下:
heap size [1.9gb], compressed ordinary object pointers [true]
- 最好嘗試保持在基于零基壓縮優化(Zero-Based Compressed oops)的門檻值以下,當确切的門檻值在大多數時候處于26GB是安全的。但是在某些系統中也可以等于30GB。您可以通過使用JVM選項-XX:+ UnlockDiagnosticVMOptions -XX:+ PrintCompressedOopsMode啟動Elasticsearch并查找類似于以下内容的行來驗證您是否處于此門檻值以下:
heap address: 0x000000011be00000, size: 27648 MB, zero based Compressed Oops
該内容顯示了啟用零基壓縮優化。如果零基壓縮優化未啟用,你将看到以下内容:
heap address: 0x0000000118400000, size: 28672 MB, Compressed Oops with base: 0x00000001183ff000
Elasticsearch可用的堆越多,它可用于其内部緩存的記憶體就越多,但可供作業系統用于檔案系統緩存的記憶體就越少。 同樣,較大的堆可能導緻較長的垃圾回收暫停。
以下是有關如何通過jvm.options檔案設定堆大小的示例:
-Xms2g #設定最小堆的值為2g-Xmx2g #設定組大堆的值為2g
也可以通過環境變量設定堆大小。 這可以通過注釋掉jvm.options檔案中的Xms和Xmx設定并通過ES_JAVA_OPTS設定這些值來完成:
ES_JAVA_OPTS="-Xms2g -Xmx2g" ./bin/elasticsearch #設定最小和最大堆的值為2gES_JAVA_OPTS="-Xms4000m -Xmx4000m" ./bin/elasticsearch #設定最小和最大堆的值為 4000M
注意:Windows服務的堆配置與上述不同。 可以為Windows服務初始填充的值可以如上所述配置,但在安裝服務後會有所不同。