本地英文版地址: ../en/circuit-breaker.html
ElasticSearch包含多个 熔断器(circuit breaker),用于防止操作引起的内存不足错误(OutOfMemoryError)。 每个熔断器都指定了它可以使用多少内存的限制。 此外,还有一个父级熔断器,它指定所有断路器可以使用的内存总量。
除非另有说明,否则可以使用 集群更新设置 API 在运行中的集群上动态更新这些设置。
父级熔断器 (Parent circuit breaker)
父级熔断器可以通过以下设置进行配置:
-
indices.breaker.total.use_real_memory
-
静态(Static)设置,决定父级熔断器应考虑实际内存使用(
true
)还是仅考虑子熔断器预留的数量(false
)。默认为true
。 -
indices.breaker.total.limit
-
父级熔断器总体的起始限制。
当
indices.breaker.total.use_real_memory
设置为false
时,默认为 JVM 堆的70%; 设置为true
时, 默认为 JVM 堆的 95%。
字段数据熔断器 (Field data circuit breaker)
字段数据熔断器允许 Elasticsearch 预估一个字段加载到内存中需要的内存大小。 然后,它可以通过抛出异常来阻止字段数据加载。 默认情况下,这个限制被配置为 JVM 堆最大大小的 40%。 可以使用以下参数来配置:
-
indices.breaker.fielddata.limit
- 字段数据熔断器的限制,默认为 JVM 堆的40%
-
indices.breaker.fielddata.overhead
- 一个常数,所有字段数据预估值乘以该常数以确定最终估计值。默认为 1.03
请求熔断器 (Request circuit breaker)
请求熔断器允许 Elasticsearch 防止每个请求的数据结构(例如,请求期间用于聚合计算的内存)超过一定的内存量。
-
indices.breaker.request.limit
- 请求熔断器的限制,默认为 JVM 堆的60%
-
indices.breaker.request.overhead
- 一个常数,所有请求的预估值都要乘以这个常数才能确定最终的估计值。默认为 1
请求队列熔断器 (In flight requests circuit breaker)
译者注: In flight requests, 是 client 的请求队列, 包括正在发送的请求和已经发送的但还没有接收到response的请求
请求队列熔断器允许 Elasticsearch 限制 传输 或 HTTP 级别上所有当前活动的传入请求的内存使用,使其不超过该节点的一定的内存量。
内存使用量基于请求自身的内容的长度。
该熔断器还认为,内存不仅需要表示原始请求,而且也是一个反映默认开销的结构化对象。
-
network.breaker.inflight_requests.limit
- 请求队列的限制,默认为 JVM 堆的100%。 这异味着它受到为父级熔断器配置的限制的约束。
-
network.breaker.inflight_requests.overhead
- 一个常数,所有请求队列预估值都要乘以这个常数才能确定最终的预估值。默认为 2。
核算请求熔断器 (Accounting requests circuit breaker)
核算请求熔断器允许 Elasticsearch 限制保存在内存中的东西的内存使用,这些东西在请求完成时不会被释放。 这包括像 Lucene 段内存这样的东西。
-
indices.breaker.accounting.limit
- 核算请求的限制,默认为 JVM 堆的100%。这异味着它受到为父级熔断器配置的限制的约束。
-
indices.breaker.accounting.overhead
- 一个常数,所有核算预估值都要乘以这个常数来确定最终的预估值。默认为 1
脚本编译熔断器 (Script compilation circuit breaker)
与以前的基于内存的熔断器略有不同,脚本编译熔断器限制了一段时间内的内联脚本编译数量。
更多信息请参考文档 脚本(scripting) 的 "首选参数 (prefer-parameters)" 部分。
-
script.max_compilations_rate
- 在一定时间间隔内允许编译的唯一动态脚本的数量限制。默认为 75 / 5m,即每 5 分钟 75 个。