直写RAM磁盘,或文件系统的大规模缓存?

时间:2010-02-17 16:12:01

标签: linux optimization filesystems ramdisk

我有一个程序非常重视文件系统,读取和写入一组工作文件。这些文件的大小为几千兆字节,但不大到不适合RAM磁盘。这个程序运行的机器通常是Ubuntu Linux机箱。

有没有办法将文件管理器配置为具有非常大的缓存,甚至可以缓存写入,以便它们稍后到达磁盘?

或者有没有办法创建一个可以直接写入真实磁盘的RAM磁盘?

5 个答案:

答案 0 :(得分:23)

默认情况下,Linux将使用空闲RAM(几乎全部)来缓存磁盘访问,并会延迟写入。内核用来决定缓存策略的启发式方法并不完美,但在特定情况下击败它们并不容易。此外,在日志文件系统(即现在的所有默认文件系统)上,对磁盘的实际写入将以崩溃的弹性方式执行;这意味着一点开销。您可能想尝试摆弄文件系统选项。例如,对于ext3,尝试使用data=writeback或甚至async进行挂载(这些选项可以提高文件系统性能,但会降低对崩溃的恢复能力)。另外,使用noatime来减少文件系统活动。

以编程方式,您可能还希望通过内存映射(使用mmap)执行磁盘访问。这有点实际,但它可以更好地控制数据管理和优化。

答案 1 :(得分:16)

您是否检查过您的磁盘是否正在使用其内置写入缓存?它可以产生相当大的差异。在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

现代默认设置是更频繁地写,以避免huge write spikes。您可以尝试调整这些以满足您的需求。以下是excellent discussion可用参数以及如何尝试调整它们。

答案 2 :(得分:12)

您可以使用物理分区创建ramdisk和RAID-1。看看--write-mostly和--write-behind选项。您可以使用它们将物理磁盘分别设置为不读取(仅写入),并分别设置未完成的写入操作数。

或者,查看pdflush的文档。这里有一个很好的页面:http://www.westnet.com/~gsmith/content/linux-pdflush.htm(也由ire_and_curses链接) 除了提到的内容之外,您可能希望将swappiness调整为100以支持磁盘缓存而不是交换。

但是要了解它是如何工作的,并将其调整到您的特定应用程序是值得的。 Linux已针对一般情况进行了调整,只有您了解具体情况的不同之处。 :)

答案 3 :(得分:1)

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

正常情况下,Linux会愉快地使用尽可能多的ram来缓存文件一段时间,然后将更改写回来。这通常是您想要的,因此在发生崩溃时您将丢失一些但不会过多的数据。

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

为了获得更好的性能,您可以减少频繁调用fdatasync,例如牺牲持久性。

答案 4 :(得分:-4)

可能你需要基于RAM的SSD磁盘吗?