如何在Java或Python中利用文件系统缓存?

5

Elasticsearch最近的一篇博客文章介绍了他们新的1.4 beta版本的功能。

我非常好奇他们如何利用文件系统缓存:

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

在此版本之前,文档值比内存字段数据慢得多。此版本中的更改显着提高了性能,使它们几乎与内存字段数据一样快。

这是否意味着我们可以主动操纵文件系统缓存的行为,而不是被动地等待操作系统生效?如果是这样,我们如何在普通应用程序开发中利用文件系统缓存?例如,如果我正在编写Python或Java程序,该怎么做?

我相信这是ES内部的事情。你所说的“操纵文件系统缓存的行为”是什么意思?你想用它做什么? - Andrei Stefan
http://blog.thetaphi.de/2012/07/use-lucenes-mmapdirectory-on-64bit.html - Andrei Stefan
@AndreiStefan,你提供的博客文章是关于Lucene(或ES?)如何使用文件系统缓存的优秀参考。你是否想要在回答中强调一些关键点并发布呢?我会接受的 :) - shihpeng
1个回答

5
文件系统缓存是与操作系统内部工作相关的实现细节,对最终用户透明。它不需要调整或更改。Lucene在管理索引段时已经使用了文件系统缓存。每次通过Elasticsearch将内容索引到Lucene中时,这些文档都会被写入段,首先写入文件系统缓存,然后在一段时间后(例如当translog(用于跟踪正在索引的文档的方法)已满)将缓存的内容写入实际文件。但是,在待索引的文档位于文件系统缓存中时,仍然可以访问它们。
doc values实现中的这个改进指的是现在能够使用文件系统缓存,因为它们从磁盘读取,放入缓存并从那里访问,而不是占用堆空间。
如何访问此文件系统缓存在这篇优秀的博客文章中有所描述:
在我们以前的方法中,我们依赖使用系统调用将数据在文件系统缓存和我们本地的Java堆之间复制。直接访问文件系统缓存怎么样?这就是mmap所做的!
基本上,mmap与将Lucene索引处理为交换文件相同。mmap()系统调用告诉操作系统内核将我们的整个索引文件虚拟映射到先前描述的虚拟地址空间中,并使它们看起来像是可供Lucene进程使用的RAM。然后,我们可以像访问大型byte[]数组一样从磁盘访问我们的索引文件(在Java中,这由ByteBuffer接口封装,以使其对Java代码的使用安全)。如果我们从Lucene代码访问此虚拟地址空间,则无需执行任何系统调用,处理器的MMU和TLB会为我们处理所有映射。如果数据仅位于磁盘上,则MMU将导致中断,操作系统内核将加载数据到文件系统缓存中。如果它已经在缓存中,则MMU/TLB将直接将其映射到文件系统缓存中的物理内存。
与在Java程序中使用mmap的实际方法相关的是,我认为这是要这样做的类和方法

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接