写穿式RAM磁盘,还是大规模缓存文件系统?

28

我有一个程序,它会大量访问文件系统,并读写一组工作文件。这些文件的大小为数十亿字节,但不太大而无法放在RAM磁盘上。这个程序通常在运行Ubuntu Linux操作系统的计算机上。

是否有一种方法可以配置文件管理器以具有非常大的缓存,并且甚至可以缓存写操作,以便稍后将其传输到磁盘上?

或者是否有一种方式可以创建一个RAM磁盘,并使其通过实际磁盘进行写入?


2
最好在SuperUser上询问这个问题。 - extraneon
保持简单:在/dev/shm中工作,并定期将副本复制到永久存储。 - Joachim Wagner
4个回答

25

默认情况下,Linux会使用空闲的内存(几乎全部)来缓存磁盘访问,并延迟写入。内核用于决定缓存策略的启发式算法并不完美,但在特定情况下打败它们并不容易。此外,在日志文件系统上(即现在所有默认的文件系统),实际写入磁盘的方式具有抗崩溃的韧性,这意味着会有一些额外开销。您可能希望尝试调整文件系统选项。例如,对于 ext3 ,尝试使用 data = writeback 甚至 async 进行挂载(这些选项可能会提高文件系统性能,但付出的代价是降低了防崩溃的能力)。另外,使用 noatime 可以减少文件系统活动。

在编程方面,您可能还希望通过内存映射(使用mmap)执行磁盘访问。这需要自己操作,但它可以更好地控制数据管理和优化。


3
针对这种情况,在挂载相关的文件系统时加上noatime选项是明智的建议。 - caf
2
vmtouch非常有用,如果您确实想强制内核保持缓存(就像我目前所做的那样)。 - Mark K Cowan
哇,vmtouch很酷,感谢你的推荐。 - lahwran

17

检查磁盘是否正在使用其内置写入缓存,它可以产生相当大的差异。在Linux上,您可以使用hdparm来切换行为:

/sbin/hdparm -W 0 /dev/hda 0 Disable write caching
/sbin/hdparm -W 1 /dev/hda 1 Enable write caching

显然,如果启用写缓存,则在系统非正常关闭(例如,断电)时存在数据丢失或损坏的风险。
就软件而言,Linux内核使用两个主要数字来参数化写入行为。
/proc/sys/vm/dirty_ratio
/proc/sys/vm/dirty_background_ratio

现代默认设置是更频繁地写入,以避免 巨大的写入峰值。您可以尝试调整这些设置以适应您的需求。这里有一个优秀的讨论,介绍了可用参数以及如何尝试进行调整。

12
你可以创建一个RAM磁盘,将其与物理分区RAID 1。查看--write-mostly--write-behind选项。你可以使用它们来使物理磁盘成为只写不读的磁盘,并分别设置未完成写操作的数量。
另外,请查看pdflush的文档。除了ire_and_curses提到的内容之外,您可能希望将swappiness增加到100,以优先考虑磁盘缓存而非交换空间。
但学习如何让它起作用并针对您的特定应用进行调整是值得的。Linux已经为一般情况进行了调整,只有您知道您的具体情况与众不同。 :)

3
Dannysauer 是 mdadm 命令中 --write-mostly--write-behind 选项的名称。 - mabraham
考虑到Linux软件RAID-1在正常关闭时不会等待所有数据在写后设备上复制。它只是在写位图中标记需要同步的区域,并计划在系统再次启动时继续复制数据。然而,当系统重新启动时,主RAID设备已经丢失或被替换为新的RAM磁盘。这将导致数据丢失。 - Joachim Wagner
1
自内核3.6版本开始,pdflush已经消失。 - William Price

2

这里的问题实际上是你需要多少耐久性?

通常情况下,Linux会愉快地使用尽可能多的RAM来缓存文件,然后再写入更改。这通常是你想要的,因此在崩溃事件中你会失去一些但不会太多的数据。

当然,应用程序可以通过(例如)fdatasync()和fsync()强制写回。

为了获得更好的性能,您可以较少调用fdatasync,从而牺牲耐久性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接