在jvm.options中设置JVM堆大小

在jvm.options中设置JVM堆大小

默认情况下,Elasticsearch告诉JVM使用堆的最小值和最大值的2GB。切换到生产时,保证Elasticsearch有足够的可用堆是非常重要的。

Elasticsearch将通过jvm.options中的Xms(堆的最小值)与Xmx(堆的最大值)设置来分配堆的大小。

这个值依赖于服务器上可用的RAM数量,好的设置规则如下:

  • 堆的最小值(Xms)与堆的最大值(Xmx)设置成相同的。
  • Elasticsearch的可用堆越大,它能在内存中缓存的数据越多。但是需要注意堆越大在垃圾回收时造成的暂停会越长。
  • 设置Xmx不要大于物理内存的50%。用来确保有足够多的物理内存预留给操作系统缓存。
  • 不要设置Xmx超过JVM用来压缩对象指针的cutoff(compressed oops);精确的cutoff可能不同,但接近于32GB。你可以通过在日志中查找一条类似于下面的这条信息来确定这个cutoff限制。

    source-shell heap size [1.9gb], compressed ordinary object pointers [true]

  • 最好尽量保持低于zero-based compressed oop的阈值;精确的cutoff可能不同,但大多数系统26GB是安全的,但是在某些系统可能多达30GB。你可以通过JVM的XX:+UnlockDiagnosticVMOptions -XX:+PrintCompressedOopsMode参数来验证限制,并通过类似如下的行来确定:

    source-shell heap address: 0x000000011be00000, size: 27648 MB, zero based Compressed Oops

    如果是开启了zero-based compressed oop则

    source-shell heap address: 0x0000000118400000, size: 28672 MB, Compressed Oops with base: 0x00000001183ff000

下面演示了如何通过jvm.options文件来配置堆大小:

-Xms2g #①
-Xmx2g #②

① 设置堆的最小值为2g。


② 设置堆的最大值为2g。

他们同样也能通过环境变量来设置。先需要在jvm.options文件中注释掉 XmsXmx设置,然后通过ES_JAVA_OPTS来设置:

ES_JAVA_OPTS="-Xms2g -Xmx2g" ./bin/elasticsearch #①
ES_JAVA_OPTS="-Xms4000m -Xmx4000m" ./bin/elasticsearch #②

① 设置堆的最小值与最大值为2GB。


② 设置堆的最小值与最大值为4000MB。

注意

Windows服务配置堆的大小与上面方式不同。初始值可以在安装Windows服务时配置,但是安装完之后也可以调整。查阅Windows服务文档来获取更多信息。