断路器
es包含多个断路器用来避免会引起OOM的操作。每个断路器指定可以使用的内存限制。还有一个parent级别的断路器指定所有断路器可以使用的总内存。
Parent断路器
父级别断路器可以通过以下参数设置:
indices.breaker.total.use_real_memory:(静态设置)确定父断路器考虑实际内存使用(true)还是仅考虑子断路器保留的内存量(false)。默认为true
indices.breaker.total.limit:(动态设置)父断路器启动限制。如果indices.breaker.total.use_real_memory设置为false,则默认值为JVM堆内存的70%,如果indices.breaker.total.use_real_memory设置为true,则默认值为JVM堆内存的95%。
Field data断路器
field data断路器估算将字段加载到field data cache所需的堆内存。如果加载该字段将导致缓存超过预定义的内存限制,则断路器将停止操作并返回错误。
indices.breaker.fielddata.limit:(动态设置)fielddata断路器的限制。默认为JVM堆内存的40%。
indices.breaker.fielddata.overhead:(动态设置)与所有字段数据估计值相乘以确定最终估计值的常数。默认为1.03。
Request断路器
请求断路器使es可以防止每个请求的数据结构(例如,用于在请求期间计算聚合的内存)超过一定数量的内存。
indices.breaker.request.limit:(动态设置)请求断路器的限制,默认为JVM堆内存的60%
indices.breaker.request.overhead:(动态设置)所有请求估计值都将与该常数相乘以确定最终估计值。默认为1。
进行中请求断路器
进行中请求断路器使es可以限制transport或http级别上所有当前活动的即将传入请求的内存使用,以免超出节点上的特定内存量。内存使用情况取决于请求本身的内容长度。该断路器还认为,不仅需要内存来表示原始请求,而且还需要将其作为结构化对象,这由默认开销反映出来。
- network.breaker.inflight_requests.limit
(动态设置)进行中请求断路器的限制,默认为JVM堆内存的100%。这意味着它受到父级断路器配置的限制。 - network.breaker.inflight_requests.overhead
(动态设置)一个常数,所有进行中请求估计值都将与该常数相乘以确定最终估计值。默认为2。
{ 'error': { 'type': 'circuit_breaking_exception', 'reason': '[parent] Data too large, data for [<http_request>] would be [123848638/118.1mb], which is larger than the limit of [123273216/117.5mb], real usage: [120182112/114.6mb], new bytes reserved: [3666526/3.4mb]', 'bytes_wanted': 123848638, 'bytes_limit': 123273216, 'durability': 'TRANSIENT' }, 'status': 429 }
浙公网安备 33010602011771号