ElasticSearch和Lucene如何共享内存

时间:2016-02-05 19:22:59

标签: elasticsearch lucene

我对ES官方文档中的以下配额提出了一个问题:

But if you give all available memory to Elasticsearch’s heap, 
there won’t be any left over for Lucene. 
This can seriously impact the performance of full-text search.

如果我的服务器有80G内存,我发出以下命令来启动ES节点:bin/elasticsearch -xmx 30g 这意味着我只给出了最大ES 30g内存的过程。 Lucene如何使用左侧50G,因为Lucene在ES过程中运行,它只是整个过程的一部分。

2 个答案:

答案 0 :(得分:9)

Xmx参数只表示您为ES Java进程分配了多少。但是,将RAM分配给堆并不是使用服务器上可用内存的唯一方法。

Lucene确实在ES进程中运行,但Lucene不仅使用已分配的堆,还通过大量利用文件系统缓存来管理索引段文件来使用内存。

Lucene的主要提交者有两篇很棒的博客文章(this onethis other one),详细解释了Lucene如何利用所有可用的剩余内存。

底线是为ES进程分配30GB堆(使用-Xmx30g),然后Lucene将很乐意消耗任何剩下的东西来完成需要做的事情。

答案 1 :(得分:3)

Lucene通过操作系统使用 off heap 内存。有关Heap sizing and swapping

的部分中的Elasticsearch指南中对此进行了描述
  

Lucene旨在利用底层操作系统缓存内存中的数据结构。 Lucene段存储在单个文件中。因为段是不可变的,所以这些文件永远不会改变。这使得它们非常友好,并且底层操作系统将很乐意将热段保留在内存中以便更快地访问。