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

相关文章

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

用Microsoft.Extensions.Hosting 管理WPF项目.

首先引入必要的包: <ItemGroup><PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.2" /><PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" /><PackageReference Include="Serilog

关于如何更好管理好数据库的一点思考

本文尝试从数据库设计理论、ER图简介、性能优化、避免过度设计及权限管理方面进行思考阐述。 一、数据库范式 以下通过详细的示例说明数据库范式的概念,将逐步规范化一个例子,逐级说明每个范式的要求和变换过程。 示例:学生课程登记系统 初始表格如下: 学生ID学生姓名课程ID课程名称教师教师办公室1张三101数学王老师101室2李四102英语李老师102室3王五101数学王老师101室4赵六103物理陈

springboot家政服务管理平台 LW +PPT+源码+讲解

3系统的可行性研究及需求分析 3.1可行性研究 3.1.1技术可行性分析 经过大学四年的学习,已经掌握了JAVA、Mysql数据库等方面的编程技巧和方法,对于这些技术该有的软硬件配置也是齐全的,能够满足开发的需要。 本家政服务管理平台采用的是Mysql作为数据库,可以绝对地保证用户数据的安全;可以与Mysql数据库进行无缝连接。 所以,家政服务管理平台在技术上是可以实施的。 3.1

vue3项目将所有访问后端springboot的接口统一管理带跨域

vue3项目将所有访问后端springboot的接口统一管理带跨域 一、前言1.安装Axios2.创建Axios实例3.创建API服务文件4.在组件中使用API服务 二、跨域三、总结 一、前言 在Vue 3项目中,统一管理所有访问后端Spring Boot接口的最佳实践是创建一个专门的API服务层。这可以让你的代码更加模块化、可维护和集中管理。你可以使用Axios库作为HTT

Android SurfaceFlinger——图形内存分配器(十一)

前面的文章中的图层合成器(HWC),这里我们接着看一下 SurfaceFlinger 中的另一个重要服务——图形内存分配器。 一、简介         android.hardware.graphics.allocator@2.0 是 Android 系统中硬件抽象层(HAL)的一个组件,专门用于图形内存的分配和管理。它是 SurfaceFlinger 在处理图形数据时所依赖的

逆向学习汇编篇:内存管理与寻址方式

本节课在线学习视频(网盘地址,保存后即可免费观看): ​​https://pan.quark.cn/s/3ceeb9ae6d98​​ 在汇编语言的世界中,内存管理和寻址方式是构建程序的基础。理解这些概念不仅对于编写高效的汇编代码至关重要,也是进行逆向工程分析的关键技能。本文将深入探讨内存管理的基本原则和多种寻址方式,并通过代码案例来展示它们的实际应用。 1. 内存管理 内存管理涉及如何分配

Git代码管理的常用操作

在VS022中,Git的管理要先建立本地或远程仓库,然后commit到本地,最后push到远程代码库。 或者不建立本地的情况,直接拉取已有的远程代码。 Git是一个分布式版本控制系统,用于跟踪和管理文件的变化。它可以记录文件的修改历史,并且可以轻松地回滚到任何历史版本。 Git的基本概念包括: 仓库(Repository):Git使用仓库来存储文件的版本历史。一个仓库可以包含多个文件

Yarn:引领JavaScript包管理新潮流

在浩瀚的JavaScript世界中,包管理工具如同一位精明的管家,帮助开发者管理着各式各样的代码包。而Yarn,这位新晋管家,以其高效、稳定和安全的特性,正逐渐成为开发者心中的新宠。本文将带您走进Yarn的世界,让您轻松掌握Yarn的强大特性和使用方法。 特性一:快速如闪电         想象一下,你是一位忙碌的图书馆管理员,每天需要整理成千上万的书籍。如果每本书的摆放都