核心概念
- 基于Lucene
- Java应用
内存使用分析
Lucene的内存消耗
- 倒排索引。(堆内存)
Lucene中,索引是存储在磁盘中,一个索引(Index)由多个段(Segment)组成。当启动IndexSearcher时,会把倒排索引加载到内存中,基于不同的数据类型生成不同的词典,比如text生成FST结构的词典,数值类型生成Bkd tree。 - Doc Values(操作系统缓存)
当Doc Values占用的内存小于可用内存时,会加载到内存中,否则会放到page cache中。
Elasticsearch内存
- 基本的元数据(堆内存)
包括node的元数据和Cluster的元数据,还有内部的一些其他服务,比如线程池,线程队列等等。 - field data cache(堆内存)
用于对分词字段进行排序或聚合。使用过程中会将所有字段的值加载到内存中,而且构建缓存的代价很高。在正常使用的过程中,不建议使用这个字段进行聚合或者排序,错误的使用很容易造成OOM。
请注意,默认的_id这个字段就是text,对他进行排序时会使用fielddata cache - Node Query Cache(堆内存)
每个节点的查询缓存,以段为基本单元,详情查看我的另外一篇文章 - Shard Request Cache(堆内存)
Shard级别的缓存。主要用于缓存size=0的请求,aggs和suggestions,还有就是hits.total。 - Indexing Buffer(堆内存)
用于缓存新索引的数据,当空间填满之后,会将数据写到磁盘上成为一个新的段。 - 聚合操作(堆内存)
聚合会根据需求构建不同的bucket,对单个字段进行聚合可能产生固定数量的bucket,但是某些场景下,比如深层嵌套聚合,或者单个字段不同值过多,都有可能导致生成大量的bucket而OOM。具体可参考