带你读《Elastic Stack 实战手册》之84:——4.3.3.Elasticsearch 性能优化之内存和熔断浅析(下)

简介: 带你读《Elastic Stack 实战手册》之84:——4.3.3.Elasticsearch 性能优化之内存和熔断浅析(下)

《Elastic Stack 实战手册》——四、应用实践——4.3 性能优化场景——4.3.3.Elasticsearch 性能优化之内存和熔断浅析(中): https://developer.aliyun.com/article/1225156?spm=a2c6h.13148508.setting.19.438f4f0e18NXNE


4.2 熔断器源码浅析


熔断器相关代码主要位于两个包中,包括熔断器接口、一些子类以及异常类和具体服务类等, 本节分别阅读两个包中的代码。


common.breaker


这里定义熔断器接口和两个实现类和异常类,具体如图 4 所示:

image.png

CircuitBreaker 中两个枚举定义了 breaker 细分类:

·   enum Type {MEMORY,PARENT,NOOP}

·    enum Durability {TRANSIENT,PERMANENT}


ChildMemoryCircuitBreaker 类 addEstimateBytesAndMaybeBreak() 方法判断是否请求需要 占用的 bytes 通过 memoryUserd() 计算后超过限制触发跳闸,如图 5 所示:

image.png

图 5 熔断器是否触发判断


例如:terms agg,会通过 BigArrays 这个工具类申请大数组来存放计算数据,在实际分配内 存之前,调用 adjustBreaker() 方法 (其内部调用 addEstimateBytesAndMaybeBreak() 方法) 将新申请数组的大小交给 ChildMemoryCircuitBreaker 来判断是否触发跳闸。


indices.breaker


主要包含具体的熔断服务类 HierarchyCircuitBreakerService,具体结构如图 6:


image.png

图 6 熔断器服务类

HierarchyCircuitBreakerService 内部类 MemoryUsage 实现父熔断器获取内存状态准则,如 图 7 所示:

image.png

图 7 父熔断器行为准则

currentMemoryUsage() 调用的即 JVM 底层的内容:

//构造 MemoryMXBean 
调用 getUsed() MemoryMXBeanMEMORY_MX_BEAN = ManagementFactory.getMemoryMXBean();
return MEMORY_MX_BEAN.getHeapMemoryUsage().getUsed();//MemoryUsage

CircuitBreakerStats 类负责熔断器状态监控,_nodes/stats/breaker 调用。

image.png

图 8 熔断器状态


具体示例如下:

image.png

其中当前使用子熔断器均为自己统计,父熔断器采用 memoryUsed() 方式统计。触发次数为 AtomicLong 类型,每次触发熔断都会加 1,且会打印如下日志。

image.png


日志中会输出内存限制和使用数值信息和 label 信息,表示引起熔断具体原因:

·    : 查询结果分片间聚合

·    : agg 等申请的 BigArrays 过大

·    : http 请求 content 过长

·   "allocated_buckets" :桶太多了( search.max_buckets )

·   ……


5. 小结


本篇文章旨在对 Elasticsearch 内存的使用情况和其在预防 OOM 设置的熔断机制进行简单的 分析,了解其中缘由有助于我们更好的优化 Elasticsearch 内存方面的配置,并在出现内存方 面的异常时更快的定位问题和找到解决办法。


由于作者能力有限,文章中存在的错误以及遗漏还望读者可以批评指出,共同学习,共同进步。


创作人简介:

齐乐,从事大数据开发工作近四年,主要方向为 ES,已通过 ECE 认证,近期在研究 Spark

和 Flink。欢迎一起学习,一起讨论,共同进步。

博客:https://www.jianshu.com/u/cc7ee7454afc

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。  
相关文章
浦语·灵笔2:一款超强的图文多模态大模型,可直接生成图文并茂的完整文章!
浦语·灵笔2:一款超强的图文多模态大模型,可直接生成图文并茂的完整文章!
793 1
|
搜索推荐 安全 UED
浅谈AARRR模型
浅谈AARRR模型
|
存储 Kubernetes 监控
Kubecost | Kubernetes 开支监控和管理 🤑🤑🤑
Kubecost | Kubernetes 开支监控和管理 🤑🤑🤑
|
缓存 Java 索引
Elasticsearch的TermsQuery慢查询分析和优化
前言 本篇文章主要记录业务上的一个TermsQuery优化和分析的过程和一些思考。 在使用ES的时候,经常会遇到慢查询,这时候可以利用profile进行分析,当利用profile也查看不出什么端倪时候,可以尝试通过阅读代码查看查询为什么这么慢。如下是一个我们内部业务的一个慢查询,经常出现4s左右的延时,一模一样的查询,但是延时不一样,且很难复现。 { "from": 0,
4150 0
Elasticsearch的TermsQuery慢查询分析和优化
|
2月前
|
存储 弹性计算 人工智能
阿里云服务器最新购买攻略:购买流程、配置选择注意事项与活动价格详解
本文介绍了阿里云服务器的三类购买路径:快速购买一键完成配置,自定义购买支持按需选择地域、实例规格、镜像、带宽等参数,活动购买则能享受专属低价。2026年最新特惠覆盖全档位需求:新用户轻量应用服务器2核2G仅38元/年,2核4G低至9.9元/月;新老用户同享“99计划”,2核2G 3M带宽99元/年且续费同价,第九代企业级实例享6.4折起优惠。本文还分享了领券、批量结算、预留实例券等省钱技巧,帮助不同规模的用户低成本选到适配业务的云服务器。
|
Go API 定位技术
MCP 实战:用 Go 语言开发一个查询 IP 信息的 MCP 服务器
随着 MCP 的快速普及和广泛应用,MCP 服务器也层出不穷。大多数开发者使用的 MCP 服务器开发库是官方提供的 typescript-sdk,而作为 Go 开发者,我们也可以借助优秀的第三方库去开发 MCP 服务器,例如 ThinkInAIXYZ/go-mcp。 本文将详细介绍如何在 Go 语言中使用 go-mcp 库来开发一个查询 IP 信息的 MCP 服务器。
969 2
|
存储 自然语言处理 关系型数据库
Elasticsearch 查询时 term、match、match_phrase、match_phrase_prefix 的区别
【7月更文挑战第3天】Elasticsearch 查询时 term、match、match_phrase、match_phrase_prefix 的区别
|
存储 缓存 JSON
带你读《Elastic Stack 实战手册》之84:——4.3.3.Elasticsearch 性能优化之内存和熔断浅析(上)
带你读《Elastic Stack 实战手册》之84:——4.3.3.Elasticsearch 性能优化之内存和熔断浅析(上)
1044 0
带你读《Elastic Stack 实战手册》之84:——4.3.3.Elasticsearch 性能优化之内存和熔断浅析(上)
|
缓存 负载均衡 Java
Nacos 集群部署时性能优化配置
Nacos 集群部署时性能优化配置
880 2
|
Kubernetes 应用服务中间件 调度
k8s的Pod常见的几种调度形式
k8s的Pod常见的几种调度形式
444 0

热门文章

最新文章

相关产品

  • 检索分析服务 Elasticsearch版