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

相关文章

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

SpringBoot集成XXL-JOB实现任务管理全流程

《SpringBoot集成XXL-JOB实现任务管理全流程》XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展,本文介绍如何通过SpringBoot项目,使用RestTempl... 目录一、前言二、项目结构简述三、Maven 依赖四、Controller 代码详解五、Service

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Python内存优化的实战技巧分享

《Python内存优化的实战技巧分享》Python作为一门解释型语言,虽然在开发效率上有着显著优势,但在执行效率方面往往被诟病,然而,通过合理的内存优化策略,我们可以让Python程序的运行速度提升3... 目录前言python内存管理机制引用计数机制垃圾回收机制内存泄漏的常见原因1. 循环引用2. 全局变

Linux系统管理与进程任务管理方式

《Linux系统管理与进程任务管理方式》本文系统讲解Linux管理核心技能,涵盖引导流程、服务控制(Systemd与GRUB2)、进程管理(前台/后台运行、工具使用)、计划任务(at/cron)及常用... 目录引言一、linux系统引导过程与服务控制1.1 系统引导的五个关键阶段1.2 GRUB2的进化优

Spring Security 前后端分离场景下的会话并发管理

《SpringSecurity前后端分离场景下的会话并发管理》本文介绍了在前后端分离架构下实现SpringSecurity会话并发管理的问题,传统Web开发中只需简单配置sessionManage... 目录背景分析传统 web 开发中的 sessionManagement 入口ConcurrentSess

Linux之UDP和TCP报头管理方式

《Linux之UDP和TCP报头管理方式》文章系统讲解了传输层协议UDP与TCP的核心区别:UDP无连接、不可靠,适合实时传输(如视频),通过端口号标识应用;TCP有连接、可靠,通过确认应答、序号、窗... 目录一、关于端口号1.1 端口号的理解1.2 端口号范围的划分1.3 认识知名端口号1.4 一个进程

SpringBoot结合Knife4j进行API分组授权管理配置详解

《SpringBoot结合Knife4j进行API分组授权管理配置详解》在现代的微服务架构中,API文档和授权管理是不可或缺的一部分,本文将介绍如何在SpringBoot应用中集成Knife4j,并进... 目录环境准备配置 Swagger配置 Swagger OpenAPI自定义 Swagger UI 底

Linux权限管理与ACL访问控制详解

《Linux权限管理与ACL访问控制详解》Linux权限管理涵盖基本rwx权限(通过chmod设置)、特殊权限(SUID/SGID/StickyBit)及ACL精细授权,由umask决定默认权限,需合... 目录一、基本权限概述1. 基本权限与数字对应关系二、权限管理命令(chmod)1. 字符模式语法2.