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

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 带你读《Elastic Stack 实战手册》之84:——4.3.3.Elasticsearch 性能优化之内存和熔断浅析(中)

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

本章主要对 Elasticsearch 的熔断器进行详细介绍,包括其核心思想、版本迭代以及具体的实 现方式等内容。


· 熔断器的核心思想

通过估算请求使用的内存是否会超过熔断器的限制而避免 OOM。跟踪每个 JAVA 对象的分 配申请过程不现实,所以熔断器只跟踪经常出问题的内存使用,不能保证 100% 生效。


· ES 熔断器的升级(7.x 版本进行了优化):

熔断器为父子结构,7.x 版本父熔断器相比旧版本更易触发。 -6:跟踪部分内存分配预估,父熔断器根据所有子熔断器计算结果觉定是否触发。 7-:根据系统实时状态决定是否拒绝请求,即实际内存熔断器,父熔断器通过调用 JVM 提 供的方法 MemoryUsage getUsage() 监控。


· 熔断器的状态监控:

通过 GET _nodes/stats/breaker API 可以对熔断器状态进行监控,结果如图 3:

image.png

图 3 熔断器状态监控

具体含义为:配置大小,当前大小,配置担保系数和触发次数。 可以通过收集日志,记录 Data too large 等关键字后判断熔断原因(根据 label) ,具体参 见下文源码分析。

·  业务适配熔断器:

业务方触发熔断后或收到错误响应,应保证客户端有退避机制和重试机制,例如使用 Rest High Client 的 onSuccess()/onFailure(),BulkProcess 的 afterbulk() 等回调函数处理。

4.1 熔断器种类介绍


定义及部分内容参考于 Elasticsearch 官方英文文档


Elasticsearch 具有多个熔断器用于防止各种请求操作造成 OOM ,每个熔断器限制了它可以使 用的内存。此外,Elasticsearch 还有一个父熔断器用于限制所有熔断器的内存总量。


熔断器大部分配置可以在运行中的集群上通过 cluster-update-settings API 动态更新。


父熔断器

父熔断器具有以下配置:

·   indices.breaker.total.use_real_memory:

静态配置,默认 true。设置父熔断器是通过 jvm 接口考虑真实内存使用量(true),还是考 虑所有子熔断器使用总量(false)。


·    indices.breaker.total.limit:

父熔断器启动限制。上一配置为 true,则默认为 JVM 的 95%;上一配置为 false,则默认 为 JVM 的 70%。


Field data 熔断器


此熔断器允许 Elasticsearch 估计一个字段加载到 fielddata cache 需要的内存量,如果加载 该字段会导致超过限制,熔断器将停止载入并返回 error。


·   indices.breaker.fielddata.limit:

内存限制,默认 JVM 的 40%。


·  Indices.breaker.fielddata.overhead:

估算因子,默认为 1.03。


Request 熔断器


请求断路器使 Elasticsearch 可以防止每个请求的数据结构(例如,用于在请求期间计算聚合 的内存)超过一定数量的内存。


 indices.breaker.request.limit:

内存限制,默认 JVM 的 60%。


 indices.breaker.request.overhead:

估算因子,默认为 1。


In flight requests 熔断器


进行中请求断路器使 ES 可以限制 transport 或 HTTP 级别上所有当前活动的即将传入请求 的内存使用,以免超出节点上的特定内存量。内存使用情况取决于请求本身的内容长度。该断 路器还认为,不仅需要内存来表示原始请求,而且还需要将其作为结构化对象,这由默认开销反映出来。


·   network.breaker.inflight_requests.limit:

内存限制,默认 JVM 的 100%。受父熔断器限制约束。


·   network.breaker.inflight_requests.overhead:

估算因子,默认为 2。


Accounting requests 熔断器


计费断路器允许限制请求完成后未释放的内存中所保存内容的内存使用量。这包括 Lucene 段 内存之类的东西,例如 Segment Memory。


·   indices.breaker.accounting.limit:

内存限制,默认 JVM 的 100%。受父断路器限制约束。


·   indices.breaker.accounting.overhead:

估算因子,默认为 1。


Script 编译熔断器

和上述熔断器不同,此熔断器限制一段时间内 Script 编译次数。


·   script.context.$CONTEXT.max_compilations_rate:

限制一段时间内允许编译的脚本数量。默认 75/5m。( Elasticsearch 第一次获取到 script 时会进行编译并缓存。Tips:使用params 参数化脚本而不是写死到脚本中)


Regex 熔断器

此断路器限制了 painless 脚本中的正则表达式的使用和复杂度。


·   script.painless.regex.enabled:

静态配置,接受以下参数:

limit(默认):启用正则但是通过下面的参数限制复杂度

true:启用正则不做限制,即禁用熔断器

false:禁用正则,带有正则的 plainless 脚本将报错


·   script.painless.regex.limit-factor:

静态配置,限制脚本中正则表达式可以考虑的字符数,Elasticsearch 通过设置值乘以脚本输 入的字符长度来计算此限制。


例如输入 foobarbaz 字符长度为 9,此参数设置为 6(默认),则基于 foobarbaz 的正则 表达式最多可以考虑 54 个字符。如果表达式超过此限制,则会触发此断路器并返回错误。 仅在第一个参数为 limit 时生效。


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

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
6天前
|
Web App开发 缓存 前端开发
【Flutter前端技术开发专栏】Flutter中的性能优化与内存管理
【4月更文挑战第30天】本文探讨了Flutter应用的性能优化和内存管理。关键点包括:减少布局重绘(使用`const`构造函数和最小化依赖),选择合适的动画实现,懒加载和按需加载以提升性能。同时,强调了避免内存泄漏和优化内存使用,利用Flutter提供的性能分析工具。实践案例展示了如何优化ListView,包括使用`ListView.builder`和缓存策略。通过这些方法,开发者可以提升应用的响应性、流畅性和稳定性。
【Flutter前端技术开发专栏】Flutter中的性能优化与内存管理
|
6天前
|
存储 缓存 监控
深入理解Visual Basic内存管理和性能优化
【4月更文挑战第27天】本文探讨了Visual Basic的内存管理和性能优化,包括自动内存管理(垃圾回收)、堆栈区分以及垃圾回收机制的影响。提出减少临时对象创建、选择值类型、优化字符串操作、利用缓存和异步编程等优化策略。同时,讨论了.NET的代际垃圾回收、大对象堆和手动内存管理。通过案例分析和实践建议,强调理解内存模型和监控性能对提升应用性能的重要性。
|
3天前
|
算法 Java Python
【Python 的内存管理机制专栏】Python 内存管理实战:性能优化与内存泄漏检测
【5月更文挑战第18天】Python内存管理关乎程序性能与稳定性。优化包括避免过多临时对象,如优化列表推导式减少对象创建。警惕循环引用造成的内存泄漏,如示例中的Node类。使用`gc`模块检测泄漏,通过`gc.set_debug(gc.DEBUG_LEAK)`和`gc.collect()`获取信息。实践中需持续分析内存使用,优化算法、数据结构和资源释放,以提升程序质量与效率。
【Python 的内存管理机制专栏】Python 内存管理实战:性能优化与内存泄漏检测
|
4天前
|
存储 安全 数据库
阿里云服务器计算型、通用型、内存型主要实例规格特点、适用场景及最新价格参考
在阿里云服务器的实例规格中,有共享型也有企业型,一般用户选择较多的企业级实例规格有计算型、通用型、内存型,每一种实例规格又有多个实例规格族可选,不同的云服务器实例规格在架构、计算、存储、网络、安全等方面有着不同,因此,其适用场景也有所不同。本文来详细介绍一下阿里云服务器计算型、通用型、内存型主要实例计算、存储等性能及其适用场景,以供参考。
阿里云服务器计算型、通用型、内存型主要实例规格特点、适用场景及最新价格参考
|
6天前
|
缓存 算法 Java
容易发生内存泄漏的八个场景,你都知道吗?
容易发生内存泄漏的八个场景,你都知道吗?
|
6天前
|
存储 缓存 监控
干货 | Elasticsearch 8.X 性能优化实战
干货 | Elasticsearch 8.X 性能优化实战
28 2
|
6天前
|
监控 数据可视化 Java
Elasticsearch JVM 堆内存使用率飙升,怎么办?
Elasticsearch JVM 堆内存使用率飙升,怎么办?
15 0
|
6天前
|
监控 算法 测试技术
【Go语言专栏】Go语言的性能优化与内存分析
【4月更文挑战第30天】本文探讨了Go语言的性能优化策略和内存分析方法。性能优化原则包括基准测试、分析瓶颈、避免过早优化和持续监控。优化策略涉及减少内存分配、避免内存逃逸、利用并发、优化算法和数据结构以及减少系统调用。内存分析借助于Go的`pprof`工具、内存分配跟踪和第三方工具,以发现内存泄漏和管理问题。通过这些方法,开发者能提升Go程序效率和资源利用率。
|
6天前
|
算法 Java 应用服务中间件
Tomcat性能优化及JVM内存工作原理
Tomcat性能优化及JVM内存工作原理
|
6天前
|
存储 缓存 算法
C++从入门到精通:4.6性能优化——深入理解算法与内存优化
C++从入门到精通:4.6性能优化——深入理解算法与内存优化

相关产品

  • 检索分析服务 Elasticsearch版