Linux - 是否可以创建内存文件系统(ramdisk/tmpfs)来缓冲/缓存磁盘中的数据?

Linux - 是否可以创建内存文件系统(ramdisk/tmpfs)来缓冲/缓存磁盘中的数据?

我有一些代码可以处理存储在外部硬盘上的大量数据。磁盘上大约有 6.5 GiB 的数据,但只处理了几个文件而不是全部内容。

我使用 tmpfs 文件系统创建了一个 ramdisk,将磁盘内容的副本存储在内存中,以加快所需的处理时间。每次重新启动系统时,我都必须将磁盘的内容复制回此 ramdisk。

这工作正常,因为整个内容可以适合我拥有的可用内存量。

但是,当我稍后更改为不同的更大的数据集时,它可能无法工作。

这是相当低效的,因为我实际读取的数据量只有1GB左右。 (据我估计,略高于 10%。)

有没有办法在内存中创建一个 ramdisk 来缓存从该外部磁盘读取的数据?

我确信这样的事情在 Linux 上一定是可能的 - 但我不知道要搜索什么。 Ramdisks 已经是一个相当小众的话题了。

顺便说一句,我正在使用 Debian 测试,在撰写本文时,它是 Debian 10 之前的测试分支。

编辑:如果有什么区别的话,我不会写回该磁盘。

答案1

您可能想考虑使用覆盖文件系统。覆盖文件系统允许您将磁盘挂载点和 ramdisk 挂载点合并到一个堆叠文件系统(覆盖文件系统)中。

OverlayFS 采用写时复制的方式运行,因此如果您的上层在启动时是空的 ramdisk,则只有当您以写权限打开文件时,数据才会写入 ramdisk。理论上,您可以touch预先将任何想要的文件复制到 RAM 中。

不过,我应该补充一点,Linux 已经有了强大的磁盘缓存。您可能想确保您没有在这里重新发明轮子。

答案2

这并不能回答您的问题,但可能有助于解决所描述的问题。你想要

将磁盘内容的副本存储在内存中以加快所需的处理时间。

你不需要做任何事情。默认情况下会发生这种情况。

自己尝试一下:

dd if=/dev/urandom bs=1M count=1M of=test.bin # create a file of 10 GB random data
echo 3 | sudo tee /proc/sys/vm/drop_caches # drop caches
dd if=test.bin bs=1G count=1 of=/dev/null # read 1 GB of data
dd if=test.bin bs=1G count=1 of=/dev/null # read again

第一次阅读需要一段时间:

1073741824 bytes (1.1 GB, 1.0 GiB) copied, 10,43 s, 103 MB/s

第一次读取后,数据保留在内存中。随后的读取速度要快得多:

1073741824 bytes (1.1 GB, 1.0 GiB) copied, 0.320478 s, 3.4 GB/s

只要有足够的可用内存,Linux 就会很高兴地支持您的努力,将最近读取的文件内容保留在内存中。

相关内容