【问题标题】:How does ElasticSearch and Lucene share the memoryElasticSearch 和 Lucene 如何共享内存
【发布时间】:2016-02-05 19:22:59
【问题描述】:

我对来自 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进程中,只是进程的一部分。

【问题讨论】:

    标签: elasticsearch lucene


    【解决方案1】:

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

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

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

    底线是为 ES 进程分配 30GB 堆(使用 -Xmx30g),然后 Lucene 将愉快地使用剩下的任何东西来做需要做的事情。

    【讨论】:

      【解决方案2】:

      Lucene 通过操作系统使用堆外内存。它在 Elasticsearch 指南中关于 Heap sizing and swapping 的部分中进行了描述。

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

      【讨论】:

        猜你喜欢
        • 2014-03-22
        • 2017-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-08
        • 2014-04-20
        • 2013-02-14
        • 2011-02-10
        相关资源
        最近更新 更多