监控fielddata使用了多少内存以及是否有数据被驱逐是非常重要的。大量的数据被驱逐会导致严重的资源问题以及不好的性能。
 
Fielddata使用可以通过下面的方式来监控:

  • 对于单个索引使用 {ref}indices-stats.html[indices-stats API]:
GET /_stats/fielddata?fields=*
  • 对于单个节点使用 {ref}cluster-nodes-stats.html[nodes-stats API]:
GET /_nodes/stats/indices/fielddata?fields=*
  • 或者甚至单个节点单个索引
GET /_nodes/stats/indices/fielddata?level=indices&fields=*

通过设置 ?fields=* 内存使用按照每个字段分解了.

断路器(breaker)

聪明的读者可能已经注意到fielddata大小设置的一个问题。fielddata的大小是在数据被加载之后才校验的。如果一个查询尝试加载到fielddata的数据比可用的内存大会发生什么情况?答案是不客观的:你将会获得一个OutOfMemory异常。
 
Elasticsearch包含了一个 fielddata断路器 ,这个就是设计来处理这种情况的。断路器通过检查涉及的字段(它们的类型,基数,大小等等)来估计查询需要的内存。然后检查加 载需要的fielddata会不会导致总的fielddata大小超过设置的堆的百分比。
 
如果估计的查询大小超过限制,断路器就会触发并且查询会被抛弃返回一个异常。这个发生在数据被加载之前,这就意味着你不会遇到OutOfMemory异常。
 
Elasticsearch拥有一系列的断路器,所有的这些都是用来保证内存限制不会被突破:

indices.breaker.fielddata.limit

这个 fielddata 断路器限制fielddata的大小为堆大小的60%,默认情况下。

indices.breaker.request.limit

这个 request 断路器估算完成查询的其他部分要求的结构的大小,比如创建一个聚集通, 以及限制它们到堆大小的40%,默认情况下。

indices.breaker.total.limit

这个total断路器封装了 request 和 fielddata 断路器去确保默认情况下这2个 使用的总内存不超过堆大小的70%。
 
断路器限制可以通过文件 config/elasticsearch.yml 指定,也可以在集群上动态更新:

PUT /_cluster/settings
{"persistent" : {"indices.breaker.fielddata.limit" : 40% (1)}
}

这个限制设置的是堆的百分比。
 
最好把断路器设置成一个相对保守的值。记住fielddata需要和堆共享 request 断路器, 索引内存缓冲区,过滤器缓存,打开的索引的Lucene数据结构,以及各种各样别的临时数据 结构。所以默认为相对保守的60%。过分乐观的设置可能会导致潜在的OOM异常,从而导致整 个节点挂掉。

从另一方面来说,一个过分保守的值将会简单的返回一个查询异常,这个异常会被应用处理。 异常总比挂掉好。这些异常也会促使你重新评估你的查询:为什么单个的查询需要超过60%的 堆空间。

断路器和Fielddata大小

在 Fielddata大小部分我们谈到了要给fielddata大小增加一个限制去保证老的不使用 的fielddata被驱逐出去。indices.fielddata.cache.size 和 indices.breaker.fielddata.limit 的关系是非常重要的。如果断路器限制比缓冲区大小要小,就会没有数据会被驱逐。为了能够 让它正确的工作,断路器限制必须比缓冲区大小要大。

我们注意到断路器是和总共的堆大小对比查询大小,而不是和真正已经使用的堆内存区比较。 这样做是有一系列技术原因的(比如,堆可能看起来是满的,但是实际上可能正在等待垃圾 回收,这个很难准确的估算)。但是作为终端用户,这意味着设置必须是保守的,因为它是 和整个堆大小比较,而不是空闲的堆比较。

参考:Elasticsearch权威指南笔记 
官网:https://www.elastic.co/guide/en/elasticsearch/guide/current/_limiting_memory_usage.html

转载于:https://www.cnblogs.com/bonelee/p/8202878.html

ES 断路器——本质上保护OOM提前抛出异常而已相关推荐

  1. 腾讯十年老兵:区块链本质上是一个异地多活的分布式数据库

    \ 区块链前哨导读:本文整理自 9 月 8 日"腾讯技术工程-区块链技术沙龙"上的演讲. 讲师介绍:潘安群,腾讯 TEG 计费平台部账户中心总监,专家工程师:中国计算机学会 CCF ...

  2. 在 OpenGL ES 2.0 上实现视差贴图(Parallax Mapping)

    在 OpenGL ES 2.0 上实现视差贴图(Parallax Mapping) 视差贴图 最近一直在研究如何在我的 iPad 2(只支持 OpenGL ES 2.0, 不支持 3.0) 上实现 视 ...

  3. 防火墙(NGFW)与UTM本质上的区别

    防火墙(NGFW)与UTM本质上的区别: 先说说传统的安全设备: 入侵防御设备 IPS 应用安全防护体系不完善,只能针对操作系统或者应用软件的底层漏洞进行防护,缺乏针对Web攻击威胁的防御能力,对We ...

  4. 所有伟大的创新,本质上都是从一小撮年轻人肆无忌惮打破规则开始的

    点击学习区块链 --------------------- 本文来自" 橙皮书",译者 Retric ----------------------- 这是一场发生在 2017 年 ...

  5. OpenGL.ES在Android上的简单实践:10-曲棍球(拖动物体、碰撞测试)

    OpenGL.ES在Android上的简单实践:10-曲棍球(拖动物体.碰撞测试) 1.让木槌跟随手指移动 继续上一篇文章9的内容.既然可以测试木槌是否被触碰了,我们将继续努力下去:当我们来回拖动木槌 ...

  6. 【图论】用一道题从本质上讲清楚Floyd算法

    P1119 [灾后重建] 4 5 1 2 3 4 0 2 1 2 3 1 3 1 2 2 1 4 0 3 5 4 2 0 2 0 1 2 0 1 3 0 1 4 -1 -1 5 4 一道非常好的Flo ...

  7. 企业数字化转型本质上是“人”的转型和“组织”的转型

    2021年是机遇与挑战并存的一年.这场数字化变革摆在所有人面前,每个企业都必须重视起来,也不得不重视起了,因为数字化已经成为企业的起跑线了. 说起数字化,很多企业都认为是技术问题,认为企业数字化转型就 ...

  8. 宇宙和你,本质上其实只是个八维数字?

    剑桥大学的数学物理学家Cohl Furey正在寻找粒子物理标准模型和八元数之间的联系.八元数的乘法规则被编码在被称为法诺面的三角图中. 来源: 环球科学 对于一维.二维乃至四维的数字,人们都不陌生:一 ...

  9. DQN 处理 CartPole 问题——使用强化学习,本质上是训练MLP,预测每一个动作的得分...

    代码: # -*- coding: utf-8 -*- import random import gym import numpy as np from collections import dequ ...

最新文章

  1. 算法复习——bitset(bzoj3687简单题)
  2. r语言将百分数化为小数_如何将数字格式化为R中的百分比?
  3. 解决yum安装时 Cannot retrieve repository metadata (repomd.xml) for repository
  4. Python做web开发,推荐几个能立马上手的小项目
  5. 电磁场与电磁波第一章 矢量分析
  6. Python中使用高德API实现经纬度转地名
  7. qt 利用 HTML 生成PDF文档,不能显示jpg图片
  8. C语言程序设计 | 结构体,枚举,联合
  9. 暴怒程序员的呐喊:别让我做那些没用的东西
  10. AIoT 又迎一利器,涂鸦云开发平台来了!
  11. SQL SERVER中查询无主键的SQL
  12. luogu_P4767 [IOI2000]邮局
  13. java私塾初级_java私塾 Java初级视频教程
  14. [漏洞分析] CVE-2021-3560 PolKit条件竞争本地提权分析
  15. 基站位置查询系统_Android获取手机基站位置并进行基站定位的原理
  16. ios 内存深度优化_iPhone 6要用1GB内存 优化太好还是另有玄机?
  17. 小白虎远程控制软件待实现功能以及用户反馈! 请大家及时反馈需要完善的地方!
  18. 自动驾驶平台Apollo 2.5阅读手记:perception模块之camera detector
  19. Wish官方推荐收款渠道 哪家比较好?
  20. 大数据计算,如何优化SQL?

热门文章

  1. java set null值,从Java ResultSet检查null int值
  2. String直接赋值和使用new的区别
  3. origin数据平滑_独门绝技!Origin挑战绘制细胞分化轨迹热图
  4. 建环计算机应用试题,环境建环和给水排水工程计算机应用教材内容
  5. linux a文本编辑大全,Linux sed 命令 - Linux文档编辑命令大全
  6. store 存取数据数组对象_ios – 如何在数组中保存自定义对象并将其存储在NSUserDefaults – iPhone中...
  7. mysql表创建在哪_mysql创建表命令是哪句
  8. 通俗易懂的讲解区块链
  9. 机器学习(MACHINE LEARNING)Sklearn通用学习模式
  10. Android移动开发之【Android实战项目】在Service中弹出Dialog对话框,即全局性对话框