前言
通过API操作es索引的时候也,碰到一个错误:
Elasticsearch exception [type=circuit_breaking_exception,
reason=[parent] Data too large,
data for [<http_request>] would be [1532779328/1.4gb],---------------------A
which is larger than the limit of [1503238553/1.3gb],---------------------B
real usage: [1532779328/1.4gb], ---------------------C
new bytes reserved: [0/0b],---------------------D
usages [request=49152/48kb,
fielddata=0/0b,
in_flight_requests=1199478/1.1mb,
accounting=940283/918.2kb]]
问题解析
- B处的数就是上限,超过这个就报错。(缺省是它是ES最大内存的95%)
- C处的数值是你的本机上ES进程已使用的内存大小
- D处的数值1150就是你本次操作(或者说执行当前的任务)所需要内存
- C + D = A > B,所以报错了
结果
这就是内存问题;
解决办法
-
增加内存, -Xmx(如果物理内存足够的话,在jvm.options修改)
image.png - 关闭CircuitBreaker检查(不建议),
indices.breaker.type: none
。
ES的内存优化配置
indices.breaker.fielddata.limit
fielddata 断路器默认设置堆的 60% 作为 fielddata 大小的上限。
indices.breaker.request.limit
request 断路器估算需要完成其他请求部分的结构大小,例如创建一个聚合桶,默认限制是堆内存的 40%。
indices.breaker.total.limit
total 揉合 request 和 fielddata 断路器保证两者组合起来不会使用超过堆内存的 70%。
indices.fielddata.cache.size
缓存回收大小,无默认值, 有了这个设置,最久未使用(LRU)的 fielddata 会被回收为新数据腾出空间;
这个需要在elasticsearch.yml中配置。
网友评论