Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在linux中是否可以禁用特定文件的文件系统缓存?_Linux_Caching_Filesystems - Fatal编程技术网

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

在linux中是否可以禁用特定文件的文件系统缓存?,linux,caching,filesystems,Linux,Caching,Filesystems,我有一些大文件,我可以用磁盘I/O容量读取它们。我希望其他文件的文件系统缓存可用。 是否可以在linux中打开特定文件的文件系统缓存?您的问题提示您可能不是要控制的程序的作者。。。如果是这样的话,答案是“不容易”。如果您正在寻找只标记(例如通过扩展属性)一组特定文件“nocache”的内容,那么答案是否定的。充其量,您只能在程序周围使用LD_PRELOAD包装器,并且必须仔细编写包装器,以避免影响程序试图打开的所有文件等 如果您是该程序的作者,您应该考虑使用(如果您使用的是mmap),或者等效的

我有一些大文件,我可以用磁盘I/O容量读取它们。我希望其他文件的文件系统缓存可用。
是否可以在linux中打开特定文件的文件系统缓存?

您的问题提示您可能不是要控制的程序的作者。。。如果是这样的话,答案是“不容易”。如果您正在寻找只标记(例如通过扩展属性)一组特定文件“nocache”的内容,那么答案是否定的。充其量,您只能在程序周围使用
LD_PRELOAD
包装器,并且必须仔细编写包装器,以避免影响程序试图打开的所有文件等

如果您是该程序的作者,您应该考虑使用(如果您使用的是
mmap
),或者等效的
madvise
),因为在您读取完数据后,您可以向内核提示,它应该使用
FADV\u DONTNEED
参数()丢弃缓存的片段

如果您是作者,另一种方法是使用设置的标志打开文件,但我不建议这样做,除非您确实知道自己在做什么
O_DIRECT
在使用时附带了大量的使用限制和条件(人们通常在为时已晚时才注意到或理解其影响):

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

注意:完全不允许使用缓存(即,即使在初始读取时也不允许使用缓存)可能会导致文件的读取速度远远低于磁盘所能达到的速度。

我认为,对于不希望将文件缓存在内核缓存页上的文件,可以通过使用O_DIRECT的开放系统调用来实现这一点

open手册中O_直接标志的含义如下:

O_DIRECT (Since Linux 2.4.10)
          Try to minimize cache effects of the I/O to and from this file.  In general this will degrade  perfor‐
          mance,  but  it is useful in special situations, such as when applications do their own caching.  File
          I/O is done directly to/from user-space buffers.  The O_DIRECT flag on its  own  makes  an  effort  to
          transfer  data synchronously, but does not give the guarantees of the O_SYNC flag that data and neces‐
          sary metadata are transferred.  To guarantee synchronous I/O, O_SYNC  must  be  used  in  addition  to
          O_DIRECT.  See NOTES below for further discussion.

编程问题也是如此,而不是关于使用或配置Linux及其应用程序的问题。我希望以编程的方式来做这件事,但在Unix&Linux或SuperUsers上发布这篇文章是有意义的。这类似于。