如何禁用 Linux 页面缓存

如何禁用 Linux 页面缓存

Linux 内核实现页缓存来加速 I/O 操作。

能够关闭和打开页面缓存以进行研究和测试将很有帮助。

如何禁用 Linux 页面缓存?

更新1:如果无法全局关闭页面缓存,则可以以直写模式挂载 Linux 文件系统。如果我理解正确的话,EXT2、EXT4和XFS的挂载选项dax确实实现了直写模式。这是避免页面缓存的有效选项(至少对于文件系统而言)吗?

https://www.kernel.org/doc/Documentation/filesystems/dax.txt

更新2:显然,DAX 或多或少已经死了,并且页面缓存无法很好地关闭(全局地,根本不能关闭,并且对于单个应用程序只能以有限的方式关闭)。但是真的没有办法将Linux 文件系统(例如,通过mount 参数)设置为直写模式吗?

更新3:该工具dd是允许通过 轻松绕过 Linux 内核页面缓存的应用示例之一oflag=direct

https://man7.org/linux/man-pages/man1/dd.1.html

更新4:显然,使用 FUSE(用户空间中的文件系统)模块的文件系统可以在直接 io 模式下使用,其中页面缓存的读写完全绕过。

https://www.kernel.org/doc/Documentation/filesystems/fuse-io.txt

更新5:挂载选项-o sync实现直写模式并绕过某些文件系统(ext2、ext3、FAT、VFAT、UFS)的页面缓存

https://linux.die.net/man/8/mount

答案1

即使暂时禁用页面缓存也是不可能的。

然而,一个特定的应用程序确实可以通过以下方式尽力绕过缓存:打开_ing 文件设置了 O_DIRECT 标志:

   O_DIRECT (since Linux 2.4.10)
          Try to minimize cache effects of the I/O to and from this
          file…
          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 necessary
          metadata are transferred.  To guarantee synchronous I/O,
          O_SYNC must be used in addition to O_DIRECT.

虽然这意味着 on 必须能够重建相应修改的源代码,无缓存,它可以拦截打开和关闭系统调用,可用于启动未修改的二进制文件。
它有一些限制,当然会减慢进程并且......我从未测试过它。


一个当然可以永远清空缓存使用以下命令:

# echo 1 > /proc/sys/vm/drop_caches

答案2

我认为我们不应该尝试绕过 HDD 和 SSD 等块设备上的页面缓存。这是因为此类磁盘的粒度是堵塞(512B、4KB 或其他),但是,r/w 系统调用是在字节

不一致意味着内核需要将要写入磁盘的数据与其他构成块的数据组合起来,然后一次性写入磁盘(如果我们忽略跨块写入,那么就会是相同的)。对于读取,内核将读取包含您想要的数据的整个块,然后为您提供您需要的部分。

一旦我们理解了这种不一致,我们就可以发现页面缓存不仅仅是一个加速技巧。相反,页面缓存对于磁盘 I/O 堆栈非常重要。更准确地说,不一致是由页缓存和缓冲区头处理的,这有点复杂。

无论如何,如果你想绕过页面缓存,这里有一些提示:

  • 德国DAX指数: 如果您正在从事字节寻址设备(例如 PMEM 等),DAX 是您的最佳选择。因为设备本身可以以字节为单位进行访问,所以内核不需要担心我们上面讨论的不一致问题。在DAX模式下,文件系统将简单地绕过页面缓存并直接从设备读取/写入。请注意,DAX不能在块设备上使用!您可以参考直接访问文件更多细节。

  • O_DIRECT:您还可以打开带有 O_DIRECT 标志的文件来绕过页面缓存。这是专为在用户空间中拥有自己的高性能缓存的应用程序而设计的。但是,据我所知,你只能执行对齐对其进行操作。此外,这并不能确保返回时数据已经在磁盘上。如果没有实现任何其他缓存机制,性能可能会低得多。请参阅手册页打开(2),或者这个讨论澄清 Direct IO 的语义,或者只是尝试一下。另外,@MC68020 列出了相关部分。

此外,如果您只是想在不受页面缓存影响的情况下评估文件系统的性能,您可以尝试以下方法:

  • 同步: 这个是为了。打开文件O_SYNC,那么每次写入只有当数据在磁盘上时才会返回。打开(2)O_SYNC 下的写入性能将接近页面缓存“禁用”的情况(尽管存在一些额外的开销,例如将数据复制到页面缓存,但主要成本将是磁盘 I/O)。

  • 删除缓存: 这个是为了。正如@MC68020所说,您可以在执行某些操作之前删除系统缓存。这为您提供了一个空白页缓存,因此当您读取某些内容时,文件系统将从磁盘中获取它。该命令类似于:echo 1 > /proc/sys/vm/drop_cachessysctl -w vm.drop_caches=1。在这里检查一下/proc/sys/虚拟机,在其中搜索“drop_cache”。缺陷是对于一个位置的读取只会第一次转向磁盘。下次它将在页面缓存中。

希望这些会有所帮助:)

相关内容