【问题标题】:How to make use of the filesystem cache in Java or Python?如何在 Java 或 Python 中使用文件系统缓存?
【发布时间】:2014-12-24 16:36:50
【问题描述】:

recent blog post on Elasticsearch 网站正在谈论他们新的 1.4 测试版的功能。

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

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

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

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

【问题讨论】:

  • 我相信这是 ES 内部的东西。 “操纵文件系统缓存的行为”是什么意思?你想用它做什么?
  • @AndreiStefan 您提供的博客文章是关于 Lucene(或 ES?)如何使用文件系统缓存的绝佳参考。您想强调该文章中的一些关键点并作为答案发布吗?我会接受:)

标签: java python performance caching elasticsearch


【解决方案1】:

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

文档值实现的这种改进指的是这个特性现在能够使用文件系统缓存,因为它们是从磁盘读取、放入缓存并从那里访问的,而不是占用堆空间。

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

【讨论】:

    猜你喜欢
    • 2010-11-30
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 2017-11-23
    • 2017-12-25
    相关资源
    最近更新 更多