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_OPTIONS 和 JAVA_OPTS 环境变量。
默认情况下,Elasticsearch 会根据节点的角色和总内存自动设置 JVM 堆大小。对于大多数生产环境,建议使用默认大小。
要覆盖默认堆大小,请设置最小和最大堆大小设置 Xms 和 Xmx。最小值和最大值必须相同。
堆大小应基于可用的 RAM
将
Xms和Xmx设置为不超过每个 Elasticsearch 节点可用总内存的 50%。除 JVM 堆之外,Elasticsearch 还需要内存用于其他用途。例如,Elasticsearch 使用堆外缓冲区进行高效的网络通信,并依赖操作系统的文件系统缓存来高效访问文件。JVM 本身也需要一些内存。Elasticsearch 使用的内存超过Xmx设置配置的限制是正常的。注意当在容器(例如 Docker)中运行时,Elasticsearch 可用的总内存是指容器内可用的内存量,而不是主机上的总系统内存。
如果您在同一台主机或同一个容器中运行多个 Elasticsearch 节点,则所有节点的堆大小总和不应超过可用总内存的 50%。
在计算 Elasticsearch 可用的总内存时,请考虑在同一主机或同一容器中运行的其他进程的内存使用情况。
50% 的指导原则旨在作为堆大小的安全上限。您可能会发现小于此最大值的堆大小能提供更好的性能,例如通过允许您的操作系统使用更大的文件系统缓存。
如果您将堆大小设置得过大,Elasticsearch 的性能可能会变差,并且节点可能会被操作系统终止。
将
Xms和Xmx设置为不超过压缩普通对象指针 (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 可用的堆越多,它可用于其内部缓存的内存就越多。这留给操作系统用于文件系统缓存的内存就越少。更大的堆也可能导致更长的垃圾回收暂停时间。
要配置堆大小,请将 Xms 和 Xmx JVM 参数添加到扩展名为 .options 的自定义 JVM 选项文件中,并将其存储在 jvm.options.d/ 目录中。例如,要将最大堆大小设置为 2GB,请将 Xms 和 Xmx 都设置为 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 配置为在内存不足异常时将堆转储到以下位置
-
默认日志目录 -
默认数据目录
目录位置
- RPM 和 Debian 软件包:
/var/log/elasticsearch - Linux 和 MacOS 以及 Windows 发行版:Elasticsearch 安装根目录下的
logs目录
- RPM 和 Debian 软件包:
/var/lib/elasticsearch - Linux 和 MacOS 以及 Windows 发行版:Elasticsearch 安装根目录下的
data目录
如果此路径不适合接收堆转储,请修改或添加 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 配置为将致命错误日志写入默认日志目录。在 RPM 和 Debian 软件包上,此目录为 /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.ttl 和 es.networkaddress.cache.negative.ttl 的设置。