当前位置: 首页 > 面试题库 >

ElasticSearch和Lucene如何共享内存

邓深
2023-03-14
问题内容

我对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流程中运行,所以这只是流程的一部分。


问题答案:

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

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

Lucene的主要提交者有这两篇很棒的博客文章(这一篇和另一篇),它们更详细地解释了Lucene如何利用所有可用的剩余内存。

最重要的是(使用-Xmx30g)为ES进程分配了30GB的堆,然后Lucene会很乐意消耗剩下的东西来做需要做的事情。



 类似资料:
  • 通过查看shmget()的手动页面,我了解到shmget()调用在内存中分配了#个页面,这些页面可以在进程之间共享。 它是否要创建内核内存页,并将其映射到进程的本地地址空间?还是为该段保留了相同的进程内存页,并将为其他附加进程共享相同的内存页? 调用shmget()时,内核将保留一定数量的段/页。 调用shmat()时,保留的段映射到进程的地址空间/页。 当一个新进程附加到同一段时,前面创建的内核

  • 共享内存是两个或多个进程共享的内存。 但是,为什么我们需要共享内存或其他通信方式呢? 重申一下,每个进程都有自己的地址空间,如果任何进程想要将自己的地址空间的某些信息与其他进程进行通信,那么只能通过IPC(进程间通信)技术进行。 我们已经知道,通信可以在相关或不相关的进程之间进行。 通常,使用管道或命名管道来执行相互关联的进程通信。 可以使用命名管道或通过共享内存和消息队列的常用IPC技术执行无关

  • DPDK Ring DPDK Ring提供了一个FIFO无锁队列,支持丰富的队列操作,比如 Multi-consumer or single-consumer dequeue Multi-producer or single-producer enqueue Bulk dequeue - Dequeues the specified count of objects if successful;

  • EasySwoole对Swoole table进行了基础的封装。 方法列表 getInstance() 该方法用于获取TableManager管理器实例 add($name,array $columns,$size = 1024) 该方法用于创建一个table get($name):?Table 该方法用于获取已经创建好的table 示例代码 TableManager::getInstance()

  • shmat是shared memory attach的缩写。而attach本意是贴的意思。 如果进程要使用一段共享内存,那么一定要将该共享内存与当前进程建立联系。即经该共享内存挂接(或称映射)到当前进程。 shmdt则是shmat的反操作,用于将共享内存和当前进程分离。在共享内存使用完毕后都要调用该函数。 函数原型 #include <sys/types.h> #include <sys/shm.