Elasticsearch内存

核心概念

  1. 基于Lucene
  2. Java应用

内存使用分析

Lucene的内存消耗

  1. 倒排索引。(堆内存)
    Lucene中,索引是存储在磁盘中,一个索引(Index)由多个段(Segment)组成。当启动IndexSearcher时,会把倒排索引加载到内存中,基于不同的数据类型生成不同的词典,比如text生成FST结构的词典,数值类型生成Bkd tree。
  2. Doc Values(操作系统缓存)
    当Doc Values占用的内存小于可用内存时,会加载到内存中,否则会放到page cache中。

Elasticsearch内存

  1. 基本的元数据(堆内存)
    包括node的元数据和Cluster的元数据,还有内部的一些其他服务,比如线程池,线程队列等等。

  2. field data cache(堆内存)
    用于对分词字段进行排序或聚合。使用过程中会将所有字段的值加载到内存中,而且构建缓存的代价很高。在正常使用的过程中,不建议使用这个字段进行聚合或者排序,错误的使用很容易造成OOM。
    请注意,默认的_id这个字段就是text,对他进行排序时会使用fielddata cache

  3. Node Query Cache(堆内存)
    每个节点的查询缓存,以段为基本单元,详情查看我的另外一篇文章

  4. Shard Request Cache(堆内存)
    Shard级别的缓存。主要用于缓存size=0的请求,aggs和suggestions,还有就是hits.total。

  5. Indexing Buffer(堆内存)
    用于缓存新索引的数据,当空间填满之后,会将数据写到磁盘上成为一个新的段。

  6. 聚合操作(堆内存)
    聚合会根据需求构建不同的bucket,对单个字段进行聚合可能产生固定数量的bucket,但是某些场景下,比如深层嵌套聚合,或者单个字段不同值过多,都有可能导致生成大量的bucket而OOM。具体可参考

你可能感兴趣的:(Elasticsearch内存)