ElasticSearch优化系列四:ES的heap是如何被瓜分掉的

转自:https://www.jianshu.com/p/f41b706db6c7

以下分别解读几个我知道的内存消耗大户:

Segment Memory
Segment不是file吗?segment memory又是什么?前面提到过,一个segment是一个完备的lucene倒排索引,而倒排索引是通过词典(Term Dictionary)到文档列表(Postings List)的映射关系,快速做查询的。由于词典的size会很大,全部装载到heap里不现实,因此Lucene为词典做了一层前缀索引(Term Index),这个索引在Lucene4.0以后采用的数据结构是FST (Finite State
Transducer)。这种数据结构占用空间很小,Lucene打开索引的时候将其全量装载到内存中,加快磁盘上词典查询速度的同时减少随机磁盘访问次数。
下面是词典索引和词典主存储之间的一个对应关系图:

说了这么多,要传达的一个意思就是,ES的data node存储数据并非只是耗费磁盘空间的,为了加速数据的访问,每个segment都有会一些索引数据驻留在heap里。因此segment越多,瓜分掉的heap也越多,并且这部分heap是无法被GC掉的! 理解这点对于监控和管理集群容量很重要,当一个node的segment memory占用过多的时候,就需要考虑删除、归档数据,或者扩容了。

怎么知道segment memory占用情况呢? CAT API可以给出答案。

  1. 查看一个索引所有segment的memory占用情况:
  2. 查看一个node上所有segment占用的memory总和:

那么有哪些途径减少data node上的segment memory占用呢?总结起来有三种方法:

  1. 删除不用的索引。
    
  2. 关闭索引(文件仍然存在于磁盘,只是释放掉内存)。需要的时候可以重新打开。
    
  3. 定期对不再更新的索引做optimize (ES2.0以后更改为force merge api)。这Optimze的实质是对segment file强制做合并,可以节省大量的segment memory。 

Filter Cache
Filter cache是用来缓存使用过的filter的结果集的,需要注意的是这个缓存也是常驻heap,无法GC的。默认的10% heap size设置工作得够好了,如果实际使用中heap没什么压力的情况下,才考虑加大这个设置。

Field Data cache
对搜索结果做排序或者聚合操作,需要将倒排索引里的数据进行解析,然后进行一次倒排。在有大量排序、数据聚合的应用场景,可以说field data cache是性能和稳定性的杀手。这个过程非常耗费时间,因此ES
2.0以前的版本主要依赖这个cache缓存已经计算过的数据,提升性能。但是由于heap空间有限,当遇到用户对海量数据做计算的时候,就很容易导致heap吃紧,集群频繁GC,根本无法完成计算过程。ES2.0以后,正式默认启用Doc Values特性(1.x需要手动更改mapping开启),将field data在indexing time构建在磁盘上,经过一系列优化,可以达到比之前采用field data cache机制更好的性能。因此需要限制对field data cache的使用,最好是完全不用,可以极大释放heap压力。这里需要注意的是,排序、聚合字段必须为not analyzed。设想如果有一个字段是analyzed过的,排序的实际对象其实是词典,在数据量很大情况下这种情况非常致命。

Bulk Queue
Bulk Queue是做什么用的?当所有的bulk thread都在忙,无法响应新的bulk request的时候,将request在内存里排列起来,然后慢慢清掉。一般来说,Bulk queue不会消耗很多的heap,但是见过一些用户为了提高bulk的速度,客户端设置了很大的并发量,并且将bulk Queue设置到不可思议的大,比如好几千。这在应对短暂的请求爆发的时候有用,但是如果集群本身索引速度一直跟不上,设置的好几千的queue都满了会是什么状况呢? 取决于一个bulk的数据量大小,乘上queue的大小,heap很有可能就不够用,内存溢出了。一般来说官方默认的thread
pool设置已经能很好的工作了,建议不要随意去“调优”相关的设置,很多时候都是适得其反的效果。

Indexing Buffer
Indexing Buffer是用来缓存新数据,当其满了或者refresh/flush interval到了,就会以segment file的形式写入到磁盘。这个参数的默认值是10% heap size。根据经验,这个默认值也能够很好的工作,应对很大的索引吞吐量。但有些用户认为这个buffer越大吞吐量越高,因此见过有用户将其设置为40%的。到了极端的情况,写入速度很高的时候,40%都被占用,导致OOM。
Cluster State Buffer
ES被设计成每个Node都可以响应用户的api请求,因此每个Node的内存里都包含有一份集群状态的拷贝。这个Cluster state包含诸如集群有多少个Node,多少个index,每个index的mapping是什么?有少shard,每个shard的分配情况等等(ES有各类stats api获取这类数据)。在一个规模很大的集群,这个状态信息可能会非常大的,耗用的内存空间就不可忽视了。并且在ES2.0之前的版本,state的更新是由Master Node做完以后全量散播到其他结点的。频繁的状态更新都有可能给heap带来压力。在超大规模集群的情况下,可以考虑分集群并通过tribe node连接做到对用户api的透明,这样可以保证每个集群里的state信息不会膨胀得过大。

超大搜索聚合结果集的fetch
ES是分布式搜索引擎,搜索和聚合计算除了在各个data node并行计算以外,还需要将结果返回给汇总节点进行汇总和排序后再返回。无论是搜索,还是聚合,如果返回结果的size设置过大,都会给heap造成很大的压力,特别是数据汇聚节点。

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

ES Segment Memory——本质上就是segment中加到内存的FST数据,因此segment越多,该内存越大...相关推荐

  1. linux firefox applet,在HTTPS上的Firefox中加载Java Applet

    我们开发了一个分析应用程序,它使用特殊的Java小程序(由IBM开发)来查看一些数据.这是一个在Apache上运行的Django应用程序.一切工作正常,直到我们转移到SSL.这种行为非常奇怪,我们感到 ...

  2. cbitmap 从内存中加载jpg_[转载]windows照片查看器无法显示图片内存不足

    问题描述 最近在使用Windows照片查看器打开一个jpg文件的时候异常 Windows照片查看器无法显示此图片,因为计算机上的可用内存可能不足.请关闭一些目前没有使用的程序或者释放部分硬盘空间(如果 ...

  3. 如何在微信小程序中加载自己的地图数据

    由于微信小程序无法进行DOM操作,导致像openlayers.leaflet这种常用的js库无法在微信小程序内使用,导致加载高德.百度.mapbox还有自定义的瓦片地图数据变得很困难. 目前,大多数情 ...

  4. 服务器上的Linux中Tomcat有时会挂掉的问题及方法

    QUESTION:服务器上的Linux中Tomcat有时会挂掉的问题及方法? 目录 QUESTION:服务器上的Linux中Tomcat有时会挂掉的问题及方法? ANSWER: 一.内存不足 二.服务 ...

  5. sql数据库备份默认路径_在Linux上SQL Server中更改默认数据库文件和备份路径

    sql数据库备份默认路径 In a previous article, we explored the process to change default SQL dump file location ...

  6. 四个步骤实现在ESRI ArcMap中加载17.6G离线卫星地图的方法

    四个步骤实现在ESRI ArcMap中加载17.6G离线卫星地图的方法 ArcMap是GIS行业的从业人员再熟悉不过的一款功能非常强大的软件,尤其是对从事地质方面工作的外业人员来讲,更是一款不可或缺的 ...

  7. 为Android Studio中的SettingsActivity定制任务栏 (Setting Activity其实本质上是从PreferenceActivity中继承过来的)

    Android Studio为开发者提供了很多内建的Activity, 其中Settings Activity是非常有用且功能强大的一种内建Activity. Setting Activity其实本质 ...

  8. ES 断路器——本质上保护OOM提前抛出异常而已

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

  9. c++ 字符串拼接_源码上看 .NET 中 StringBuilder 拼接字符串的实现

    专注分享C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协 ...

最新文章

  1. 数字图像处理(Digital image processing)笔记
  2. VS2010旗舰版无法安装
  3. 计算机网络多媒体图像矢量图,13多媒体信息处理——图像处理(一)
  4. 利用反射球实现镜面效果
  5. 一个SAP Marketing Cloud和Kyma的集成
  6. 基于Jenkins+Gitlab的自动化部署实战
  7. java.util.Array中的方法
  8. 微软2022服务器,​微软公开地分享了即将发布的WindowsServer 2022的特性
  9. php收购,php中文网收购全国用户量最大的phpstudy集成开发环境揭秘
  10. Service混合开启笔记(startService+bindService)
  11. 上海黑马JAVA30期_2018年4月最新黑马Javaee第297期
  12. Linux安装tomcat并使用+热部署
  13. [转载] 正则表达式“派别”简述
  14. 【转】机器学习入门——浅谈神经网络
  15. vue中使用router打开一个新的窗口
  16. Low-poly低面建模(低像素多边形)
  17. Centos下进行C++编程(1)
  18. 我对计算机最感兴趣作文300,电脑让我欢喜让我忧作文300字
  19. 西电李航 操作系统课程笔记 day10 IO hardware principles
  20. 最长回文 HDU - 3068 马拉车算法

热门文章

  1. 利用 force index优化sql语句性能
  2. JavaScript 的 Promise  和  C# 的 waitone 一样吗?请大家讨论i两句。
  3. 帆软填报提交显示违反唯一约束_贵州2020年高考网上填报志愿时间确定!这些事项需要注意...
  4. 算法分析 载货问题_协会发布 | 汽车市场走势分析及2021年预测报告
  5. python表单数据系统_使用MultipartPostHandler用Python发布表单数据
  6. 【深度学习】医学图像处理之视杯视盘分割调研分析
  7. python【数据结构与算法】一维前缀和与差分
  8. python【蓝桥杯vip练习题库】ADV-297快速排序
  9. java根据日期生成表主键_java 利用时间生成主键
  10. mac系统学习和快捷键