默认情况下,Elasticsearch告诉JVM使用堆的最小值和最大值的2GB。切换到生产时,保证Elasticsearch有足够的可用堆是非常重要的。
Elasticsearch将通过jvm.options中的Xms(堆的最小值)与Xmx(堆的最大值)设置来分配堆的大小。
这个值依赖于服务器上可用的RAM数量,好的设置规则如下:
不要设置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
文件中注释掉 Xms
与Xmx
设置,然后通过ES_JAVA_OPTS
来设置:
ES_JAVA_OPTS="-Xms2g -Xmx2g" ./bin/elasticsearch #①
ES_JAVA_OPTS="-Xms4000m -Xmx4000m" ./bin/elasticsearch #②
① 设置堆的最小值与最大值为2GB。
② 设置堆的最小值与最大值为4000MB。
注意
Windows服务配置堆的大小与上面方式不同。初始值可以在安装Windows服务时配置,但是安装完之后也可以调整。查阅Windows服务文档来获取更多信息。