嘿~ 今天天气不错嘛

elasticsearch对于内存使用的一个小疑惑

匿名 | 发布于2017年12月28日 | 阅读数:5444

不太理解elasticsearch 利用操作系统缓存,是利用的哪部分空间
 文档中经常看到这样的描述
https://www.elastic.co/guide/c ... .html
 
例如这里提到的:
在Elasticsearch和磁盘之间是文件系统缓存。 像之前描述的一样, 在内存索引缓冲区( 图 19 “在内存缓冲区中包含了新文档的 Lucene 索引” )中的文档会被写入到一个新的段中( 图 20 “缓冲区的内容已经被写入一个可被搜索的段中,但还没有进行提交” )。 但是这里新段会被先写入到文件系统缓存--这一步代价会比较低,稍后再被刷新到磁盘--这一步代价比较高。不过只要文件已经在缓存中, 就可以像其它文件一样被打开和读取了。
 
还有文章经常指出,elasticsearch 要预留一半的内存空间,es会充分利用操作系统缓存。
 
但是缓存指的不是cpu里面的一级二级三级缓存么?上述提到的文件系统缓存肯定不是它,应该就是内存吧,只不过不在JVM中管理,属于非堆? 类似使用ByteBuffer.allocDirect 吗?
 
已邀请:

kennywu76 - Wood

赞同来自: code4j kurisu 白衬衣

首先,linux会将剩余的物理内存做为page cache,普通的文件读写操作会经过这个cache。普通的文件读写操作都可能因为命中cache,节省了磁盘IO,性能因为得到提高。其次,ES从5.0以后,对于索引文件的读写默认采用的是memory mapped file的方式,也就是java里的MappedByteBuffer。 索引文件先被映射到虚拟内存地址空间,但只有被读写的块会被os装载到Heap外部的可用物理内存。所以足够的堆外可用物理内存,对于提升ES的IO效率是很有帮助的。

要回复问题请先登录注册