Elasticsearch (ES)内存管理降低内存占用率

2024-05-30 03:12

本文主要是介绍Elasticsearch (ES)内存管理降低内存占用率,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Elasticsearch 主要通过以下机制和方法管理内存使用
名词解释
Field data(字段数据) 是 Elasticsearch 中存储文档字段值的一种数据结构,用于支持聚合、排序、脚本和其他操作。在 Elasticsearch 中,文档中的每个字段都可以被索引,并且可以被搜索和分析。

当你执行聚合操作、排序、或者使用脚本时,Elasticsearch 需要对字段数据进行处理。Field data 缓存存储了字段数据的一部分或全部内容,以便于快速访问和处理。这样,当你执行相同的操作时,Elasticsearch 可以直接从缓存中获取字段数据,而不必每次都从磁盘或者内存中重新加载。

Field data 缓存对于聚合操作特别重要,因为聚合操作通常需要处理大量的文档字段值。通过缓存字段数据,Elasticsearch 可以提高聚合操作的性能,减少对底层数据的读取次数,从而加快查询的速度。

然而,由于 field data 缓存需要占用内存,如果字段数据量很大,缓存可能会占用大量的系统内存。因此,Elasticsearch 提供了一些参数(如 indices.fielddata.cache.size)来控制 field data 缓存的大小,以避免占用过多的内存资源。

  1. Fielddata Cache
    • Elasticsearch 使用 fielddata 缓存来加速聚合和排序操作。默认情况下,fielddata 会根据最近最少使用 (Least Recently Used, LRU) 算法进行管理,频繁访问的数据会保留在内存中,而不常访问的数据会被剔除。
    • 可以通过设置 indices.fielddata.cache.size 来限制 fielddata 缓存的大小,从而间接控制内存使用。
  2. Query Cache
    • Elasticsearch 提供查询缓存 (query cache) 来缓存频繁使用的查询结果。同样采用 LRU 算法管理,不常使用的缓存条目会被淘汰。
    • 可以配置 indices.queries.cache.sizeindices.queries.cache.count 来限制查询缓存的大小和条目数。
  3. Circuit Breaker
    • Elasticsearch 使用电路断路器 (circuit breaker) 机制来防止内存过载。当内存使用超过一定阈值时,会拒绝新的请求来保护系统稳定性。
    • 可以调整 indices.breaker.fielddata.limitindices.breaker.total.limit 等参数来控制断路器的行为。
  4. Segment Merging and Refreshing
    • Elasticsearch 会定期合并和刷新段 (segments),这些操作会影响内存使用。虽然无法直接控制哪些数据保留在内存中,但可以通过优化索引配置来减少不必要的内存开销。

监控

获取节点统计信息(包括内存使用情况)

curl --user username:password -X GET "http://127.0.0.1:9200/_nodes/stats?pretty"
"os" : {"mem" : {"total_in_bytes" : 16313823232,"free_in_bytes" : 1427173376,"used_in_bytes" : 14886649856,"free_percent" : 9,"used_percent" : 91}
},
操作系统级别的内存:
总内存:16313823232 字节(约为 15.2GB)
空闲内存:1427173376 字节(约为 1.33GB)
使用内存:14886649856 字节(约为 13.86GB)
使用百分比:91%
"jvm" : {"mem" : {"heap_used_in_bytes" : 518682624,"heap_used_percent" : 12,"heap_committed_in_bytes" : 4294967296,"heap_max_in_bytes" : 4294967296,"non_heap_used_in_bytes" : 134244584,"non_heap_committed_in_bytes" : 145391616,...}
},
JVM(Java 虚拟机)内存:
堆内存使用:518682624 字节(约为 494.6MB)
堆内存使用百分比:12%
堆内存提交:4294967296 字节(约为 4GB)
非堆内存使用:134244584 字节(约为 128MB)
非堆内存提交:145391616 字节(约为 138MB)

获取节点热线程信息

curl --user elastic:password -X GET "http://127.0.0.1:9200/_nodes/hot_threads?pretty"

设置 Fielddata Cache

# ----------------------------------- Memory -----------------------------------
#
# Lock the memory on startup:
#
#bootstrap.memory_lock: true
#
# Make sure that the heap size is set to about half the memory available
# on the system and that the owner of the process is allowed to use this
# limit.
#
# Elasticsearch performs poorly when the system is swapping the memory.
indices.fielddata.cache.size: 40%
# 允许 Field Data 缓存占用 JVM 堆内存的 40%,也可以使用具体的数值,例如 `12GB`。
indices.breaker.fielddata.limit: 60%
# 当 Field Data 缓存在 JVM 堆内存中的使用达到 JVM 堆内存的 60% 时,Elasticsearch 将会限制 Field Data 缓存的进一步分配

动态设置 Fielddata 缓存

可以使用 Elasticsearch 的动态设置 API 在运行时调整 fielddata 缓存的大小:

curl -X PUT "localhost:9200/_cluster/settings" -H "Content-Type: application/json" -d '{"persistent": {"indices.fielddata.cache.size": "40%"}
}'

配置 indices.fielddata.cache.sizeindices.breaker.fielddata.limit 这两个参数是为了控制 Elasticsearch 中 Field Data 缓存的使用。

  1. indices.fielddata.cache.size 这个参数指定了 Field Data 缓存在 JVM 堆内存中所占用的百分比。在你的配置中,设置为 40%,表示你允许 Field Data 缓存占用 JVM 堆内存的 40%。
  2. indices.breaker.fielddata.limit 这个参数指定了 Field Data 缓存在 JVM 堆内存中的占用限制。在你的配置中,设置为 60%,表示当 Field Data 缓存在 JVM 堆内存中的使用达到 JVM 堆内存的 60% 时,Elasticsearch 将会限制 Field Data 缓存的进一步分配。

这两个参数一起配置的目的是为了控制 Field Data 缓存在 JVM 堆内存中的使用,以避免过度占用内存而导致系统性能下降或者内存溢出问题。通过限制 Field Data 缓存的大小和使用百分比,可以确保系统的稳定性和性能。

总的来说,indices.fielddata.cache.size 控制了 Field Data 缓存的大小,而 indices.breaker.fielddata.limit 则控制了 Field Data 缓存在 JVM 堆内存中的占用限制。两者结合起来可以有效地管理 Field Data 缓存的使用。

配置 Query Cache

indices.queries.cache.size: 10%
# 限制查询缓存的大小indices.queries.cache.count: 10000
# 限制查询缓存的条目数

配置 Circuit Breaker

indices.breaker.fielddata.limit: 60%
indices.breaker.total.limit: 70%
# 以上配置将 fielddata 缓存使用限制为堆内存的 60%,总内存使用限制为堆内存的 70%。

调整 Indexing 和 Refresh 设置

设置刷新间隔

增加索引刷新间隔,可以减少刷新操作的频率,从而降低内存使用:

curl -X PUT "localhost:9200/my_index/_settings" -H "Content-Type: application/json" -d '{"index": {"refresh_interval": "30s"}
}'

设置合并策略

优化段合并策略可以减少内存使用。通过设置 index.merge.policy 参数来控制合并行为:

curl -X PUT "localhost:9200/my_index/_settings" -H "Content-Type: application/json" -d '{"index": {"merge": {"policy": {"max_merged_segment": "5gb","segments_per_tier": 10,"deletes_pct_allowed": 20}}}
}'

这篇关于Elasticsearch (ES)内存管理降低内存占用率的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1015423

相关文章

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int

SpringBoot使用minio进行文件管理的流程步骤

《SpringBoot使用minio进行文件管理的流程步骤》MinIO是一个高性能的对象存储系统,兼容AmazonS3API,该软件设计用于处理非结构化数据,如图片、视频、日志文件以及备份数据等,本文... 目录一、拉取minio镜像二、创建配置文件和上传文件的目录三、启动容器四、浏览器登录 minio五、

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11

IDEA中的Kafka管理神器详解

《IDEA中的Kafka管理神器详解》这款基于IDEA插件实现的Kafka管理工具,能够在本地IDE环境中直接运行,简化了设置流程,为开发者提供了更加紧密集成、高效且直观的Kafka操作体验... 目录免安装:IDEA中的Kafka管理神器!简介安装必要的插件创建 Kafka 连接第一步:创建连接第二步:选

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖