我对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过程中运行,它只是整个过程的一部分。
答案 0 :(得分:9)
Xmx
参数只表示您为ES Java进程分配了多少堆。但是,将RAM分配给堆并不是使用服务器上可用内存的唯一方法。
Lucene确实在ES进程中运行,但Lucene不仅使用已分配的堆,还通过大量利用文件系统缓存来管理索引段文件来使用内存。
Lucene的主要提交者有两篇很棒的博客文章(this one和this other one),详细解释了Lucene如何利用所有可用的剩余内存。
底线是为ES进程分配30GB堆(使用-Xmx30g
),然后Lucene将很乐意消耗任何剩下的东西来完成需要做的事情。
答案 1 :(得分:3)
Lucene通过操作系统使用 off heap 内存。有关Heap sizing and swapping。
的部分中的Elasticsearch指南中对此进行了描述Lucene旨在利用底层操作系统缓存内存中的数据结构。 Lucene段存储在单个文件中。因为段是不可变的,所以这些文件永远不会改变。这使得它们非常友好,并且底层操作系统将很乐意将热段保留在内存中以便更快地访问。