Linux 中是否可以禁用特定文件的文件系统缓存?

Linux 中是否可以禁用特定文件的文件系统缓存?

我有一些大文件,我同意以磁盘 I/O 容量读取它们。我希望为其他文件提供免费的文件系统缓存。是否可以在 Linux 上关闭特定文件的文件系统缓存?我希望通过本机 lib + java 以编程方式执行此操作。

答案1

您可以对文件的打开实例执行此操作,但不能对文件本身持续执行此操作。您可以使用直接 IO 对打开的文件的每个实例执行此操作。我不确定如何在 Java 中执行此操作,但在 C 和 C++ 中,您可以将标志传递O_DIRECTopen()调用。

但请注意,这会带来一些潜在的问题,即:

  • 这在某些文件系统上是非常危险的。最值得注意的是,当前版本的 BTRFS 在写入文件时存在直接 IO 的严重问题。
  • 除非使用某种形式的同步,否则不能将直接 IO 与常规缓存 I/O 混合。在调用fsync()或之前,对于某些直接 IO 读取,缓存写入不会显示fdatasync(),并且对于缓存 IO 读取,直接 IO 写入可能不会显示曾经

但是,如果您可以容忍将数据暂时保留在缓存中,则还有另一种方法。您可以使用 POSIX fadvise 接口(通过posix_fadviseLinux 上的系统调用)告诉内核在读取完文件后不需要文件中的数据。通过使用该POSIX_FADV_DONTNEED标志,您可以告诉内核从缓存中删除特定文件的特定区域。实际上,您也可以在处理文件时执行此操作(通过读取一个块,然后在读取后立即调用posix_fadvise文件的该区域),尽管您调用的区域必须与系统的页面大小对齐。这通常是处理事物的首选便携式方法,因为它可以在任何具有实时扩展的 POSIX 兼容系统(几乎是任何 POSIX 兼容系统)上运行。

答案2

您正在寻找 Java 中O_DIRECTopen(2).看http://man7.org/linux/man-pages/man2/open.2.html

相关内容