我有一个程序,它会大量访问文件系统,并读写一组工作文件。这些文件的大小为数十亿字节,但不太大而无法放在RAM磁盘上。这个程序通常在运行Ubuntu Linux操作系统的计算机上。
是否有一种方法可以配置文件管理器以具有非常大的缓存,并且甚至可以缓存写操作,以便稍后将其传输到磁盘上?
或者是否有一种方式可以创建一个RAM磁盘,并使其通过实际磁盘进行写入?
我有一个程序,它会大量访问文件系统,并读写一组工作文件。这些文件的大小为数十亿字节,但不太大而无法放在RAM磁盘上。这个程序通常在运行Ubuntu Linux操作系统的计算机上。
是否有一种方法可以配置文件管理器以具有非常大的缓存,并且甚至可以缓存写操作,以便稍后将其传输到磁盘上?
或者是否有一种方式可以创建一个RAM磁盘,并使其通过实际磁盘进行写入?
默认情况下,Linux会使用空闲的内存(几乎全部)来缓存磁盘访问,并延迟写入。内核用于决定缓存策略的启发式算法并不完美,但在特定情况下打败它们并不容易。此外,在日志文件系统上(即现在所有默认的文件系统),实际写入磁盘的方式具有抗崩溃的韧性,这意味着会有一些额外开销。您可能希望尝试调整文件系统选项。例如,对于 ext3
,尝试使用 data = writeback
甚至 async
进行挂载(这些选项可能会提高文件系统性能,但付出的代价是降低了防崩溃的能力)。另外,使用 noatime
可以减少文件系统活动。
在编程方面,您可能还希望通过内存映射(使用mmap
)执行磁盘访问。这需要自己操作,但它可以更好地控制数据管理和优化。
noatime
选项是明智的建议。 - cafvmtouch
非常有用,如果您确实想强制内核保持缓存(就像我目前所做的那样)。 - Mark K Cowan检查磁盘是否正在使用其内置写入缓存,它可以产生相当大的差异。在Linux上,您可以使用hdparm
来切换行为:
/sbin/hdparm -W 0 /dev/hda 0 Disable write caching
/sbin/hdparm -W 1 /dev/hda 1 Enable write caching
/proc/sys/vm/dirty_ratio
/proc/sys/vm/dirty_background_ratio
mdadm
命令中 --write-mostly
和 --write-behind
选项的名称。 - mabraham这里的问题实际上是你需要多少耐久性?
通常情况下,Linux会愉快地使用尽可能多的RAM来缓存文件,然后再写入更改。这通常是你想要的,因此在崩溃事件中你会失去一些但不会太多的数据。
当然,应用程序可以通过(例如)fdatasync()和fsync()强制写回。
为了获得更好的性能,您可以较少调用fdatasync,从而牺牲耐久性。