原英文版地址: https://www.elastic.co/guide/en/elasticsearch/reference/7.7/heap-size.html, 原文档版权归 www.elastic.co 所有
本地英文版地址: ../en/heap-size.html

设置堆大小

默认情况下,Elasticsearch 告诉 JVM 使用的堆的最小和最大值为 1 GB。 当转移到生产环境时,配置堆大小以确保 Elasticsearch 有足够的堆可用是很重要的。

Elasticsearch 将根据 jvm.options 中设置的 Xms(最小堆大小) 和 Xmx(最大堆大小) 来分配整个堆。 你应该将这两个设置设置为彼此相等。

这些设置的值取决于服务器上可用的RAM容量:

  • XmxXms 设置为不超过物理RAM的50%。 Elasticsearch需要内存用于JVM堆以外的其他用途,为此预留空间很重要。 例如,Elasticsearch使用堆外缓冲区进行高效的网络通信,依赖于操作系统的文件系统缓存进行高效的文件访问,而JVM本身也需要一些内存。 观察到Elasticsearch进程使用的内存超过 Xmx 设置配置的限制是正常的。
  • XmxXms设置为不超过JVM用于压缩对象指针的阈值(compressed oops);确切的阈值有所不同,但接近32 GB。 可以通过在日志中查找如下行来验证是否低于阈值:

    heap size [1.9gb], compressed ordinary object pointers [true]
  • 理想情况下,将 XmxXms 设置为不超过基于零的压缩对象指针的阈值;确切的阈值各不相同,但 26 GB 在大多数系统上是安全的,但在某些系统上可能高达 30 GB。 可以通过使用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.d/ 文件设置堆大小的示例:

-Xms2g 
-Xmx2g 

将堆大小的最小值设置为 2g

将堆大小的最大值设置为 2g

也可以通过环境变量来设置堆大小。 这可以通过 ES_JAVA_OPTS 设置这些值来实现:

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

设置堆大小的最大和最小值为 2 GB

设置堆大小的最大和最小值为 4000 MB

Windows 服务 配置堆的方式与上面的不同。 最初为Windows服务设置的值可以如上所述进行配置,但在安装服务后会有所不同。更多详细信息,请参考 Windows服务文档