加载中

JVM 设置

如果需要,您可以通过添加自定义选项文件(首选)或设置 ES_JAVA_OPTS 环境变量来覆盖默认的 JVM 选项。

JVM 选项文件的后缀必须是 .options,并且包含以换行符分隔的 JVM 参数列表。JVM 按字典顺序处理选项文件。

您将 JVM 选项文件放在哪里取决于安装类型

  • tar.gz 或 .zip:将自定义 JVM 选项文件添加到 config/jvm.options.d/
  • Debian 或 RPM:将自定义 JVM 选项文件添加到 /etc/elasticsearch/jvm.options.d/
  • Docker:将自定义 JVM 选项文件绑定挂载到 /usr/share/elasticsearch/config/jvm.options.d/
警告

通常不建议设置您自己的 JVM 选项,这可能会对性能和稳定性产生负面影响。在大多数情况下,建议使用 Elasticsearch 提供的默认值。

注意

请勿修改根 jvm.options 文件。请改用 jvm.options.d/ 中的文件。

JVM 选项文件包含以换行符分隔的 JVM 参数列表。参数前面带有破折号 (-)。要将设置应用于特定版本,请在前面加上版本或版本范围,后面跟一个冒号。

  • 将设置应用于所有版本

    -Xmx2g
    		
  • 将设置应用于特定版本

    17:-Xmx2g
    		
  • 将设置应用于版本范围

    17-18:-Xmx2g
    		

    要将设置应用于特定版本及任何更高版本,请省略范围的上限。例如,此设置适用于 Java 17 及更高版本

    17-:-Xmx2g
    		

空行会被忽略。以 # 开头的行将被视为注释并被忽略。未被注释掉且未被识别为有效 JVM 参数的行将被拒绝,并且 Elasticsearch 将无法启动。

在生产环境中,请使用 JVM 选项文件来覆盖默认设置。在测试和开发环境中,您还可以通过 ES_JAVA_OPTS 环境变量来设置 JVM 选项。

export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djava.io.tmpdir=/path/to/temp/dir"
./bin/elasticsearch
		

如果您使用的是 RPM 或 Debian 软件包,则可以在系统配置文件中指定 ES_JAVA_OPTS

注意

Elasticsearch 会忽略 JAVA_TOOL_OPTIONSJAVA_OPTS 环境变量。

默认情况下,Elasticsearch 会根据节点的角色和总内存自动设置 JVM 堆大小。对于大多数生产环境,建议使用默认大小。

要覆盖默认堆大小,请设置最小和最大堆大小设置 XmsXmx。最小值和最大值必须相同。

堆大小应基于可用的 RAM

  • XmsXmx 设置为不超过每个 Elasticsearch 节点可用总内存的 50%。除 JVM 堆之外,Elasticsearch 还需要内存用于其他用途。例如,Elasticsearch 使用堆外缓冲区进行高效的网络通信,并依赖操作系统的文件系统缓存来高效访问文件。JVM 本身也需要一些内存。Elasticsearch 使用的内存超过 Xmx 设置配置的限制是正常的。

    注意

    当在容器(例如 Docker)中运行时,Elasticsearch 可用的总内存是指容器内可用的内存量,而不是主机上的总系统内存。

    如果您在同一台主机或同一个容器中运行多个 Elasticsearch 节点,则所有节点的堆大小总和不应超过可用总内存的 50%。

    在计算 Elasticsearch 可用的总内存时,请考虑在同一主机或同一容器中运行的其他进程的内存使用情况。

    50% 的指导原则旨在作为堆大小的安全上限。您可能会发现小于此最大值的堆大小能提供更好的性能,例如通过允许您的操作系统使用更大的文件系统缓存。

    如果您将堆大小设置得过大,Elasticsearch 的性能可能会变差,并且节点可能会被操作系统终止。

  • XmsXmx 设置为不超过压缩普通对象指针 (oops) 的阈值。确切的阈值有所不同,但在大多数系统上 26GB 是安全的,在某些系统上可以高达 30GB。要验证您是否低于该阈值,请检查 Elasticsearch 日志中是否有类似以下内容的条目

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

    或者使用节点信息 API 检查节点的 jvm.using_compressed_ordinary_object_pointers

    				GET _nodes/_all/jvm
    		

Elasticsearch 可用的堆越多,它可用于其内部缓存的内存就越多。这留给操作系统用于文件系统缓存的内存就越少。更大的堆也可能导致更长的垃圾回收暂停时间。

要配置堆大小,请将 XmsXmx JVM 参数添加到扩展名为 .options 的自定义 JVM 选项文件中,并将其存储在 jvm.options.d/ 目录中。例如,要将最大堆大小设置为 2GB,请将 XmsXmx 都设置为 2g

-Xms2g
-Xmx2g
		

为了进行测试,您还可以使用 ES_JAVA_OPTS 环境变量来设置堆大小

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

ES_JAVA_OPTS 变量会覆盖所有其他 JVM 选项。我们不建议在生产环境中使用 ES_JAVA_OPTS

注意

如果您将 Elasticsearch 作为 Windows 服务运行,则可以使用服务管理器更改堆大小。请参阅在 Windows 上安装并作为服务运行 Elasticsearch

根据您的 Stack 版本,Elasticsearch 默认将 JVM 配置为在内存不足异常时将堆转储到以下位置

  • 默认日志目录
  • 默认数据目录

目录位置

如果此路径不适合接收堆转储,请修改或添加 jvm.options 中的 -XX:HeapDumpPath=... 条目

  • 如果您指定一个目录,JVM 将根据运行实例的 PID 为堆转储生成一个文件名。
  • 如果您指定一个固定的文件名而不是目录,当 JVM 需要在内存不足异常时执行堆转储时,该文件必须不存在。否则,堆转储将会失败。

默认情况下,Elasticsearch 启用垃圾回收 (GC) 日志。这些日志在 jvm.options 中进行配置,并输出到与 Elasticsearch 日志相同的默认位置。默认配置每 64 MB 轮转一次日志,最多可占用 2 GB 的磁盘空间。

您可以使用 JEP 158: Unified JVM Logging 中描述的命令行选项重新配置 JVM 日志记录。除非您直接更改默认的 jvm.options 文件,否则 Elasticsearch 的默认配置将在您的自定义设置之外应用。要禁用默认配置,请先通过提供 -Xlog:disable 选项来禁用日志记录,然后提供您自己的命令行选项。这会禁用所有 JVM 日志记录,因此请务必检查可用选项并启用您所需的一切。

要查看原始 JEP 中未包含的其他选项,请参阅 使用 JVM 统一日志框架启用日志记录

通过创建包含一些示例选项的 $ES_HOME/config/jvm.options.d/gc.options,将默认的 GC 日志输出位置更改为 /opt/my-app/gc.log

# Turn off all previous logging configurations
-Xlog:disable

# Default settings from JEP 158, but with `utctime` instead of `uptime` to match the next line
-Xlog:all=warning:stderr:utctime,level,tags

# Enable GC logging to a custom location with a variety of options
-Xlog:gc*,gc+age=trace,safepoint:file=/opt/my-app/gc.log:utctime,level,pid,tags:filecount=32,filesize=64m
		

配置 Elasticsearch Docker 容器将 GC 调试日志发送到标准错误 (stderr)。这使容器编排器能够处理输出。如果使用 ES_JAVA_OPTS 环境变量,请指定

MY_OPTS="-Xlog:disable -Xlog:all=warning:stderr:utctime,level,tags -Xlog:gc=debug:stderr:utctime"
docker run -e ES_JAVA_OPTS="$MY_OPTS"
		

默认情况下,Elasticsearch 将 JVM 配置为将致命错误日志写入默认日志目录。在 RPMDebian 软件包上,此目录为 /var/log/elasticsearch。在 Linux 和 MacOS 以及 Windows 发行版上,logs 目录位于 Elasticsearch 安装的根目录下。

这些是 JVM 遇到致命错误(例如段错误)时产生的日志。如果此路径不适合接收日志,请修改 jvm.options 中的 -XX:ErrorFile=... 条目。

Elasticsearch 运行在启用安全管理器的环境中。在启用安全管理器的环境下,JVM 默认会无限期缓存正向主机名解析,并默认缓存负向主机名解析十秒钟。

Elasticsearch 通过默认值覆盖了此行为,将正向查找缓存六十秒,将负向查找缓存十秒。这些值应该适用于大多数环境,包括 DNS 解析随时间变化的环境。

如果这些默认值不合适,您可以进行编辑

  • 缓存正向查找:es.networkaddress.cache.ttl
  • 缓存负向查找:es.networkaddress.cache.negative.ttl

Java 安全策略中的 networkaddress.cache.ttl=<timeout>networkaddress.cache.negative.ttl=<timeout> 值会被 Elasticsearch 忽略,除非您移除 es.networkaddress.cache.ttles.networkaddress.cache.negative.ttl 的设置。

© . This website operates independently and is not affiliated with or endorsed by Elasticsearch B.V. All brand names, logos, and trademarks are the property of their respective owners.