【elasticsearch】 Elasticsearch Breaker CircuitBreakingException Parent Data Too Large Real Usage
参考转载:
本文作者: jiankunking
本文链接: https://jiankunking.com/elasticsearch-breaker-circuitbreakingexception-parent-data-too-large-transport-request-real-usage.html
前言:
今天收到告警,发现es集群一个节点服务挂掉了,于是排查一下日志。
报错内容:
报错内容触发了父熔断器。
当时的jvm.options配置如下:
报错原因:
经过一顿Google之后,发现该问题是由于:
es 7.x之后引入了indices.breaker.total.use_real_memory
造成的
,从文档来看indices.breaker.total.use_real_memory
控制的是jvm实际使用的内存。
那么jvm内存用到多少的时候,会触发该熔断呢?
从集群系统配置中可以看到indices.breaker.total.limit
默认是95。
结果:
关于为什么在默认开启indices.breaker.total.use_real_memory
之后,如果GC算法是G1的话,会频繁触发熔断呢?
先解释一下G1的几个参数:
InitiatingHeapOccupancyPercent
:表示G1 GC并行循环初始设置的堆大小值,这个值决定了一个并行循环是不是要开始执行。它的逻辑是在一次GC完成后,比较老年代占用的空间和整个Java堆之间的比例。如果大于这个值,则预约下一次GC开始一个并行循环回收垃圾,从初始标记阶段开始。这个值越小,GC越频繁,反之,值越大,可以让应用程序执行时间更长。不过在内存消耗很快的情况下,我认为早运行并行循环比晚运行要好,看病要趁早。G1NewSizePercent
:年轻代初始化值,默认是 5%G1MaxNewSizePercent
:年轻代占用最大值,最大值默认是整个Java堆大小的60%
关于该问题具体分析可以看:https://github.com/elastic/elasticsearch/pull/46169
简单来说就是:es jvm.options之前的默认配置会导致老年代+年轻代的内存占用超过95%(理论上内存阈值会达到60+75=135),从而导致频繁的熔断。
解决方案:
修复该问题最有效的方式是根据不同版本JDK调整GC
算法:
我这里使用的是jdk11
版本,降低IHOP
参数值 配置如下:
__EOF__

本文链接:https://www.cnblogs.com/erlou96/p/16878236.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构