2014-10-29 111 views
4

A recent blog post on Elasticsearch网站正在谈论他们新的1.4 beta版本的功能。如何在Java或Python中使用文件系统缓存?

我对他们如何利用文件系统缓存的很好奇:

最近发布加入了对DOC值的支持。基本上,doc值提供的功能与内存中的fielddata相同,但是它们在索引时刻写入磁盘。他们提供的好处是它们消耗的堆空间非常少。 Doc值是从磁盘读取的,而不是从内存读取。虽然磁盘访问速度慢,但文档值受益于内核的文件系统缓存。与JVM堆不同,文件系统缓存不受32GB限制的限制。通过将字段数据从堆转移到文件系统缓存,您可以使用更小的堆,这意味着更快的垃圾回收以及更稳定的节点。

在此版本之前,doc值显着低于内存中的fielddata。 此版本中的更改显着改善了性能,使它们几乎与内存中的fielddata一样快。

这是否意味着我们可以操纵文件系统缓存的行为,而不是等待来自操作系统的效果被动?如果是这样的话,我们如何在正常的应用开发中利用文件系统缓存呢?假如我正在编写一个Python或Java程序,我该怎么做?

+0

我相信这是ES内部的东西。 “操纵文件系统缓存的行为”是什么意思?你想用它做什么? – 2014-10-29 09:55:42

+0

http://blog.thetaphi.de/2012/07/use-lucenes-mmapdirectory-on-64bit.html – 2014-10-30 07:05:31

+0

@AndreiStefan您提供的博客文章是关于Lucene(或ES?)如何使用文件系统缓存的极好参考。你想突出那篇文章中的一些关键点并作为答案吗?我会接受:) – shihpeng 2014-10-30 15:15:23

回答

2

文件系统的高速缓存是一个实现细节有关OS内部工作是透明的最终用户。这不是需要调整或改变的事情。 Lucene在管理索引段时已经使用了文件系统缓存。每次将某些内容编入Lucene(通过Elasticsearch)时,这些文档都会写入到段中,这些段首先写入文件系统缓存,然后在一段时间后(当超时记录 - 一种跟踪索引文件的方式)是完整例如)缓存的内容被写入实际的文件。但是,虽然要编入索引的文档位于文件系统缓存中,但仍可以访问它们。

doc值实现的这种改进将此功能称为现在可以使用文件系统缓存,因为它们是从磁盘读取的,放入缓存并从那里访问,而不是占用堆空间。

如何这个文件系统缓存中this excellent blog post描述被访问:

在我们以前的做法,我们是依赖于使用系统调用来复制文件系统缓存和本地Java堆之间的数据。如何直接访问文件系统缓存?这是mmap的功能!

基本上MMAP确实像处理Lucene索引作为交换文件是相同的。 mmap()系统调用告诉O/S内核虚拟地将我们的整个索引文件映射到前面描述的虚拟地址空间,并使它们看起来像我们的Lucene进程可用的RAM。然后我们就可以访问我们的磁盘索引文件,就像它是一个大的byte []数组(在Java中,这是由ByteBuffer接口封装的,以便Java代码可以安全地使用它)。如果我们从Lucene代码访问这个虚拟地址空间,我们不需要做任何系统调用,处理器的MMU和TLB将为我们处理所有映射。如果数据只在磁盘上,则MMU将引起中断,O/S内核会将数据加载到文件系统缓存中。如果它已经在缓存中,则MMU/TLB将其直接映射到文件系统缓存中的物理内存。

有关在Java程序中使用mmap的实际方法,我认为this is the class and method to do so

相关问题