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

时间:2018-06-20 22:20:40

标签: linux caching filesystems

我有一些大文件,可以通过磁盘I / O容量读取它们。我希望免费为其他文件提供文件系统缓存。 是否可以为Linux中的特定文件打开文件系统缓存?

2 个答案:

答案 0 :(得分:1)

您的问题暗示您可能不是您想要控制的程序的作者...如果是这样,答案是“不容易”。如果您正在寻找仅在其中标记(例如通过扩展属性)的特定文件集“ nocache”,则答案是否定的。充其量,您仅限于在程序周围使用LD_PRELOAD包装器,并且必须仔细编写包装器,以免影响程序尝试打开的所有文件等。

如果您是该程序的作者,则应该使用fadvise(如果您使用的是madvise,则应使用等效的mmap),因为在阅读完本书后,数据,您可以向内核暗示它应该使用FADV_DONTNEED参数(why not use FADV_NOREUSE? Because with Linux kernels available at the time of writing it's a no-op)丢弃缓存的片段。

如果您是作者,另一种技巧是打开带有O_DIRECT标志的文件,但是除非您真的知道自己在做什么,否则我不建议您这样做。 O_DIRECT带有大量使用限制和使用条件(人们常常在为时已晚之前才注意到或理解其影响):

  • 您必须以磁盘块大小的倍数进行I / O(不小于512字节,但通常为4KB,也可以是其他更大的倍数),并且只能使用类似对齐的偏移量。
  • 程序的缓冲区必须符合对齐规则。
  • 文件系统可以选择不支持O_DIRECT,因此您的程序必须处理该问题。
  • 文件系统可能只是选择将您的I / O放在页面缓存中(O_DIRECT是“尽力而为”的提示)。

NB:根本不允许使用缓存(即甚至在初次读取时也不能使用)可能导致以远低于磁盘可达到的速度读取文件。

答案 1 :(得分:0)

我认为您可以通过使用O_DIRECT的开放系统调用来执行此操作,以处理您不想在内核的页面缓存中缓存文件的文件。

打开的手册中O_DIRECT标志的含义如下:

GET _myindex/_search
{
  "query": {
    "term": {
      "email": "example.elastic@yahoo.com"
    }
  }
}